C++ MPI循环中的数据传递
在我向所有其他节点广播秩为0的最终数组之后。然后它应该返回到循环,所有节点都具有相同的数组。但事实上,我得到的是原始阵列,而不是广播后的阵列。我正在使用MPI来做这件事。我确信如何在MPI中使用循环。我有一个类似的程序。首先,我需要对每个节点中的数组进行一些计算。然后在我需要的节点中找到一个数组,然后从头开始重复这个步骤,并一次又一次地重复。有人能帮我吗,或者给我更好的方法吗?谢谢大家C++ MPI循环中的数据传递,c++,arrays,loops,mpi,broadcast,C++,Arrays,Loops,Mpi,Broadcast,在我向所有其他节点广播秩为0的最终数组之后。然后它应该返回到循环,所有节点都具有相同的数组。但事实上,我得到的是原始阵列,而不是广播后的阵列。我正在使用MPI来做这件事。我确信如何在MPI中使用循环。我有一个类似的程序。首先,我需要对每个节点中的数组进行一些计算。然后在我需要的节点中找到一个数组,然后从头开始重复这个步骤,并一次又一次地重复。有人能帮我吗,或者给我更好的方法吗?谢谢大家 int main(int argc, char** argv) { //set array of l
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();
}
int main(int argc,char**argv){
//设置要发送的长双精度数组
长双数组[4][4]{0},compenergy=0;
整数大小、等级;
int i,j;
最低能量,低秩;
MPI_状态;
结构{
长双瓣;
整数秩;
}能量,低能量;
lowenergy.val=0;
MPI_Init(NULL,NULL);
//获取进程数
size=MPI::COMM_WORLD.Get_size();
//获取进程的等级
rank=MPI::COMM_WORLD.Get_rank();
对于(int m=0;m<3;++m)
{
//MPI::COMM_WORLD.Bcast(&array,4*4,MPI::LONG_DOUBLE,0);
如果(秩==0)
{
energy.val=10000;
能量等级=等级;
}
其他的
{
对于(i=0;i 无法正确设置代码格式。您不应该广播lowenergy
@ptb抱歉,我不明白您的意思。请您详细解释一下好吗?@GillesGouaillardet,如果我不广播lowenergy,我可以在开始新循环时获得值吗?格式已经更正。