gpt4 book ai didi

mpi - 您何时会使用不同的计数或类型来进行发送和接收过程?

转载 作者:行者123 更新时间:2023-12-04 22:59:32 25 4
gpt4 key购买 nike

MPI 中的许多描述发送和接收的例程——MPI_Sendrecv、MPI_Scatter 等——都具有发送和接收计数和类型的参数。例如,在 Fortran 中, MPI_Scatter 的签名是:

MPI_SCATTER(SENDBUF, SENDCOUNT, SENDTYPE, 
RECVBUF, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)

如果发送的数据量必须与接收的数据量相同,为什么两者都需要?这不就是引入了不一致的可能性吗?

需要不同计数/类型的用例是什么?

最佳答案

MPI 要求发送和接收进程就数据的类型和数量达成一致(有点;对于点对点通信,接收方可以请求的比发送的多)。但是 MPI 数据类型还描述了数据在内存中的布局,这是需要为发送方和接收方使用不同类型的一个非常常见的原因。

您特别询问了 Scatter 和 Fortran,让我们来看看那个案例。让我们考虑散射 size*n矩阵,按行,到不同的进程

    |---n---|  ---
0 0 0 0 |
a = 1 1 1 1 size
2 2 2 2 |
---

所以等级 0 得到 [0 0 0 0] , rank 1 得到 [1 1 1 1] , 等等。

在 Fortran 中,它们在内存中不是连续的;所以要描述一行,你必须使用 MPI_Type_vector :
    call MPI_Type_vector(n, 1, size, MPI_REAL, row_type, ierr)

这描述了 n 个实数,但每个实数之间由大小实数分隔。

另一方面,如果接收进程只是将数据接收到一维数组中:
    real, dimension(n) :: b

那么它就不能用那个类型来描述数据; b没有足够的空间容纳 n实数各有 size 的差距它们之间!它想接收数据就像 n * MPI_REAL .如果您必须发送数据列,这种不匹配在 C 中也是一样的。

因此,这是以不同方式指定数据类型(以及计数)的常见原因;对于分散器,必须使用一种数据类型来描述数据,该数据类型包括保存要发送的值的较大数据结构的布局;但是 scatter-ee 很可能将数据接收到具有不同布局的不同数据结构中。

下面是一个工作简单的例子。
program scatterdemo
use mpi
implicit none
real, allocatable, dimension(:,:) :: a
real, allocatable, dimension(:) :: b
integer :: ierr, rank, comsize
integer, parameter :: n=4
integer :: i
integer :: row_type, row_type_sized, real_size
integer(kind=MPI_ADDRESS_KIND) :: lb=0, extent

call MPI_Init(ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
call MPI_Comm_size(MPI_COMM_WORLD, comsize, ierr)

if (rank == 0) then
allocate( a(comsize, n) )
do i=1,comsize
a(i,:) = i-1
enddo
endif

allocate( b(n) )

call MPI_Type_size(MPI_REAL, real_size, ierr)

call MPI_Type_vector(n, 1, comsize, MPI_REAL, row_type, ierr)
extent = real_size*1
call MPI_Type_create_resized(row_type, lb, extent, row_type_sized, ierr)
call MPI_Type_commit(row_type_sized, ierr)

call MPI_Scatter(a, 1, row_type_sized, b, n, MPI_REAL, 0, MPI_COMM_WORLD, ierr)

print *, rank, b

if (rank == 0) deallocate (a)
deallocate(b)

call MPI_Finalize(ierr)

end program scatterdemo

并用六个处理器运行它给出
$ mpirun -np 6 ./scatter
0 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00
3 3.000000 3.000000 3.000000 3.000000
1 1.000000 1.000000 1.000000 1.000000
5 5.000000 5.000000 5.000000 5.000000
2 2.000000 2.000000 2.000000 2.000000
4 4.000000 4.000000 4.000000 4.000000

关于mpi - 您何时会使用不同的计数或类型来进行发送和接收过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30163628/

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