【发布时间】:2020-12-23 23:30:44
【问题描述】:
我有一个并行的代码部分,我在块中写出 n 个大型数组(代表一个数字网格),这些块稍后会以不同大小的块读取。为此,我使用了 Stream 访问,因此每个处理器独立写入其块,但在本节测试 2 个处理器组时,我发现时间不一致,耗时 0.5-4 秒。
我知道你可以用 MPI-IO 做类似的事情,但我不确定有什么好处,因为不需要同步。我想知道是否有办法提高我的写入性能,或者 MPI-IO 是否有理由成为本节的更好选择。
这是代码部分的示例,我在其中创建文件以使用两组(mygroup = 0 或 1)写入 norb 数组:
do irbsic=1,norb
[various operations]
blocksize=int(nmsh_tot/ngroups)
OPEN(unit=iunit,FILE='ZPOT',STATUS='UNKNOWN',ACCESS='STREAM')
mypos = 1 + (IRBSIC-1)*nmsh_tot*8 ! starting point for writing IRBSIC
mypos = mypos + mygroup*(8*blocksize) ! starting point for mesh group
WRITE(iunit,POS=mypos) POT(1:nmsh)
CLOSE(iunit)
OPEN(unit=iunit,FILE='RHOI',STATUS='UNKNOWN',ACCESS='STREAM')
mypos = 1 + (IRBSIC-1)*nmsh_tot*8 ! starting point for writing IRBSIC
mypos = mypos + mygroup*(8*blocksize) ! starting point for mesh group
WRITE(iunit,POS=mypos) RHOG(1:nmsh,1,1)
CLOSE(iunit)
[various operations]
end do
【问题讨论】:
-
是否有多个进程写入给定文件?如果是这样,我强烈推荐 MPI I/O - 如果你不这样做,你可能会得到不正确的结果,这是我遇到的一个讨厌的问题
-
如果您正在写入不同的文件,这意味着您有不同的单元号,那么您可以使用
ASYNCHRONOUS= "YES"。您的程序不会等待 IO 完成,因为它已将 IO 交给操作系统,而您现在受到文件系统的限制。 -
顺便说一句,为什么要计算两次
mypos?而且,IRBSIC是否应该是 do-loop 索引iorbsrc? -
@IanBush 是的,多个进程写入一个文件,但每个进程都在写入文件的不同部分。打开同一个文件是否仍然存在冲突?
-
如果多个进程正在写入文件,则不能保证 Fortran I/O 正常工作 - 这不仅仅是理论上的标准违规,我已经看到这个失败的生成文件部分填充了不可读的值。引用 Cray 工程师的话“对于多个进程写入文件的唯一明智、可移植的方式是通过 MPI I/O”