我正在学习 MPI-IO 并遵循教程 (PDF download here) .
对于一个练习,正确的代码是:
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 测试/数据 您将得到与下面给出的教程完全相同的结果。
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
*
最佳答案
您的错误实际上并不在于 num
的规范或使用,而是在于 offset
的规范。
如果您阅读 man-page对于 MPI_File_write_at
,您必须将偏移量指定为 MPI_Offset 类型。
因此,如果您更改程序以使用:
integer(kind=MPI_OFFSET_KIND) :: offset
效果很好。
您没有注意到生成的 test.dat 文件的大小吗?
关于fortran - 为什么这两个 MPI-IO 代码的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31819628/