Почему эти два кода MPI-IO не работают одинаково?
Я изучаю MPI-IO и следую учебному пособию (скачать PDF здесь).
Для одного упражнения правильный код:
Program MPI_IOTEST
Use MPI
Implicit None
Integer :: wsize,wrank
Integer :: ierror
Integer :: fh,offset
Call MPI_Init(ierror)
Call MPI_Comm_rank(MPI_COMM_WORLD,wrank,ierror)
Call MPI_Comm_size(MPI_COMM_WORLD,wsize,ierror)
offset=4*wrank; ! because 4 bytes is one signed int
! --- open the MPI files using a collective call
Call MPI_File_Open(MPI_COMM_WORLD,'test.dat',MPI_MODE_RDWR+MPI_MODE_CREATE,MPI_INFO_NULL,fh,ierror);
Write(*,*)'rank',wrank
Call MPI_FILE_WRITE_AT(fh, offset, wrank,1,MPI_INTEGER,mpi_status_ignore,ierror);
Call MPI_File_close(fh,ierror)
Call MPI_Finalize(ierror)
End Program MPI_IOTEST
Затем вы просто создаете и запускаете его как 24 задачи MPI. Затем для проверки просто выполните od -i test/dat. Вы получите точно такой же результат в учебнике, который приведен ниже.
0000000 0 1 2 3
0000020 4 5 6 7
0000040 8 9 10 11
0000060 12 13 14 15
0000100 16 17 18 19
0000120 20 21 22 23
0000140
Но если я изменю 1 на num:
Call MPI_FILE_WRITE_AT(fh, offset, wrank,1,MPI_INTEGER,mpi_status_ignore,ierror);
в
Call MPI_FILE_WRITE_AT(fh, offset, wrank,num,MPI_INTEGER,mpi_status_ignore,ierror);
и до этого определим
integer :: num
num=1
После rm test.dat, затем пересоберите файл и запустите его, вы получите:
0000000 0 0 0 0
*
1 ответ
Ваша ошибка на самом деле не в спецификации или использовании num
а скорее в спецификации offset
,
Если вы читаете man-страницу MPI_File_write_at
, вы должны указать смещение как MPI_Offset вид.
Так что если вы измените свою программу на использование:
integer(kind=MPI_OFFSET_KIND) :: offset
Работает нормально.
Вы не заметили размер сгенерированного файла test.dat?