fortran - 为什么这两个 MPI-IO 代码的工作方式不同?

标签 fortran mpi mpi-io

我正在学习 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/

相关文章:

c++ - 使用 C++ 代码从 FORTRAN DLL 调用函数

fortran - 嵌套循环的 OpenMP SIMD 矢量化

python - mpi4py 的 MPI 数据传输错误

c - 什么会使 MPI_File_write_all 因浮点异常而失败?

c - MPI_File_read_at 逐行读取

io - 如何获取充当标准输入/标准输出的文件的名称?

fortran - 作为派生数据类型的组件的命名常量

c - 最大消息长度 MPI_Type_vector 和 MPI_Gather

profiling - 如何用 C 分析 openMPI 程序的内存使用情况和性能

c - 尝试读取大文件时 MPI_File_read_at_all 给出无效的计数参数