【问题标题】:Would merging openmp regions give a performance benefit?合并 openmp 区域会带来性能优势吗?
【发布时间】:2013-08-13 17:46:23
【问题描述】:

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

}

这样做会有好处吗?

【问题讨论】:

  • 正在进行中。这是一个非常庞大的代码,大约 4000 行。现在我正在编写函数调用的并行版本(并包装本地 omp 并行编译指示)

标签: c parallel-processing mpi openmp


【解决方案1】:

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

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

你的情况是:

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

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

【讨论】:

  • 感谢您的回答。然而,当我说我只获得 4-5 的加速时,那是关于个人加速而不是整体加速。
猜你喜欢
  • 2011-03-16
  • 2015-01-06
  • 2016-08-09
  • 1970-01-01
  • 2019-08-03
  • 2012-02-18
  • 2010-09-12
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多