Parallel processing MPI延迟测量

Parallel processing MPI延迟测量,parallel-processing,mpi,openmpi,latency,Parallel Processing,Mpi,Openmpi,Latency,我试图了解MPI的一些方面。 在创建该程序的过程中(该程序用于测量两个进程的发送/接收之间的延迟),我遇到了奇怪的效果。 我试图测量多次迭代的结果,收到了与其他基准匹配的响应。然后我决定显示值​​每次迭代后,他们都会感到惊讶:他们的值介于四个值之间​​这一点没有改变。我还提请注意一些非常高的值 计算延迟值和样本值的代码如下: int main() { MPI::Init(); Proc_Rank = MPI::COMM_WORLD.Get_rank(); for(int

我试图了解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);
    }
}

为什么4个固定值随机重复?为什么会有罕见的非常大的值?

正如祖兰所指出的那样,
MPI\u Wtime
使用的计时器的分辨率不是无限的。您可以通过调用<代码> MPIIWITKK<代码>(C++中的代码> MPI::Wtick < /代码>)来查询定时器分辨率。测量持续时间少于一微秒的单个乒乓球回合容易产生非常高的统计不确定性,特别是因为操作系统抖动(由于在同一CPU上调度其他操作系统活动或进程而导致的进程执行的随机延迟)可能是几微秒。没有一个值得尊敬的MPI基准会用空消息打乒乓球


作为旁注,您正在其中一个进程中使用通配符receive(
MPI\u ANY\u标记
)。这些往往比完全指定的接收速度慢,尤其是在网络设备方面。

您使用的MPI实现、网络和列组位置是什么?您的计时器的粒度似乎为
0.119209 us
。此外,MPI中的C++绑定已经被AGEs标准所禁止,现在正式删除。@ Zulan,谢谢您的回复!我有多处理器AMD Opteron群集,每个节点上有两个处理器。我使用这个参数来运行mpirn-np2-mca btl self、vader-npersocket 2./mpi_测试。这意味着,两个进程应该放在一个套接字上。实现是OpenMPI 1.10.2。我知道,这是一个非常旧的版本,但当我尝试OpenMPI2.0.2时,它给出的结果要慢得多。这个效果是否取决于我用来制作OpenMPI的编译器?当我使用OpenMPI运行这个程序时,它给了我这样的结果:12.8042884171 1.7514685169 1.6943085939 1.8496066332 1.6870908439 2.2621825337 1.5635741875 10.5821527541 1.9228318706 1.6321428120 1.6000121832 1.43598229947 1.6195699573 1.72143339 1.59675252 1.5596160665 1.4917459339如果您试图进行适当的评估,您应该使用已建立的MPI基准,例如和。与您的问题无关,但我认为您不需要两个缓冲区。您可以使用单缓冲区进行发送/接收,因为您使用的是阻塞呼叫。感谢您的精彩解释!你能解释一下为什么OpenMPI 2.0.2的结果比旧版本(1.10.2)慢得多吗?考虑到我使用相同的参数运行完全相同的程序这一事实,从它所依赖的角度来看,并不是所有的OpenMPI版本都是相同的。与1.x分支相比,2.x分支的某些部分发生了重大变化。
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