嵌套并行 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:不能同时使用 omp parallel for 和 omp task 吗? /错误:工作共享区域可能没有紧密嵌套在工作共享内