Skip to content

Subarray type creation broken for 3D arrays #1191

@keithbennett

Description

@keithbennett

As of version 1.10.1, the creation of 3d subarrays no longer works. It was working without issue in 1.10.0. The following fortran code illustrates the problem. It should be run using 4 processes.

PROGRAM test_subarray

  USE mpi
  IMPLICIT NONE

  INTEGER :: ierror, rank, nproc, fileview, filehandle, j, k
  INTEGER, PARAMETER :: ndims = 3, nn = 2
  INTEGER, PARAMETER :: nblocks(ndims) = (/1, 2, 2/)
  INTEGER, DIMENSION(ndims) :: sizes, subsizes, starts
  INTEGER, DIMENSION(nn,nn,nn) :: array
  INTEGER, DIMENSION(nn,2*nn,2*nn) :: big_array_expected, big_array
  INTEGER(KIND=MPI_OFFSET_KIND) :: disp

  CALL MPI_INIT(ierror)
  CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
  CALL MPI_COMM_SIZE(MPI_COMM_WORLD, nproc, ierror)

  IF (nproc /= 4 .AND. rank == 0) THEN
    PRINT*, 'ERROR: This test case must be run with 4 processes'
    CALL MPI_ABORT(MPI_COMM_WORLD, -1, ierror)
  ENDIF

  array = rank

  sizes = nblocks * nn
  subsizes = nn
  starts(1) = 0
  starts(2) = MOD(rank, 2) * nn
  starts(3) = (rank / 2) * nn

  CALL MPI_TYPE_CREATE_SUBARRAY(ndims, sizes, subsizes, starts, &
      MPI_ORDER_FORTRAN, MPI_INTEGER, fileview, ierror)
  CALL MPI_TYPE_COMMIT(fileview, ierror)

  CALL MPI_FILE_OPEN(MPI_COMM_WORLD, 'test.dat', &
      MPI_MODE_CREATE + MPI_MODE_RDWR, MPI_INFO_NULL, filehandle, ierror)

  disp = 0
  CALL MPI_FILE_SET_VIEW(filehandle, disp, MPI_INTEGER, fileview, 'native', &
      MPI_INFO_NULL, ierror)
  CALL MPI_FILE_WRITE_ALL(filehandle, array, SIZE(array), MPI_INTEGER, &
      MPI_STATUS_IGNORE, ierror)

  CALL MPI_FILE_SET_VIEW(filehandle, disp, MPI_BYTE, MPI_BYTE, 'native', &
      MPI_INFO_NULL, ierror)

  IF (rank == 0) THEN
    big_array_expected(:,1:nn,1:nn) = 0
    big_array_expected(:,nn+1:2*nn,1:nn) = 1
    big_array_expected(:,1:nn,nn+1:2*nn) = 2
    big_array_expected(:,nn+1:2*nn,nn+1:2*nn) = 3

    big_array = -1

    CALL MPI_FILE_READ(filehandle, big_array, SIZE(big_array), &
        MPI_INTEGER, MPI_STATUS_IGNORE, ierror)

    PRINT*, 'The test has failed if any value is non-zero'
    DO k = 1, SIZE(big_array,3)
      PRINT'(99i4)', big_array(:,:,k) - big_array_expected(:,:,k)
    ENDDO
    IF (ALL(big_array == big_array_expected)) THEN
      PRINT*, 'SUCCESS!'
    ELSE
      PRINT*, 'FAILED!'
    ENDIF
  ENDIF

  CALL MPI_FILE_CLOSE(filehandle, ierror)
  CALL MPI_FINALIZE(ierror)

END PROGRAM test_subarray

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions