在NxN矩阵

时间:2015-11-01 04:54:25

标签: c matrix parallel-processing mpi matrix-multiplication

我有一个项目来编写一个程序,它在两个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>

提前感谢您的帮助!

0 个答案:

没有答案