Io MPI文件读取忽略文件(不读取文件)
我是MPI和并行计算的新手。我用Fortran编写了简单的MPI程序。但问题是处的Io MPI文件读取忽略文件(不读取文件),io,parallel-processing,mpi,Io,Parallel Processing,Mpi,我是MPI和并行计算的新手。我用Fortran编写了简单的MPI程序。但问题是处的MPI\u FILE\u READ\u忽略并不读取该文件 我的代码是: program O72 use mpi !implicit none INTEGER :: NINTS, DATATYPE, STATUS(MPI_STATUS_SIZE), mpierr, FH, i integer :: taskid, no_tasks, FILESIZE, FILENO_2 INTEGER(KIN
MPI\u FILE\u READ\u忽略并不读取该文件
我的代码是:
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
然后,输入文件是一个包含两列的ASCII文件,其中第一列始终为1,第二列始终为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(:)
你能帮帮我吗?我想简单的答案是MPI-IO只执行二进制操作系统,而你在这里尝试实现的是格式化操作系统
从这里开始,您会发现代码中存在一些问题:
您的文件已格式化。正如我在序言中所说,MPI-IO只执行二进制IO,因此您必须切换到二进制输入文件,或者将文件作为一组字符串读取,您必须在内部理解这些字符串。让我们假设在本文的其余部分中,您的输入文件现在是二进制的
在MPI\u File\u read\u at()
中使用的偏移量应以字节为单位。您传递的是许多元素。因此,您需要将该偏移量乘以您想要读取的内容的大小,即整数的大小
最后,打印完整的buf
,这是一个10integer
的数组,而您只读取其中的nint
。您可能应该只打印buf(1:nints)
有了这一点,您的代码应该可以正常工作。我想简单的答案是MPI-IO只执行二进制操作,而您在这里尝试实现的是格式化操作
从这里开始,您会发现代码中存在一些问题:
您的文件已格式化。正如我在序言中所说,MPI-IO只执行二进制IO,因此您必须切换到二进制输入文件,或者将文件作为一组字符串读取,您必须在内部理解这些字符串。让我们假设在本文的其余部分中,您的输入文件现在是二进制的
在MPI\u File\u read\u at()
中使用的偏移量应以字节为单位。您传递的是许多元素。因此,您需要将该偏移量乘以您想要读取的内容的大小,即整数的大小
最后,打印完整的buf
,这是一个10integer
的数组,而您只读取其中的nint
。您可能应该只打印buf(1:nints)
这样,您的代码就可以工作了。谢谢您的回答:)谢谢您的回答:)