我测试了一个简单的混合 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)。这会带来同样的表现吗?这对我来说真的很困惑。
您的实际问题已经解决,但我想我应该提供一些关于混合计算的想法。
dynamic
时间表可能会以 MPI 无法做到的方式分散工作。