c++ - MPI_Send 发送数组地址还是数组内容

标签 c++ arrays algorithm sorting mpi

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

                        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);

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

最佳答案

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

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

关于c++ - MPI_Send 发送数组地址还是数组内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22887853/

相关文章:

JavaScript/jQuery : Array - For In Loop Return Value of Lowest Key

algorithm - 分析不同的集合和优化。最好的方法?

c++ - 重载 << 运算符导致无输出

c++ - 将 C 文件句柄分配给 C++ 文件流

java - 数组 toString 以及也具有 toString 方法的对象

algorithm - 如何将大小相等的正方形网格减少为最少的矩形集?

algorithm - 想要以不同的方式实现归并排序算法

c++ - 如何将相同的签名分配给具有不同签名的函数?

c++ - 将 VS 2013 中的目标编译器更改为 VS 2012

javascript - JSONArray 上的 Splice 方法