MPI_FILE_READ_AT 忽略文件(不读取文件)
MPI_FILE_READ_AT ignores file (don't read the file)
我是 MPI 的新手,并行 computing.I 用 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(:)
你能帮帮我吗?
我想简单的答案是 MPI-IO 只执行 binary IOs,而你在这里尝试实现的是 formatted IOs.
所以从这里开始,您会发现代码中存在一些问题:
- 您的文件已格式化。由于正如我在序言中所说,MPI-IO 仅执行二进制 IO,因此您必须切换到二进制输入文件,或者将文件作为一组字符串读取,您必须理解这些字符串在内部。让我们假设您的输入文件现在是二进制文件 post 的其余部分。
- 要在
MPI_File_read_at()
中使用的 offset
预计以字节为单位。你传递的是一些元素。因此,您需要将此偏移量乘以您要读取的内容的大小,也就是 integer
. 的大小
- 最后,您打印了完整的
buf
,这是一个包含 10 个 integer
的数组,而您只读取了其中的 nints
。你可能应该只打印 buf(1:nints)
.
这样,您的代码应该可以工作了。
我是 MPI 的新手,并行 computing.I 用 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(:)
你能帮帮我吗?
我想简单的答案是 MPI-IO 只执行 binary IOs,而你在这里尝试实现的是 formatted IOs.
所以从这里开始,您会发现代码中存在一些问题:
- 您的文件已格式化。由于正如我在序言中所说,MPI-IO 仅执行二进制 IO,因此您必须切换到二进制输入文件,或者将文件作为一组字符串读取,您必须理解这些字符串在内部。让我们假设您的输入文件现在是二进制文件 post 的其余部分。
- 要在
MPI_File_read_at()
中使用的offset
预计以字节为单位。你传递的是一些元素。因此,您需要将此偏移量乘以您要读取的内容的大小,也就是integer
. 的大小
- 最后,您打印了完整的
buf
,这是一个包含 10 个integer
的数组,而您只读取了其中的nints
。你可能应该只打印buf(1:nints)
.
这样,您的代码应该可以工作了。