从我的代码和跟踪工具(Scalasca)中,当重载和欠载更改时,我会从相同的代码中获得各种成本。
我在Google上搜索过,但我找不到任何关于过载和欠载的解释,以及它对通信成本的影响。
任何人都可以为我解释一下吗?我们可以通过任何方法将其修复为恒定值吗?
我在同一个集群上完成了。 这是我的代码:
void MST_BCast(void* data,int root,int left,int right,MPI_Datatype datatype,MPI_Comm communicator,int count)
{
if(left==right) return;
int me;
MPI_Comm_rank(communicator, &me);
int world_size;
MPI_Comm_size(communicator, &world_size);
int mid=(int)floor(((float)(left+right)/2));
int dest;
if(root<=mid)
dest=right;
else
dest=left;
printf("left=%d-right=%d,me=%d,mid=%d,dest=%d\n",left,right,me,mid,dest);
if(me==root)
MPI_Send(data, count, datatype, dest, 0, communicator);
if(me==dest)
{
MPI_Recv(data, count, datatype, root, 0, communicator, MPI_STATUS_IGNORE);
}
if((me<=mid)&&(root<=mid))
MST_BCast(data,root,left,mid,datatype,communicator,count);
else if((me<=mid)&&(root>mid))
MST_BCast(data,dest,left,mid,datatype,communicator,count);
else if((me>mid)&&(root<=mid))
MST_BCast(data,dest,mid+1,right,datatype,communicator,count);
else if((me>mid)&&(root>mid))
MST_BCast(data,root,mid+1,right,datatype,communicator,count);
;
}
void test(void* buff,int world_size)
{
int i;
for(i=0;i<100;i++)
{
MPI_Barrier(MPI_COMM_WORLD);
MST_BCast(buff,0,0,world_size-1, MPI_INT,MPI_COMM_WORLD,400);
MPI_Barrier(MPI_COMM_WORLD);
}
}
int main(int argc, char** argv) {
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
int world_rank,world_size,namelen;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int* buff=(int*) malloc(world_size*sizeof(int)*100);
int i;
for (i = 0; i < world_size*100; i++) {
if(world_rank==0)
buff[i]=10;
else
buff[i]=world_rank;
}
test(buff,world_size);
MPI_Finalize();
return (EXIT_SUCCESS);
}