gpt4 book ai didi

Fortran 无格式输出,每个 MPI 进程写入数组的一部分

转载 作者:行者123 更新时间:2023-12-04 23:19:44 25 4
gpt4 key购买 nike

在我的并行程序中,有一个很大的矩阵。每个进程计算并存储它的一部分。然后程序通过让每个进程以正确的顺序写入矩阵的自己部分来将矩阵写入文件。输出文件为“未格式化”形式。但是,当我尝试以串行代码读取文件时(我分配了正确大小的大矩阵),出现了一个我不明白的错误。

我的问题是:在 MPI 程序中,如何获取二进制文件作为由不同进程存储的大矩阵的串行版本输出?

这是我的尝试:

    if(ThisProcs == RootProcs) then
open(unit = file_restart%unit, file = file_restart%file, form = 'unformatted')
write(file_restart%unit)psi
close(file_restart%unit)
endif
#ifdef USEMPI
call mpi_barrier(mpi_comm_world,MPIerr)
#endif
do i = 1, NProcs - 1
if(ThisProcs == i) then
open(unit = file_restart%unit, file = file_restart%file, form = 'unformatted', status = 'old', position = 'append')
write(file_restart%unit)psi
close(file_restart%unit)
endif
#ifdef USEMPI
call mpi_barrier(mpi_comm_world,MPIerr)
#endif
enddo

Psi 是大矩阵,它被分配为:
Psi(N_lattice_points, NPsiStart:NPsiEnd)

但是当我尝试以串行代码加载文件时:
open(2,file=File1,form="unformatted")
read(2)psi
forrtl: severe (67): input statement requires too much data, unit 2 (I am using MSVS 2012+intel fortran 2013)

如何修复并行部分以使二进制文件对串行代码可读?当然可以在 MPI 程序中将它们组合成一个大矩阵,但是有没有更简单的方法呢?

编辑 1

这两个答案真的很好。我会用 access = "stream"解决我的问题。我只是想我可以使用查询来检查文件是“顺序”还是“流”。

最佳答案

这不是 MPI 特有的问题,但也会发生在串行程序中,该程序采用相同的方法逐段写出块。

忽略每个进程的打开和关闭,查看整体的连接和传输语句。您的连接是使用顺序访问的未格式化文件。它是未格式化的,因为您明确要求它,并且是连续的,因为您没有要求任何其他东西。

顺序文件访问基于记录。您的每个 write 语句都会传出一个由矩阵块组成的记录。相反,您的输入语句尝试从单个记录中读取。

您的问题是,当您尝试从文件的第一条记录读取整个矩阵时,该记录不包含整个矩阵。它不包含诸如正确数据量之类的任何内容。最终结果:“输入语句需要太多数据”。

因此,您需要根据相同的记录结构读入数据,或者远离记录文件。

后者很简单,使用流访问

open(unit = file_restart%unit, file = file_restart%file,  &
form = 'unformatted', access='stream')

或者,使用类似的循环结构读取:
do i=1, NPROCS
! read statement with a slice
end do

这当然需要了解正确的切片。

或者,可以考虑使用 MPI-IO 进行输出,这与使用流输出非常相似。使用流访问重新阅读此内容。您可以在 SO 的其他地方找到有关此概念的信息。

关于Fortran 无格式输出,每个 MPI 进程写入数组的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30790730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com