当前位置: 首页 > 知识库问答 >
问题:

MPI_Send是发送数组地址还是数组内容

翟新
2023-03-14

我正在用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中的新阵列分配资源,我将收到错误。

共有2个答案

梁丘波
2023-03-14

您似乎认为MPI进程共享内存:他们没有。子进程不能直接修改父进程的数组,因为它们有完全独立的内存空间(事实上,它们可能位于物理上独立的计算机上)。

祁均
2023-03-14

只有当您的进程在同一台物理机器上工作时,才可以发送指向内存位置的指针,而这在MPI分布式处理中不是这种情况,在MPI中,每个进程都会收到发送给它的数据的副本。您应该将每个进程视为在单独的机器上运行,因此它不能直接访问任何其他机器的内存。

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

 类似资料:
  • 问题内容: PHP将所有数组视为关联数组,因此没有任何内置函数。谁能推荐一种相当有效的方法来检查数组是否仅包含数字键? 基本上,我希望能够区分以下两者: 和这个: 问题答案: 您问了两个不完全相同的问题: 首先,如何确定数组是否只有数字键 其次,如何确定数组是否具有从0开始的 连续 数字键 考虑您实际上需要哪种行为。(这也许可以满足您的目的。) 对于第二个问题(检查数组是否为零索引和顺序索引),可

  • 问题内容: 我试图了解该方法的本地实现。该方法究竟返回什么?是内存地址还是随机值? 问题答案: 本机实现取决于JVM。 例如,HotSpot有6个实现。您可以通过命令行使用运行JVM的标志来选择它,其中n: 0 – Park-Miller RNG(默认) 1 – f(地址,global_statement) 2 –常量1 3 –串行计数器 4 –对象地址 5 –线程本地Xorshift

  • 问题内容: 我正在使用.net Web API来获取json并将其返回给前端以获取角度。json可以是对象或数组。我的代码当前仅适用于数组,而不适用于对象。我需要找到一种方法来尝试解析或确定内容是否是对象或数组。 这是我的代码 以上可能不是最好的方法。它就是我现在所在的位置。 问题答案: 使用Json.NET,您可以这样做:

  • 问题内容: 数组不是Java中的原始类型,但它们也不是对象,因此它们是按值还是按引用传递?它是否取决于数组包含的内容,例如引用或原始类型? 问题答案: 。如果是Array(只不过是Object),则数组引用按值传递。(就像对象引用按值传递)。 当你将数组传递给其他方法时,实际上是复制对该数组的引用。 通过该引用对数组内容进行的任何更改都会影响原始数组。 但是,将引用更改为指向新数组不会更改原始方法

  • 问题内容: 是否真的计算了PHP数组的所有元素,还是将此值缓存在某个地方并被获取? 问题答案: 好吧,我们可以看看源代码: call ,这反过来又需要非递归数组,该数组是通过以下方式实现的: 所以你可以看到,它的。