提问人:Ian Nemo 提问时间:10/15/2023 最后编辑:Ian Nemo 更新时间:10/15/2023 访问量:49
散射 2D 矩阵 - MPI
Scatter a 2D matrix - MPI
问:
我现在正在学习并试图理解 MPI。
例如,我有一个矩阵 n*n(n = 4):
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
我想分散这个矩阵,并创建四个新矩阵(我有四个过程):
排名 0:
0 1
4 5
排名 1:
2 3
6 7
排名 2:
8 9
12 13
排名 3:
10 11
14 15
我尝试这样做,但只有排名 0 才能获得正确的结果。
下面是我实现的代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char *argv[]){
int rank;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int n;
if(rank == 0){
scanf("%d", &n);
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
int **matrix = (int **)malloc(n * sizeof(int *));
int *matrix_1D = (int *)malloc(n * n * sizeof(int));
for(int i = 0; i < n; i++){
matrix[i] = (int *)malloc(n * sizeof(int));
}
if(rank == 0){
// Reading the matrix
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++){
scanf(" %d", &matrix[i][j]);
matrix_1D[i*n + j] = matrix[i][j];
}
printf("\n");
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j){
printf("%d ", matrix[i][j]);
} printf("\n");
} printf("\n");
}
int new_n = n / 2; // Size of each smaller square matrix block
MPI_Datatype block_type;
int sizes[2] ={n, n}; // Dimensions of the full matrix
int subsizes[2] ={new_n, new_n}; // Dimensions of the smaller block
int starts[2] ={0, 0}; // Starting coordinates
MPI_Type_create_subarray(2, sizes, subsizes, starts, MPI_ORDER_C, MPI_INT, &block_type);
MPI_Type_commit(&block_type);
int *local_matrix = (int *)malloc(new_n * new_n * sizeof(int)); // Each process will hold a block of the matrix
MPI_Scatter(matrix_1D, 1, block_type, local_matrix, new_n*new_n, MPI_INT, 0, MPI_COMM_WORLD);
printf("Rank %d received data:\n", rank);
for(int i = 0; i < new_n; i++){
for(int j = 0; j < new_n; j++){
printf("%d ", local_matrix[i*new_n + j]);
}
printf("\n");
} printf("\n");
free(local_matrix);
MPI_Type_free(&block_type);
MPI_Finalize();
}
我理解错了什么?
我试图找到模式,但唯一不变的是排名 0 总是得到正确的结果,而所有其他排名都失败了。
我也尝试了这种分散方式:
MPI_Scatter(matrix_1D, 1, block_type, local_matrix, 1, block_type, 0, MPI_COMM_WORLD);
但它没有用
答: 暂无答案
评论
MPI_Scatter()
MPI_Type_create_subarray()
MPI_Scatterv()