我是MPI和并行计算的新手。我在Fortran中编写了简单的MPI程序。但问题是MPI_FILE_READ_AT
忽略并且不读取文件。
我的代码是:
program O72
use mpi
!implicit none
INTEGER :: NINTS, DATATYPE, STATUS(MPI_STATUS_SIZE), mpierr, FH, i
integer :: taskid, no_tasks, FILESIZE, FILENO_2
INTEGER(KIND=MPI_OFFSET_KIND) :: OFFSET
INTEGER :: BUF(10)
character :: filename='ab.dat'
FILESIZE=10
BUF(:)=0
call MPI_INIT(mpierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,no_tasks,mpierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,taskid,mpierr)
NINTS = FILESIZE/no_tasks !*INTSIZE)
OFFSET= taskid*NINTS !*INTSIZE
call MPI_File_open(MPI_COMM_WORLD, "ab.dat", MPI_MODE_RDONLY, &
MPI_INFO_NULL, FH, mpierr)
call MPI_FILE_READ_AT(FH, OFFSET, BUF, NINTS, MPI_INT, STATUS, mpierr)
write(6,*) taskid, no_tasks
call MPI_BARRIER(MPI_COMM_WORLD, mpierr)
write(6,*) 'taskid=',taskid,'NINTS=', NINTS
write(6,*) 'taskid_',taskid,'OFFSET=',OFFSET
write(6,*) BUF(:)
!call MPI_FILE_WRITE(FILENO_2, OFFSET, BUF, NINTS, DATATYPE, STATUS, mpierr)
call MPI_FILE_CLOSE(FH, mpierr)
!call MPI_FILE_CLOSE(FILENO_2)
call MPI_FINALIZE(mpierr)
end
然后,输入文件是一个包含2列的ASCII文件,其中第1列始终为1,第2列始终为2。
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
输出就像这样,使用了2个处理器:
0 2
1 2
taskid= 1 NINTS= 5
taskid_ 1 OFFSET= 5
taskid= 0 NINTS= 5
taskid_ 0 OFFSET= 0
171051313 171051313 171051313 171051313 171051313 0 0 0 0 0
822751753 822751753 822751753 822751753 822751753 0 0 0 0 0
我不明白问题出在哪里以及为什么将随机值分配给BUF(:)
你能帮我吗?
答案 0 :(得分:0)
我想简单的答案是MPI-IO只执行二进制 IO,而你在这里尝试实现的是格式化 IO。
从这里开始,您会发现代码中存在一些问题:
offset
中要使用的MPI_File_read_at()
以字节为单位。你传递的是许多元素。因此,您需要将此偏移量乘以您想要读取的大小,即integer
的大小。buf
的整数,这是一个10 integer
的数组,而您只读了nints
个buf(1:nints)
。您可能只应打印python
。这样,您的代码就可以运行。