MPI_Gather std :: vector: 0 вывод в собранном векторе - PullRequest
0 голосов
/ 09 июля 2020

Я хотел бы, чтобы 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 (), я получаю ошибку сегментации, что, вероятно, означает, что я не понял, что означает «количество элементов в буфере отправки (целое число)».

...