-
Notifications
You must be signed in to change notification settings - Fork 925
Closed
Description
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