Изучаю параллельное программирование (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;
}
Во-первых, у вас почему-то 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 на содержимое массива.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Можно ли объявлять классы внутри функций? А передавать созданные таким образом объекты в другие функции? Например, данный код выполняется,...
Добрый день! Никак не удаётся написать или найти программу, которая позволяла бы выводить на экран версию BIOS текущего компьютераНужен код...
Доброго дняПо заданию требуется записать в бинарник несколько массивов структур