嵌套并行omp v.2.0性能

时间:2016-12-14 09:57:15

标签: c++ parallel-processing openmp

如何正确并行化内循环:

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循环使用嵌套方法。

请注意我知道崩溃条款,但我不能使用它(感谢visual studio不支持更高版本的openMP)。

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

您是否认为通过并行化函数()内部的for循环可以提高性能?

1 个答案:

答案 0 :(得分: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

的示例