Изучаю параллельное программирование (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 на содержимое массива.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники