如何在 C MPI 中发送指向数组的指针数组
Posted
技术标签:
【中文标题】如何在 C MPI 中发送指向数组的指针数组【英文标题】:How to send an array of pointers to arrays in C MPI 【发布时间】:2020-07-18 03:02:54 【问题描述】:假设我正在使用 MPI,我希望能够将整数矩阵的多行从主进程发送到其他进程。这样做相对容易,如下所示:
MPI_Send(&matrix[start_row][0], amount_of_cells, MPI_INT, target_process, 1, MPI_COMM_WORLD);
现在假设在我们的矩阵中,每个单元格都保存一个对大小为 2 的整数数组的引用,而不是每个单元格都保存一个整数。我们如何将新矩阵的多行发送到子进程?
我正在考虑做与上面的代码相同的事情,但将 amount_of_cells 变量加倍,因为每个单元格都包含对大小为 2 的整数数组的引用。但是,它似乎不起作用,我有点这里的损失。
关于如何解决这个问题的任何提示或建议会有帮助吗?
旧矩阵:
_________
| 1 | 2 |
--------
| 3 | 4 |
_________
新矩阵:
___________________
| [1, 0] | [2, 0] |
--------------------
| [3, 0] | [4, 0] |
___________________
因此,每个单元格都保存对使用malloc()
创建的大小为 2 的整数数组的引用,而不是整数。我怎样才能将这个新矩阵的行发送到子进程?
我正在考虑定义我自己的 MPI 数据类型,这可能是一个起点。
【问题讨论】:
您最好的选择是更改您分配二维数组的方式,并将它们分配到连续内存中。如果这不是一个选项,那么您可以定义自己的数据类型。 是的,我就是这么想的 【参考方案1】:请试试这段代码,在 C MPI 中发送一个指向数组的指针数组
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define n 10
int a[] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
int a2[1000];
int main(int argc, char* argv[])
int pid, np,
elements_per_process,
n_elements_recieved;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &pid);
MPI_Comm_size(MPI_COMM_WORLD, &np);
if (pid == 0)
int index, i;
elements_per_process = n / np;
if (np > 1)
for (i = 1; i < np - 1; i++)
index = i * elements_per_process;
MPI_Send(&elements_per_process,
1, MPI_INT, i, 0,
MPI_COMM_WORLD);
MPI_Send(&a[index],
elements_per_process,
MPI_INT, i, 0,
MPI_COMM_WORLD);
index = i * elements_per_process;
int elements_left = n - index;
MPI_Send(&elements_left,
1, MPI_INT,
i, 0,
MPI_COMM_WORLD);
MPI_Send(&a[index],
elements_left,
MPI_INT, i, 0,
MPI_COMM_WORLD);
int sum = 0;
for (i = 0; i < elements_per_process; i++)
sum += a[i];
int tmp;
for (i = 1; i < np; i++)
MPI_Recv(&tmp, 1, MPI_INT,
MPI_ANY_SOURCE, 0,
MPI_COMM_WORLD,
&status);
int sender = status.MPI_SOURCE;
sum += tmp;
printf("Sum of array is : %d\n", sum);
else
MPI_Recv(&n_elements_recieved,
1, MPI_INT, 0, 0,
MPI_COMM_WORLD,
&status);
MPI_Recv(&a2, n_elements_recieved,
MPI_INT, 0, 0,
MPI_COMM_WORLD,
&status);
int partial_sum = 0;
for (int i = 0; i < n_elements_recieved; i++)
partial_sum += a2[i];
MPI_Send(&partial_sum, 1, MPI_INT,
0, 0, MPI_COMM_WORLD);
MPI_Finalize();
return 0;
我希望这段代码有用。 谢谢。
【讨论】:
本意恐怕是一次性发送一个锯齿状数组。以上是关于如何在 C MPI 中发送指向数组的指针数组的主要内容,如果未能解决你的问题,请参考以下文章