合并openmp区域会带来性能优势吗?

时间:2013-08-13 17:46:23

标签: c parallel-processing mpi openmp

我有一个纯粹的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()    

}

做这样的事情会有益吗?

1 个答案:

答案 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也将被并行化,那么后面的实现应该会给你一个更好的加速。