Invalid_buffer_error в отправке MPI - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь сделать гибридное матричное умножение MPI-OpenMP (arr * brr). Я инициализирую брр как личность. Моя цель - сначала заставить коммуникацию работать, а затем я начну с того, чтобы сделать эту программу более надежной / удобной во всех случаях. это квадратные матрицы или размер на 1 меньше назначенных процессоров.

Я догадываюсь, что 1. Я ошибочно обращаюсь к векторному буферу для этого, что я пробовал: & arr [i] [0], arr [i] для отправки буфера 2. Я тоже полагаюсьмного о буферизации при отправке brr до и получении позже.

#include<vector>
#include<stdio.h>
#include<iostream>
#include<time.h>
#include<omp.h>
#include<mpi.h>

using namespace std ;

int main(){

  MPI_Init(NULL, NULL );

  int size, id ;
  MPI_Comm_rank(MPI_COMM_WORLD, &id);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  int row = size-1;
  int col =row ;

  if(id==0 ){
    vector<vector<int>> arr(row);
    vector<vector<int>> brr(row);

    for (int i =0 ; i< row ; i++){
      arr[i] = vector<int>(col);
      brr[i] = vector<int>(col);
                        brr[i][i] = 1;

      for (int j =0 ; j< row ; j++){
        arr[i][j]= i+j;
                                printf("\nHere \n");
        MPI_Send(&brr[j][0], col, MPI_INT, i+1, (2*i)+1,MPI_COMM_WORLD);     
      }
      MPI_Send(&arr[i][0], col, MPI_INT, i+1, i+1,MPI_COMM_WORLD);

    }
  }
  else{
    vector<int> as(col);
    vector<int> res(col);
    MPI_Recv( &as, col, MPI_INT, 0, id+1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    int i =0 ;
    #pragma omp for  //private(bs)
    for(int i =0 ; i< col; i++){
      vector<int> bs(col);
      MPI_Recv( &bs, col, MPI_INT, 0, 2*id+1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
      int sum = 0;
      #pragma omp parallel_for
      for(int j=0 ; j< col; j++){
        sum+= bs[j]*as[j];
      }
        res[i]= sum;
    }

    MPI_Send(&res[0], col, MPI_INT, 0, id+1, MPI_COMM_WORLD);
  }

  if(id ==0 ){
    vector<vector<int>> result(row);
    cout<<"matrix\n";
    for (int i=0 ; i< row ; i++){
      result[i]=  vector<int>(row);
      MPI_Recv(&result[i][0],col, MPI_INT, i+1, id+1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
      for(int j=0 ; j< col; j++){
        cout<<result[i][j]<<" ";
      }
      cout<<endl;
    }
  }

  MPI_Finalize();
  return 0;
}

НЕТ ПРЕДУПРЕЖДЕНИЙ, КОТОРЫЕ БУДУТ СОЗДАНЫ, ЗДЕСЬ ЖУРНАЛ РАБОТЫ:


[localhost:30582] *** An error occurred in MPI_Send
[localhost:30582] *** reported by process [2818441217,0]
[localhost:30582] *** on communicator MPI_COMM_WORLD
[localhost:30582] *** MPI_ERR_BUFFER: invalid buffer pointer
[localhost:30582] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
[localhost:30582] ***    and potentially your MPI job)

Я ожидаю, что он буферизует отправленныеbrrs до получения и выведите умноженный массив

...