我有一段代码,其中有两个嵌套的for循环。当第一步有几步时,第二步有很多,而另一步则相反。我可以使用omp独立地运行这两个for循环,并且有一致的结果(和一些加速比)。不过,我想:
这不是嵌套并行,因为一个循环是并行的,另一个循环是并行的。如果我独立运行它们并运行顶级-H来查看线程,我有时只观察到一个线程,有时更多(在每种情况下),所以我想要做的事情是有意义的,并且实际上会提高性能?
到目前为止,我做了这样的事情:
#pragma omp parallel
{
#pragma omp for schedule(static,16)
for(...){
/* some declarations */
#pragma omp for schedule(static,16) nowait
for(...){
/* ... */
}
}
}它不编译(工作共享区域可能不会紧密嵌套在工作共享、批判性、有序性、主任务或显式任务区域内),而且它不会像我所描述的那样表现。我也尝试过崩溃,但是遇到了"/* some */“的问题,我想避免它,因为它是openmp3.0,而且我不确定目标硬件的编译器是否会支持它。
有什么想法吗?
发布于 2013-05-23 14:13:16
您不能嵌套绑定到同一个并行区域的工作共享结构,但是可以使用嵌套并行并使用if(condition)子句选择性地禁用这些区域。如果condition在运行时计算为true,则该区域处于活动状态,否则将依次执行。看起来是这样的:
/* Make sure nested parallelism is enabled */
omp_set_nested(1);
#pragma omp parallel for schedule(static) if(outer_steps>=16)
for(...){
/* some declarations */
#pragma omp parallel for if(outer_steps<16)
for(...){
/* ... */
}
}这里的缺点是,如果内部区域在运行时不处于活动状态,则会引入较小的开销。如果您希望提高效率,并准备为此牺牲可维护性,那么您可以根据outer_steps的值将嵌套循环和分支的两个不同实现编写到适当的实现。
https://stackoverflow.com/questions/16713985
复制相似问题