我有一个项目来编写一个程序,它在两个NxN矩阵A和B上进行矩阵乘法。我可以使用任何算法,但我们在课堂上学习了Cannon的算法,所以这可能是一个我会用的。
我在使用散点函数将B的每一列发送到处理器时遇到问题。我已经阅读了其他帖子,但我还是不太了解如何正确使用MPI_Type_vector,所以我无法弄清楚我的代码有什么问题。
以下是我的尝试,它给了我一个分段错误:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <mpi.h>
int main(int argc, char **argv) {
int N = 10;
int i, j;
int proc_rank, world_size;
float *A, *B[N];
float *A_recv, *B_recv[N];
float *C;
MPI_Request requests[2];
MPI_Status stat;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
/* MAKE NxN MATRICES A & B */
A = (float*) malloc(N*N*sizeof(float*));
A_recv = (float*) malloc(N*sizeof(float*));
C = (float*) malloc(N*N*sizeof(float*));
for (i=0; i<N; i++) {
B[i] = (float *)malloc(N * sizeof(float));
B_recv[i] = (float *)malloc(sizeof(float));
}
if (proc_rank == 0) {
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
*(A + i*N + j) = i*0.2342 + j*0.1231;
B[i][j] = i*0.5431 + j*0.8934;
}
}
}
/* CREATE DATA TYPES FOR SCATTER */
MPI_Datatype acol, acoltype, bcol, bcoltype;
if (proc_rank == 0) {
MPI_Type_vector(10, 1, 10, MPI_FLOAT, &acol);
MPI_Type_commit(&acol);
MPI_Type_create_resized(acol, 0, 1*sizeof(float), &acoltype);
}
MPI_Type_vector(10, 1, 1, MPI_FLOAT, &bcol);
MPI_Type_commit(&bcol);
MPI_Type_create_resized(bcol, 0, 1*sizeof(float), &bcoltype);
MPI_Type_commit(&bcoltype);
/* SCATTER */
MPI_Scatter(B, 1, acoltype, B_recv, 1, bcoltype, 0, MPI_COMM_WORLD);
MPI_Scatter(A, N, MPI_FLOAT, A_recv, N, MPI_FLOAT, 0, MPI_COMM_WORLD);
/* CHECK RESULTS */
if (proc_rank == 1) {
for (i = 0; i < N; i++) {
printf("%d %f %f \n", proc_rank, A_recv[i], B_recv[i]);
}
}
if (proc_rank == 0) {
for (i = 0; i < N; i++) {
printf("%d %f %f \n", proc_rank, A[i+10], B[i][1]);
}
}
free(A);
free(B);
free(A_recv);
//free(B_recv);
free(C);
MPI_Finalize();
return 0;
}
我被告知将矩阵格式化为数组是最容易的,其中元素0-9是行0,元素10-19是行1,等等,这就是为什么A就是这样。但是我可以找到关于如何发送B列的示例似乎将它用作2D数组,因此存在一个他们不匹配的问题,这可能会使以后的事情变得更具挑战性。 / p>
提前感谢您的帮助!