Функция MPI_Bcast не передает массив

272
10 мая 2017, 09:50

Изучаю параллельное программирование (MPI). При попытке передать массив всем процессам с помощью функции MPI_Bcast, сталкиваюсь с тем, что его получает только root-процесс. Не могу понять, почему. Есть идеи?

  #include "stdafx.h"
  #include "mpi.h"
  #include <time.h>
  #include <iostream>
  using namespace std;

   void Random1(double * A, int size)
  {
       srand(time(0));
       for (int i=0; i<size; i++)
       {
           do
           {
                 A[i] = rand()%20;
            }
            while (A[i]==0);
        }
   }

int _tmain(int argc, char* argv[])
{
double* B;
int Size, ProcNum, ProcRank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
if (ProcRank == 0)
{
    cout << "Input the dimension  ";
    cin >> Size;
    B = new double[Size];
    Random1(B, Size);
}
MPI_Bcast(&Size, 1, MPI_DOUBLE , 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(&B, Size, MPI_DOUBLE, 0, MPI_COMM_WORLD);
cout << "Rank: "<<ProcRank<<"     B: \n";
for (int i = 0; i < Size; i++)
{
    cout <<B[i]<<"  ";
}
cout << "\n\n";
MPI_Finalize();
return 0;
}
Answer 1
  • Во-первых, у вас почему-то int Size broadcast-ится как MPI_DOUBLE, а не MPI_INT.

  • Во-вторых, если вы собрались broadcast-тить содержимое массива B, то

    MPI_Bcast(B, Size, MPI_DOUBLE, 0, MPI_COMM_WORLD);
    

    Именно B, а не &B. То, что у вас сейчас написано, пытается broadcast значение указателя B, что уже бессмысленно само по себе, да еще и делается с неправильным размером.

  • В-третьих, выделенная в root-процессе память для массива B не будет магическим образом сама по себе выделяться и в остальных процессах. Это ваша задача - выделять память для массива B в каждом процессе.

    То есть сначала вам надо broadcast размер массива Size, потом, после получения размера всеми процессами, выделить память под массив в каждом процессе, и затем уже делать broadcast на содержимое массива.

READ ALSO
Объявление классов внутри функций

Объявление классов внутри функций

Можно ли объявлять классы внутри функций? А передавать созданные таким образом объекты в другие функции? Например, данный код выполняется,...

242
Версия BIOS с помощью С++

Версия BIOS с помощью С++

Добрый день! Никак не удаётся написать или найти программу, которая позволяла бы выводить на экран версию BIOS текущего компьютераНужен код...

292
Запись в бинарный файл структуры

Запись в бинарный файл структуры

Доброго дняПо заданию требуется записать в бинарник несколько массивов структур

325
Почему не создаётся файл в с++

Почему не создаётся файл в с++

Не знаю почему но не создаётся файлПисал ofstream WAVf("newWAV

337