混合mpi/openmp与纯mpi的性能差异

问题描述 投票:0回答:1

我测试了一个简单的混合 mpi/openmp 编程:

void  mpi_openmp_run ()
{
   double t00 = MPI_Wtime();   

   for(std::size_t tit=0; tit<1000; ++tit)
   {
    
    int tid ;
    
    double t0, t1;
    
    #pragma omp parallel private(tid, t0, t1)
    {
      
        t0 = MPI_Wtime();

        #pragma omp for
        for(std::size_t zindex=0; zindex<10000000000; zindex++)    
            {
                    tid = omp_get_thread_num();

            }      
  
        t1 = MPI_Wtime(); 

        #pragma omp barrier 
        if(tid==0)
        {
            std::cout <<" Multithread wall clock: "<<<< t1-t0<<" in threads: " << omp_get_thread_num()<<std::endl;
        }
        
    }

   double t11=MPI_Wtime();   


    if(myrank==0)
    {
        printf("Wall Clock = %15.6f\n",t11-t00);
    }
}

我用2个cpu * 2个线程测试了代码,我得到了

每个线程的运行时间约为2.062,总时间为404.56

如果我只使用 1 个 cpu + 4 个线程,我得到了

每个线程的运行时间约为1.039,总时间为202.79

我想知道为什么存在约 2 倍的差异,因为在这个简单的示例中,CPU 之间没有通信。

在这次测试中,我基本上分配了相同数量的计算资源(2*2=4)。这会带来同样的表现吗?这对我来说真的很困惑。

mpi openmp
1个回答
0
投票

您的实际问题已经解决,但我想我应该提供一些关于混合计算的想法。

  1. 很难制作一个混合模型优于纯 MPI 的玩具示例。
  2. 如果您的工作负载非常不规律,使用 OpenMP
    dynamic
    时间表可能会以 MPI 无法做到的方式分散工作。
  3. 如果您有一个集群,并且核心数量较多(我的机器每个节点有 50-100 个核心),纯 MPI 会生成许多小消息,而混合会生成一个大消息。这可能会产生影响,尽管目前尚不清楚朝什么方向发展。
  4. 如果所有进程都需要访问同一数据集,MPI 可能会有更大的内存需求,而 OpenMP 会将其存储在共享内存中,但您可以通过使用 MPI 共享内存来抵消这种情况。
© www.soinside.com 2019 - 2024. All rights reserved.