Parallel processing Openmp调度
我有一段带有两个嵌套for循环的代码。当第一个步骤很少时,第二个步骤很多,反之亦然。我可以使用omp for指令独立地运行这两个for循环,并且我有一致的结果(和一些加速)。然而,我想:Parallel processing Openmp调度,parallel-processing,openmp,Parallel Processing,Openmp,我有一段带有两个嵌套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(...){
/* ... */
}
}
}
/* 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(...){
/* ... */
}
}
它不会编译(工作共享区域可能不会紧密嵌套在工作共享、关键、有序、主任务或显式任务区域中),并且不会像我描述的那样运行。
我也尝试过崩溃,但在“/*一些声明*/”方面遇到了问题,我想避免它,因为它是openmp3.0,我不确定目标硬件的编译器是否支持它
有什么想法吗?您不能嵌套绑定到同一并行区域的工作共享构造,但可以使用嵌套并行并使用
if(condition)
子句有选择地停用这些区域。如果运行时条件
的计算结果为真
,则该区域处于活动状态,否则它将串行执行。它看起来是这样的:
#pragma omp parallel
{
#pragma omp for schedule(static,16)
for(...){
/* some declarations */
#pragma omp for schedule(static,16) nowait
for(...){
/* ... */
}
}
}
/* 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(...){
/* ... */
}
}
/*确保已启用嵌套并行性*/
omp_集合_嵌套(1);
#如果(外部步骤>=16),则计划(静态)的pragma omp并行
对于(…){
/*一些声明*/
#pragma omp parallel for if(outer_stepsHi,谢谢。事实上,正如你所说,我最终在if(){}else{}中编写了两个不同的并行区域。这很难看,但效率很高。当我在寻找优雅的东西时,我会尝试你的解决方案。