MPI_Send发送数组或数组内容的地址
Does MPI_Send send address of an array or array content
我正在编写带有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_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);
然后,等级 1 将对存储与原始数组不同的地址的接收子数组元素进行操作合并排序。有没有办法接收数组地址,因为如果两个排序的子数组位于同一块中,合并它们会更容易(这就是串行合并的作用)。如果我不为排名 1 中的新数组分配,我会得到错误。
仅当您的进程在同一台物理计算机上工作时,发送指向内存位置的指针才有效,而在使用 MPI 的分布式处理中并非如此,其中每个进程都会接收已发送给它的数据的副本。您应该将每个进程视为在单独的计算机上运行,因此它不能直接访问任何其他计算机内存。
如果要使用共享内存和线程处理数据,请查看 OpenMP API。
您似乎认为 MPI 进程共享内存:它们不共享。子进程不能直接修改父进程的数组,因为它们具有完全独立的内存空间(实际上,这些内存空间可能驻留在物理上独立的计算机上)。
相关文章:
- 将数组的地址分配给变量并删除
- 从 C++ 中的函数返回数组地址问题
- 打印字符数组地址的正确方法
- 字符数组地址和整数数组地址
- C++返回静态数组地址的函数
- C++ 在 64 位平台中传递字符数组地址
- 获取字符数组地址,然后转换为指针字符
- 如何指向实际元素而不仅仅是数组地址
- 如何使用数组地址反转数组
- 链表数组 – 地址簿
- 数组地址的地址
- 缺少存储数组地址的内存
- 将指针数组地址传递给函数并更新地址中的数据
- 通过复制将数组地址传递给匿名函数失败
- 数组地址不可见
- 不了解示例中的行为 - strcpy() 和返回本地数组地址的函数
- 保存数组地址的指针的地址是相同的
- 动态数组地址
- 在C++(代码块)中显示数组地址
- C++ 将数组地址分配给指针