gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:00:29 25 4
gpt4 key购买 nike

我正在使用 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]

parent rank总是将未排序的右半数组发送给右 child ,从右 child 接收排序后的子数组。

在串行合并排序算法中,子数组的排序可以在整个数组的同一地址上完成,而不需要生成临时数组。使用 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 的分布式处理中情况并非如此,在 MPI 中,每个进程都会收到已发送到的数据的拷贝它。您应该将每个进程视为在单独的机器上运行,因此它不能直接访问任何其他机器的内存。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com