我有一个纯 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()
}
做这样的事情会有好处吗?