我开发了这个简单的函数,用mpi在并行环境中执行n数的和,使用每个处理器计算其部分和的策略,然后在成对不同的情况下,处理器在它们之间通信计算的数量,创建一个二叉树。当然,如果处理器的数量是2 ^ n的倍数,则可以应用此策略。
参数:menum = id processor,nproc =处理器总数,sum =部分和
void Second_Strategy( int menum ,int nproc,int sum, MPI_Status status)
{
int a,b,p,i,sumtmp;
double t_tot, t1, t2, diff;
p=log(nproc)/log(2);
t1 = MPI_Wtime();
for(i=1;i<=p;i++)
{
b=pow(2,i-1);
a=pow(2,i);
if ( (menum % a) ==0)
{
MPI_Recv(&sumtmp,1,MPI_INT,(menum+b),i,MPI_COMM_WORLD,&status);
sum=sum+sumtmp;
}else{
if ( ( menum % b) ==0){MPI_Send(&sum,1,MPI_INT,(menum-b),i,MPI_COMM_WORLD); }
}
}
t2 = MPI_Wtime();
diff = t2-t1;
MPI_Reduce(&diff, &t_tot, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);
if(menum==0)
{
printf("The sum is : %d \n ",sum);
printf("Time : %f seconds\n", t_tot);
}
}
在这种情况下,过程P0将是总和的结果。但是在用户要选择具有引入参数“选择”的总和的处理器的情况下。怎么做?我在为进程之间的数据交换创建二叉树时遇到了问题。
答案 0 :(得分:2)
最直接的解决方案是创建一个新的通信器,其中用户选择的进程获得等级0.然后在您的树构建算法中使用该通信器而不是MPI_COMM_WORLD
。
我当然假设你这样做是为了进行并行通信练习,而不是总结数字的目的,因为使用MPI_Reduce()
可以很容易地获得总和。