执行什么控制MPI_屏障时间

执行什么控制MPI_屏障时间,mpi,openmpi,mpich,Mpi,Openmpi,Mpich,此代码: #include <mpi.h> int main(int argc, char* argv[]) { MPI_Init(&argc, &argv); for (unsigned int iter = 0 ; iter < 1000 ; iter++) MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); return 0; } 在具有4个cpu核的8个处理器

此代码:

#include <mpi.h>

int main(int argc, char* argv[])
{
    MPI_Init(&argc, &argv);

    for (unsigned int iter = 0 ; iter < 1000 ; iter++)
        MPI_Barrier(MPI_COMM_WORLD);

    MPI_Finalize();

    return 0;
}
在具有4个cpu核的8个处理器的桌面上:

| MPI size | MPICH 1.4.1p1 | openmpi 1.8.4 | MPICH 3.1.4 |
|----------|---------------|---------------|-------------|
|  2       | 0.01          | 0.39          | 0.01        |
|  4       | 0.02          | 0.39          | 0.01        |
|  8       | 0.14          | 0.45          | 27.28       |
| 16       | 0.34          | 0.53          | 71.56       |
| MPI size | MPICH 1.4.1p1 | openmpi 1.8.4 | MPICH 3.1.4 |
|----------|---------------|---------------|-------------|
|  2       | 0.00          | 0.41          | 0.00        |
|  4       | 0.01          | 0.41          | 0.01        |
|  8       | 0.07          | 0.45          | 2.57        |
| 16       | 0.36          | 0.54          | 61.76       |

是什么解释了这种差异,以及如何控制这种差异?

您使用的是
MPI size
>可用的处理器数量。由于MPI程序的生成方式是每个进程由单个处理器处理,这意味着,例如,当您在8核机器上运行
MPI size==16
时,每个处理器将负责两个进程;这不会使程序变得更快,事实上,正如您所看到的那样,会使程序变得更慢。解决这个问题的方法是要么让一台机器有更多可用的处理器,要么确保你的代码使用
MPI大小
什么样的硬件设置来运行?4个内核可能位于同一个节点上,因此MPI实现可以在没有网络通信的情况下同步进程。我编辑了这个问题,给出了另一台机器上的数量、内核和时间。您所说的“8个处理器,4个cpu”是什么意思?超阅读?如果是,那么它们就不是真正的处理器,您不能期望它们会有完全的加速。在这两个版本之间的某个时间点,MPICH通过TCP从ch3:sock切换到ch3:nemesis。后者具有共享内存优化,这需要繁忙的等待,在超额订阅的情况下,这种等待不会扩展。如果您使用ch3:sock构建,您将恢复以前的行为。您应该只对屏障计时。我怀疑Init的时间是MPICH和OpenMPI之间的主要区别,但超额订阅的情况除外。