如何在C MPI中发送指向数组的指针数组



假设我正在使用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; 
} 

我希望这个代码将是有用的。非常感谢。

相关内容

  • 没有找到相关文章

最新更新