MPI_Exscan-如何用于并行文件写入
我正在为并行IO编写一些MPI代码。 假设我有一个数组[2,5,6,9,0,4,3,1,8,7]写在一个文件中,我有两个进程 我定义文件视图来读取此文件的一部分。 过程0:2,5,6,9,0(5个元素) 过程1:4,3,1,8,7(5个元素) 这两个进程都调用排序函数。作为排序函数的结果, 过程0有:0,1,2,3(4个元素) 过程1有:4,5,6,7,8,9(6个元素) 现在我需要将这个输出写入一个新的输出文件。 进程0在偏移量0处写入时将正确写入。但是进程1如何知道将文件写入的偏移量呢?我知道我需要定义一个要写入的文件视图,但是新的替换是什么呢。我觉得MPI_Exscan可以做到。。但我不知道如何。。。有人能帮忙吗MPI_Exscan-如何用于并行文件写入,mpi,Mpi,我正在为并行IO编写一些MPI代码。 假设我有一个数组[2,5,6,9,0,4,3,1,8,7]写在一个文件中,我有两个进程 我定义文件视图来读取此文件的一部分。 过程0:2,5,6,9,0(5个元素) 过程1:4,3,1,8,7(5个元素) 这两个进程都调用排序函数。作为排序函数的结果, 过程0有:0,1,2,3(4个元素) 过程1有:4,5,6,7,8,9(6个元素) 现在我需要将这个输出写入一个新的输出文件。 进程0在偏移量0处写入时将正确写入。但是进程1如何知道将文件写入的偏移量呢?我知
提前感谢您的描述有点模糊,但在任何情况下,进程1都可以向进程2发送包含要使用的偏移量的消息。您的描述有点模糊,但在任何情况下,进程1都可以向进程2发送包含要使用的偏移量的消息。当然;您可以对本地元素数使用
MPI\u Exscan
和MPI\u SUM
来获得“左侧”的总数,并在视图中使用该总数(作为偏移量,或在定义视图时创建的类型中使用)
下面是一个小型Fortran程序,其中每个列生成一个“随机”(嗯,2*rank+1
)大小的字符数组(“0”表示列0,等等),使用MPI_Exscan找出写入时应使用的偏移量,然后写入:
program testexscan
use mpi
implicit none
integer :: nelements, nleft, total
character, allocatable, dimension(:) :: array
integer :: rank, nprocs, ierr, fh
integer(kind=MPI_OFFSET_KIND) :: disp
call MPI_Init(ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, nprocs, ierr)
call generatedata(rank, array)
nelements = size(array)
call MPI_Exscan (nelements, nleft, 1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, ierr)
print *, 'rank = ', rank, ' nelements = ', nelements, ' nleft= ', nleft
call MPI_File_open(MPI_COMM_WORLD, 'output.txt', ior(MPI_MODE_WRONLY,MPI_MODE_CREATE), &
MPI_INFO_NULL, fh, ierr)
disp = nleft * 1 ! offset in bytes
call MPI_File_set_view(fh, disp, MPI_CHARACTER, MPI_CHARACTER, "native", MPI_INFO_NULL, ierr )
call MPI_File_write_all(fh, array, nelements, MPI_CHARACTER, MPI_STATUS_IGNORE, ierr)
call MPI_File_close(fh, ierr)
deallocate(array)
call MPI_Finalize(ierr)
contains
subroutine generatedata(rank, arr)
character, dimension(:), allocatable, intent(inout) :: arr
integer, intent(in) :: rank
nelements = rank * 2 + 1
allocate(array(nelements))
array = char(ichar("0")+rank)
end subroutine generatedata
end program testexscan
运行此命令将提供:
$ mpif90 -o testexscan testexscan.f90
$ mpirun -np 4 ./testexscan
rank = 0 nelements = 1 nleft= 0
rank = 1 nelements = 3 nleft= 1
rank = 2 nelements = 5 nleft= 4
rank = 3 nelements = 7 nleft= 9
$ cat output.txt
0111222223333333
当然;您可以对本地元素数使用
MPI\u Exscan
和MPI\u SUM
来获得“左侧”的总数,并在视图中使用该总数(作为偏移量,或在定义视图时创建的类型中使用)
下面是一个小型Fortran程序,其中每个列生成一个“随机”(嗯,2*rank+1
)大小的字符数组(“0”表示列0,等等),使用MPI_Exscan找出写入时应使用的偏移量,然后写入:
program testexscan
use mpi
implicit none
integer :: nelements, nleft, total
character, allocatable, dimension(:) :: array
integer :: rank, nprocs, ierr, fh
integer(kind=MPI_OFFSET_KIND) :: disp
call MPI_Init(ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, nprocs, ierr)
call generatedata(rank, array)
nelements = size(array)
call MPI_Exscan (nelements, nleft, 1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, ierr)
print *, 'rank = ', rank, ' nelements = ', nelements, ' nleft= ', nleft
call MPI_File_open(MPI_COMM_WORLD, 'output.txt', ior(MPI_MODE_WRONLY,MPI_MODE_CREATE), &
MPI_INFO_NULL, fh, ierr)
disp = nleft * 1 ! offset in bytes
call MPI_File_set_view(fh, disp, MPI_CHARACTER, MPI_CHARACTER, "native", MPI_INFO_NULL, ierr )
call MPI_File_write_all(fh, array, nelements, MPI_CHARACTER, MPI_STATUS_IGNORE, ierr)
call MPI_File_close(fh, ierr)
deallocate(array)
call MPI_Finalize(ierr)
contains
subroutine generatedata(rank, arr)
character, dimension(:), allocatable, intent(inout) :: arr
integer, intent(in) :: rank
nelements = rank * 2 + 1
allocate(array(nelements))
array = char(ichar("0")+rank)
end subroutine generatedata
end program testexscan
运行此命令将提供:
$ mpif90 -o testexscan testexscan.f90
$ mpirun -np 4 ./testexscan
rank = 0 nelements = 1 nleft= 0
rank = 1 nelements = 3 nleft= 1
rank = 2 nelements = 5 nleft= 4
rank = 3 nelements = 7 nleft= 9
$ cat output.txt
0111222223333333
我不希望进程发送/接收任何消息..我希望使用MPI_Exscan…我不希望进程发送/接收任何消息..我希望使用MPI_Exscan。。。