如何正确并行化内循环:
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循环可以提高性能?
答案 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
的示例