gpt4 book ai didi

c - 使用 MPI 写入文件

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:29 27 4
gpt4 key购买 nike

我正在按如下方式写入文件。顺序不一定重要(尽管如果我能按 K 排序它会很好,就像串行代码中固有的那样)

            CALL MPI_BARRIER(MPI_COMM_WORLD, IERR)
OPEN(EIGENVALUES_UP_IO, FILE=EIGENVALUES_UP_PATH, ACCESS='APPEND')
WRITE(EIGENVALUES_UP_IO, *) K * 0.0001_DP * PI, (EIGENVALUES(J), J = 1, ATOM_COUNT)
CLOSE(EIGENVALUES_UP_IO)

我知道这可能是最糟糕的选择。

我查看了 MPI_FILE_WRITE_AT 等,但我不确定它们(直接)以我所拥有的形式获取数据?

文件必须采用与此相同的格式,每 K 行显示为一行,包含 ATOM_COUNT + 1 列。值为 REAL(8)

我一遍又一遍地寻找,但找不到任何简单的引用资料来实现这一目标。有什么帮助吗? :)

C 中的类似代码(假设它与 FORTRAN 基本相同)同样有用

谢谢!

最佳答案

因此,确定正确的 IO 策略取决于很多因素。如果您只是发回少量特征值,而您被困在写出 ASCII 码中,那么最好将所有数据发回进程 0 进行写入。这通常不是一个成功的策略,因为它显然无法扩展;但是如果数据量非常小,它可能比试图写出到共享文件所涉及的争用要好(同样,使用 ASCII 更难)。

假设每个人都有相同数量的数据,下面的一些代码会将数据量返回到 proc 0。

另一种方法是让每个人都写出自己的 ks 和特征值,然后在程序完成后作为后处理步骤,将它们放在一起。这避免了 MPI 步骤,并且(使用正确的文件系统)可以扩展很多方式,而且很容易;这是否更好很容易测试,并且取决于数据量、处理器数量和底层文件系统。

   program testio
use mpi
implicit none

integer, parameter :: atom_count = 5
integer, parameter :: kpertask = 2
integer, parameter :: fileunit = 7
integer, parameter :: io_master = 0
double precision, parameter :: pi = 3.14159

integer :: totalk
integer :: ierr
integer :: rank, nprocs

integer :: handle
integer(kind=MPI_OFFSET_KIND) :: offset
integer :: filetype

integer :: j,k
double precision, dimension(atom_count, kpertask) :: eigenvalues
double precision, dimension(kpertask) :: ks

double precision, allocatable, dimension(:,:):: alleigenvals
double precision, allocatable, dimension(:) :: allks

call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)

totalk = nprocs*kpertask

!! setup test data

do k=1,kpertask
ks(k) = (rank*kpertask+k)*1.d-4*PI
do j=1,atom_count
eigenvalues(j,k) = rank*100+j
enddo
enddo

!! Everyone sends proc 0 their data

if (rank == 0) then
allocate(allks(totalk))
allocate(alleigenvals(atom_count, totalk))
endif

call MPI_GATHER(ks, kpertask, MPI_DOUBLE_PRECISION, &
allks, kpertask, MPI_DOUBLE_PRECISION, &
io_master, MPI_COMM_WORLD, ierr)

call MPI_GATHER(eigenvalues, kpertask*atom_count, MPI_DOUBLE_PRECISION, &
alleigenvals, kpertask*atom_count, MPI_DOUBLE_PRECISION, &
io_master, MPI_COMM_WORLD, ierr)

if (rank == 0) then
open(unit=fileunit, file='output.txt')
do k=1,totalk
WRITE(fileunit, *) allks(k), (alleigenvals(j,k), j = 1, atom_count)
enddo
close(unit=fileunit)

deallocate(allks)
deallocate(alleigenvals)
endif
call MPI_FINALIZE(ierr)
end program testio

关于c - 使用 MPI 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4356654/

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