MPI_Send发送数组或数组内容的地址

Does MPI_Send send address of an array or array content

本文关键字:数组 地址 MPI Send      更新时间:2023-10-16

我正在编写带有MPI的Mergesort来对整数数组进行排序。这个想法是在同一等级上合并数组的左半部分,同时将数组的右半部分发送到子等级。因此,如果有四个进程,它看起来像这样:

                        rank 0, a[0..N]
                      /                  
      rank 0, a[0..N/2]                      rank1, a[N/2..N]
        /                                  /               
rank0, a[0..N/4]   rank2,a[N/4..N/2]   rank1,a[N/2..3N/4]   rank3,a[3N/4..N]

父级总是将数组的未排序的右半部分发送到右子级,从右子级接收已排序的子数组。

在串行合并排序算法中,子数组的排序可以在整个数组的同一地址上进行,而不会生成临时数组。同样的事情可以应用于具有MPI_SendMPI_Recv的MPI实现吗?我的理解是MPI_Send发送子数组第一个元素的地址

//rank == 0
int *a, size1, size2;
getData(a);
size1=size/2;
size2=size-size1;
MPI_Send(a+size1, size2, MPI_INT, seed_rank, DATA, MPI_COMM_WORLD);

进程似乎确实通过执行以下操作来获取子数组值:

//rank == 1
int *array;
array = new int(size);
MPI_Recv(array, size, MPI_INT, parent, DATA, MPI_COMM_WORLD, &status);                                                     
mergesort_parallel_mpi(array, size, level);

然后,等级 1 将对存储与原始数组不同的地址的接收子数组元素进行操作合并排序。有没有办法接收数组地址,因为如果两个排序的子数组位于同一块中,合并它们会更容易(这就是串行合并的作用)。如果我不为排名 1 中的新数组分配,我会得到错误。

仅当您的进程在同一台物理计算机上工作时,发送指向内存位置的指针才有效,而在使用 MPI 的分布式处理中并非如此,其中每个进程都会接收已发送给它的数据的副本。您应该将每个进程视为在单独的计算机上运行,因此它不能直接访问任何其他计算机内存。

如果要使用共享内存和线程处理数据,请查看 OpenMP API。

您似乎认为 MPI 进程共享内存:它们不共享。子进程不能直接修改父进程的数组,因为它们具有完全独立的内存空间(实际上,这些内存空间可能驻留在物理上独立的计算机上)。