如何解决并行处理-从站是否生成数据集?
| 在我的并行编程书中,我遇到了这段代码,该代码说从服务器生成数据集,但是,我认为主服务器是从手工生成数据集的。 特别是这行,是我相信master会生成数据集的原因。for (i=0; i < ARRAY_SIZE; i++)
numbers[i] = i;
有人可以确认主机还是从机生成数据集吗?
#include \"mpi.h\"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define TRIALS 20
#define ARRAY_SIZE 1000000
int main(int argc,char *argv[])
{
int myid,numprocs;
double startwtime,endwtime;
int namelen;
int* numbers = new int[ARRAY_SIZE];
int i,j,sum,part_sum;
int s,s0,startIndex,endIndex;
double totalTime;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stderr,\"Process %d on %s\\n\",myid,processor_name);
fflush(stderr);
for (i=0; i < ARRAY_SIZE; i++)
numbers[i] = i;
if (myid == 0)
{
s = (int) floor(ARRAY_SIZE/numprocs);
s0 = s + ARRAY_SIZE%numprocs;
//printf(\"s=%d,s0= %d\\n\",s,s0);
}
MPI_Bcast(&s,1,MPI_INT,MPI_COMM_WORLD);
MPI_Bcast(&s0,MPI_COMM_WORLD);
startIndex = s0 + (myid - 1)*s;
endIndex = startIndex + s;
totalTime = 0;
for (j = 1; j <= TRIALS; j++)
{
if (myid == 0)
{
startwtime = MPI_Wtime();
}
sum = 0;
part_sum = 0;
if (myid == 0) // master
{
// compute sum of master\'s numbers
for (i = 0; i < s0; i++)
{
part_sum += numbers[i];
}
}
else
{
for (i = startIndex; i < endIndex; i++)
{
part_sum += numbers[i];
}
}
MPI_Reduce(&part_sum,&sum,MPI_SUM,MPI_COMM_WORLD);
if (myid == 0)
{
double runTime;
endwtime = MPI_Wtime();
runTime = endwtime - startwtime;
printf(\"Trial %d : Execution time (sec) = %f\\n\",runTime);
printf(\"Sum = %d \\n\",sum);
totalTime += runTime;
}
} // end for
if (myid == 0)
printf(\"Average time for %d trials = %f\",TRIALS,totalTime/TRIALS);
MPI_Finalize();
}
解决方法
主机和从机都生成整个阵列。您必须记住,您的程序在所有节点上运行,并且所讨论的代码部分无法区分主/从。因此,您的书的措词没有错,但可以澄清。 :)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。