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