MPI_Type_vector(block_size, n, n, MPI_DOUBLE, &row_type); MPI_Scatter(&B[0][0], 1, col_type, &B_col[0][0], block_size * n, MPI_DOUBLE, 0, row_comm);散播时,mpi似乎没有将每列发送给对应进程,因为地址不在下一列开始,如何解决?
时间: 2024-03-02 13:53:01 浏览: 107
这个问题可能是因为您没有正确设置列通信子中进程的排列方式。在创建列通信子时,您可以使用 MPI_Cart_create() 函数来显式地指定进程在通信子中的排列方式。例如,如果您希望每个进程在列通信子中的排列方式是按列顺序的话,您可以使用以下代码:
```
int dims[2] = {num_procs_row, num_procs_col};
int periods[2] = {0, 0};
int coords[2];
MPI_Comm row_comm, col_comm;
MPI_Cart_create(MPI_COMM_WORLD, 2, dims, periods, 1, &cart_comm);
MPI_Comm_rank(cart_comm, &my_rank);
MPI_Cart_coords(cart_comm, my_rank, 2, coords);
MPI_Comm_split(cart_comm, coords[0], coords[1], &row_comm);
MPI_Comm_split(cart_comm, coords[1], coords[0], &col_comm);
```
在这个例子中,我们使用 MPI_Cart_create() 函数创建一个二维的笛卡尔拓扑,然后使用 MPI_Comm_split() 函数将进程分成行通信子和列通信子。在 MPI_Scatter() 函数中,我们可以使用列通信子而不是笛卡尔拓扑来传递数据:
```
MPI_Scatter(&B[0][0], block_size * n, MPI_DOUBLE, &B_col[0][0], block_size * n, MPI_DOUBLE, 0, col_comm);
```
这样,每个进程将会按照其在列通信子中的排列方式来接收数据,从而避免了您提到的问题。
阅读全文