假设我正在使用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数据类型,这可能是一个起点。
请尝试以下代码,将指针数组发送到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 : %dn", 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;
}
我希望这个代码将是有用的。非常感谢。