【发布时间】:2013-05-23 12:29:58
【问题描述】:
我有一段带有两个嵌套 for 循环的代码。当第一个步骤很少时,第二个步骤很多,反之亦然。我可以使用 omp for 指令独立运行两个 for 循环,并且我有一致的结果(和一些加速)。但是我想:
- 如果第一个步骤有 16 步或更多,则并行运行它
- 否则并行运行第二个(但不是第一个,即使它有 8 个步骤)
这不是嵌套并行,因为要么一个循环是并行的,要么另一个是并行的。如果我独立运行它们并运行 top -H 来查看线程,我有时只观察到一个线程,有时会更多(在每种情况下),所以我想做的事情会有意义并且实际上会提高性能吗?
到目前为止,我做了这样的事情:
#pragma omp parallel
{
#pragma omp for schedule(static,16)
for(...){
/* some declarations */
#pragma omp for schedule(static,16) nowait
for(...){
/* ... */
}
}
}
不能编译(工作共享区域可能没有紧密嵌套在工作共享、关键、有序、主或显式任务区域内),并且无论如何都不会像我描述的那样运行。 我也尝试过崩溃,但“/* some declarations */”有问题,我想避免它,因为它是 openmp3.0,我不确定目标硬件的编译器是否支持这个。
有什么想法吗?
【问题讨论】:
标签: parallel-processing openmp