После того, как я передал свой окончательный массив в ранге 0 всем остальным узлам. Затем следует вернуться к циклу, и все узлы имеют одинаковый массив. Но на самом деле я получил оригинальный массив вместо массива после трансляции. Я использую MPI, чтобы сделать это. Я уверен, как использовать цикл в MPI. У меня есть программа, похожая на эту. Во-первых, мне нужно иметь дело с некоторыми вычислениями с массивом в каждом узле. Затем найдите один массив среди нужных мне узлов, затем я повторяю шаг с начала и делаю это снова и снова. Может ли кто-нибудь помочь мне с этим или дать мне лучшие способы сделать это? Спасибо всем.
int main(int argc, char** argv) {
//set array of long double to send
long double array[4][4]{0}, compenergy=0;
int size, rank;
int i, j;
int rank_lowest_energy, lowrank;
MPI_Status status;
struct {
long double val;
int rank;
} energy, lowenergy;
lowenergy.val = 0;
MPI_Init(NULL, NULL);
// Get the number of processes
size = MPI::COMM_WORLD.Get_size();
// Get the rank of the process
rank = MPI::COMM_WORLD.Get_rank();
for (int m = 0; m < 3; ++m)
{
//MPI::COMM_WORLD.Bcast(&array, 4*4, MPI::LONG_DOUBLE, 0);
if (rank == 0)
{
energy.val = 10000;
energy.rank = rank;
}
else
{
for (i = 0; i < rank; ++i)
array[rank][i] += rank;
energy.val = rank + 10 - array[rank][0]- lowenergy.val;
energy.rank = rank;
}
MPI_Allreduce(&energy, &lowenergy, 1, MPI_LONG_DOUBLE_INT, MPI_MINLOC, MPI_COMM_WORLD);
if (rank == lowenergy.rank)
MPI::COMM_WORLD.Send(&array, 4 * 4, MPI::LONG_DOUBLE, 0, 0);
if (rank == 0)
{
MPI::COMM_WORLD.Recv(&array, 4 * 4, MPI::LONG_DOUBLE, MPI::ANY_SOURCE, MPI::ANY_TAG);
cout << "Its rank is: " << lowenergy.rank << "\n";
cout<< "Its value is: "<<lowenergy.val<<"\n";
for (i = 0; i < 4; ++i)
{
for (j = 0; j < 4; ++j)
cout << array[i][j] << " ";
cout << "\n";
}
MPI::COMM_WORLD.Bcast(&lowenergy, 1, MPI::LONG_DOUBLE_INT, 0);
}
MPI::COMM_WORLD.Bcast(&array, 4*4, MPI::LONG_DOUBLE, 0);
}
MPI::Finalize();
}