我有一个纯粹的MPI并行代码。 MPI在8个内核中可以很好地扩展。但是,由于内存要求,我不得不使用混合代码。我的代码有以下结构
for( A Sequential loop for 10e5 iterations)
{
highly_parallelizable_function_call_1()
some_sequential_work
highly_parallelizable_function_call_2()
some_sequential_work
MPI_send()
MPI_recv()
highly_parallelizable_function_call_3()
highly_parallelizable_function_call_4()
}
大致的功能3和4占90%的时间。我将功能3和4更改为openmp并行代码。分析显示我只能加速4-5。因此,此代码可能无法像MPI单独代码那样扩展。我怀疑这可能是由于线程开销造成的。为了避免这种情况,我想将此代码更改为仅在开头创建线程,如下所示
#pragma omp parallel
for( A Sequential loop for 10e5 iterations)
{
parallel_version_function_call_1()
if( thread_id==0) some_sequential_work
parallel_version_function_call_2()
if( thread_id==0) some_sequential_work
if( thread_id==0) MPI_send()
if( thread_id==0) MPI_recv()
parallel_version_function_call_3()
parallel_version_function_call_4()
}
做这样的事情会有益吗?
答案 0 :(得分:1)
我认为您当前的实施并没有注意Amdahl定律(如果您愿意,可以谷歌)。鉴于您只对90%的代码进行了并行化,您可以要求的最佳加速(给定8个内核)是:
Speedup = 1.0 / (p_{seq} + (1 - p_{parallel}) / #cores)
在你的情况下是:
Speedup = 1.0 / ( 0.1 + 0.9 / 8) = 4.71
因此,您当前的openmp并行化正在完成预期的工作。 简短回答:是的,如果这意味着函数1和2也将被并行化,那么后面的实现应该会给你一个更好的加速。