Я пытаюсь сделать гибридное матричное умножение 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 до получения и выведите умноженный массив