我正在使用 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_Send
和 MPI_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/