Я хотел бы, чтобы 3-l oop выполнялся всеми процессорами (а не только с рангом 0): каждый процесс должен добавить то, что он должен послать c, а затем собрать его в rcvve c.
#include "mpi.h"
#include <stdio.h>
#include <iostream>
#include <vector>
int main( int argc, char *argv[] )
{
MPI_Init( &argc, &argv );
int rank,size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int R=rank+1;
std::vector<int> rcvvec;
rcvvec.resize(36); // hard-coded for now: 36 = R x 2 x 2 x 3 summed over my 2 processors
std::vector<int> sendvec;
#pragma omp parallel
{
#pragma omp parallel for collapse(3) schedule(static)
for (int n0 = 0; n0 < R; n0++) {
for (int n1 = 0; n1 < 2; n1++) {
for (int n2 = 0; n2 < 2; n2++) {
for(int i=0;i<3;i++){
#pragma omp critical
sendvec.push_back(i);}}}}
MPI_Gather(sendvec.data(), 1, MPI_INT, rcvvec.data(), 1, MPI_INT, 0, MPI_COMM_WORLD);}
if(rank==0){
for(int i=0;i<rcvvec.size();i++)
std::cout<<rcvvec[i]<<std::endl;
}
MPI_Finalize();
return 0;
}
Проблема в том, что rcvve c заполнен нулями. Я также думаю, что sendcounts должен быть размером вектора, отправляемого каждым процессором, а rcvcounts размер вектора, полученного каждым процессом, но когда я заменяю их на sendve c .size (), я получаю ошибку сегментации, что, вероятно, означает, что я не понял, что означает «количество элементов в буфере отправки (целое число)».