我试图了解MPI的某些方面。 在程序的创建过程中,我测量了两个进程的发送/接收之间的延迟,我遇到了奇怪的影响。 我尝试测量多次迭代的结果,并收到与其他基准匹配的响应。然后我决定在每次迭代后显示值并感到惊讶:它们介于四个未更改的值之间。我还提请注意一些非常高的价值观。
计算延迟和样本值的代码如下:
int main()
{
MPI::Init();
Proc_Rank = MPI::COMM_WORLD.Get_rank();
for(int i = 0; i < 100; ++i)
latency_test(Proc_Rank, 1, 0);
MPI::Finalize();
return 0;
}
void latency_test(int Proc_Rank, int Iterations_Num, int Size)
{
double Total_Time, Latency;
double t1, t2;
char *Send_Buffer = new char[Size];
char *Recv_Buffer = new char[Size];
for(int i = 0; i < Size; i++){
Send_Buffer[i] = 'a';
}
for(int i = 0; i < Size; i++){
Recv_Buffer[i] = 'b';
}
MPI::COMM_WORLD.Barrier();
t1 = MPI::Wtime();
for(int i = 0; i < Iterations_Num; i++){
if (Proc_Rank == 0){
MPI::COMM_WORLD.Send(Send_Buffer, Size, MPI::CHAR, 1, 0);
MPI::COMM_WORLD.Recv(Recv_Buffer,Size,MPI::CHAR,1,
MPI::ANY_TAG);
}
else if (Proc_Rank==1) { MPI::COMM_WORLD.Recv(Recv_Buffer,Size,MPI::CHAR,0,MPI::ANY_TAG);
MPI::COMM_WORLD.Send(Send_Buffer, Size, MPI::CHAR, 0, 0);
}
}
t2 = MPI::Wtime();
delete []Send_Buffer;
delete []Recv_Buffer;
Total_Time = t2-t1;
if(Proc_Rank == 0){
Latency = (Total_Time / (Iterations_Num * 2.0)) * 1000000.0;
printf("%10.10f\n", Latency);
}
}
部分结果:
5.4836273193
1.0728836060
0.9536743164
1.0728836060
0.4768371582
0.9536743164
0.5960464478
6.5565109253
0.9536743164
0.9536743164
1.0728836060
0.5960464478
0.4768371582
0.4768371582
为什么4个固定值会随机重复?为什么有罕见的非常大的值?
答案 0 :(得分:2)
正如Zulan所指出的,MPI_Wtime
使用的计时器的分辨率并非无限大。您可以通过调用{+ 1}}(C ++绑定中的MPI_Wtick
)来查询计时器分辨率。测量持续时间不到一微秒的单个乒乓圆非常容易出现非常高的统计不确定性,特别是因为OS抖动,即由于其他OS活动或进程在同一CPU上调度而导致的进程执行的随机延迟,可能是几微秒。没有受人尊敬的MPI基准测试可以使用空消息进行单个乒乓球比赛。
作为旁注,您正在其中一个进程中使用通配符接收(MPI::Wtick
)。那些往往比完全指定的接收慢,特别是在网络设备方面。