我正在尝试并行化一些计算矩阵的代码,但是我遇到了分段错误错误。我已经调试了代码,但我找不到问题。
以下是我宣布matrice的片段:
double **A, **B, **C, *tmp1,*tmp2,*tmp3;
int N;
int myrank, P, from, to;
N = 100;
tmp1 = (double *) malloc (sizeof(double ) * N * N);
tmp2 = (double *) malloc (sizeof(double ) * N * N);
tmp3 = (double *) malloc (sizeof(double ) * N * N);
A = (double **) malloc (sizeof(double *) * N);
B = (double **) malloc (sizeof(double *) * N);
C = (double **) malloc (sizeof(double *) * N);
from = myrank * N/P;
to = (myrank+1) * N/P;
然后在这里我将MPI理论化为
MPI_Init (&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD, &P);
但不知何故,我无法分散......
MPI_Bcast(B, N*N, MPI_INT, 0, MPI_COMM_WORLD);
printf("Rank: %d\n", myrank);
MPI_Scatter(A, N*N/P, MPI_INT, &A[from], N*N/P, MPI_INT, 0, MPI_COMM_WORLD);
我不能在这里编写所有代码,因为我不被允许......但问题在于Scatter it self。我做错了什么?
答案 0 :(得分:1)
您无法直接发送二维矩阵(double**
)。相反,您必须传递实际数据的地址:&A[0][0]
。对于接收,您还必须将地址传递到实际存储数据的位置。在您的情况下,这将是:&A[from][0]
而不是&A[from]
。
尝试将其作为分散符:
MPI_Scatter(&A[0][0], N*N/P, MPI_INT, &A[from][0], N*N/P, MPI_INT, 0, MPI_COMM_WORLD);
另一方面,在接收过程中,A
以外的所有值都将保持无效。您可能需要考虑创建所需大小的单独接收缓冲区:
double* local_A = (double*)malloc(sizeof(double)*N*N/P);
MPI_Scatter(&A[0][0], N*N/P, MPI_INT, local_A, N*N/P, MPI_INT, 0, MPI_COMM_WORLD);