【问题标题】:nested parallel omp v. 2.0 performance嵌套并行 omp v. 2.0 性能
【发布时间】:2016-12-14 09:57:15
【问题描述】:

如何正确并行化内循环:

int found = -1;
#pragma omp parallel for ordered schedule(dynamic, 1) shared(found) 
for (long i = 0; i < big_number; ++i)
{
  if( function() )
  { 
    #pragma omp ordered
    if( found == -1 )
    {
       found = i;
    }
  }
}

bool function()
{
   for(int i =0; i < another_big_number;  i++)
   {
     if( some_condition)
     {
       return true;
     }
   }
}

我无法发布整个代码,但我保留了大部分似乎对这个问题很有必要的部分。第一个循环的想法是找到函数返回 true 的最低迭代。

编辑当然,任何关于改进并行化的想法都值得赞赏,但是,我的问题更多是关于如何使用外部 for 循环来提高 function() 本身的性能嵌套方法。

请注意,我知道折叠子句,但是我不能使用它(感谢不支持更高版本的 openMP 的 Visual Studio)。

任何改进整个并行循环的想法都值得赞赏。 :)

您认为通过在 function() 中并行化 for 循环会提高性能吗?

【问题讨论】:

    标签: c++ multithreading parallel-processing openmp


    【解决方案1】:

    这段代码有很多问题,首先你不能用这种方式进行循环(找到返回)此外这个顺序没有多大意义,至少对于你提供的代码块,使用flush确实实现了break循环,类似于:

    boolean found = false;
    long return_value = -1;
    
    #pragma omp parallel for schedule(dynamic, 1) shared(found, return_value) 
    for (long i = 0; i < big_number; ++i)
    {
      #pragma omp flush (found)
      if(!found)
      {
          if( function() ){
             found = true;
             return_value = i;
             #pragma omp flush (found)
    
          }
      }
    }
    

    也可以:

    long return_value = -1;
    
    #pragma omp parallel for schedule(dynamic, 1) shared(return_value) 
    for (long i = 0; i < big_number; ++i)
    {
        if( function() ){
    
             #pragma omp critical
             {
                return_value = i;
             }
    
             #pragma omp cancel for 
          }
       #pragma omp cancellation point for
    }
    

    基于here的示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 2021-06-30
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多