Как разбросать столбцы матрицы с использованием C и MPI при выполнении умножения матрицы на матрицу NxN

У меня есть проект, чтобы написать программу, которая выполняет умножение матриц на две матрицы NxN A и B. Я могу использовать любой алгоритм, но мы узнали об алгоритме Кэннона в классе, так что, вероятно, я буду его использовать.

У меня проблемы с использованием функции разброса для отправки каждого столбца 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, использовали его как двумерный массив, так что есть проблема, с которой они не совпадают, и это может усложнить задачу в дальнейшем.

Заранее спасибо за помощь!

0 ответов

Другие вопросы по тегам