1

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

}

做这样的事情会有好处吗?

4

1 回答 1

1

我认为您当前的实施不关注阿姆达尔定律(如果您愿意,请在谷歌上搜索)。鉴于您仅并行化了 90% 的代码,您可以要求的最佳加速(给定 8 个内核)是:

Speedup =  1.0 / (p_{seq} + (1 - p_{parallel}) / #cores)

在你的情况下是:

Speedup = 1.0 / ( 0.1 + 0.9 / 8) = 4.71

因此,您当前的 openmp 并行化完全符合预期。长答案简短:是的,如果这意味着函数 1 和 2 也将被并行化,那么以后的实现应该会给你一个更好的加速。

于 2013-08-19T01:50:30.367 回答