【问题标题】:Why these two MPI-IO code are not working the same way?为什么这两个 MPI-IO 代码的工作方式不同?
【发布时间】:2015-10-27 11:15:11
【问题描述】:

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

【问题讨论】:

    标签: fortran mpi mpi-io


    【解决方案1】:

    您的错误实际上不在num 的规范或使用中,而是在offset 的规范中。

    如果您阅读MPI_File_write_atman-page,则必须将偏移量指定为MPI_Offset 类型。

    所以如果你改变你的程序来使用:

    integer(kind=MPI_OFFSET_KIND) :: offset
    

    效果很好。

    您没有注意到生成的 test.dat 文件的大小吗?

    【讨论】:

    • 但它是用非人类可读的语言编写 test.dat 吗?似乎是二进制的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2012-09-21
    • 2010-10-06
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多