嵌套并行 omp v. 2.0 性能

Posted

技术标签:

【中文标题】嵌套并行 omp v. 2.0 性能【英文标题】:nested parallel omp v. 2.0 performance 【发布时间】: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 循环会提高性能吗?

【问题讨论】:

【参考方案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的示例

【讨论】:

以上是关于嵌套并行 omp v. 2.0 性能的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP OpenBLAS 嵌套并行

使用 openMP v. 2.0 并行化过滤器迭代器

VS2017 中嵌套循环的 OMP

OpenMP:不能同时使用 omp parallel for 和 omp task 吗? /错误:工作共享区域可能没有紧密嵌套在工作共享内

嵌套循环中未正确忽略内部循环的 Pragma omp parallel

OpenMP 矩阵乘法嵌套循环