首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Openmp调度

Openmp调度
EN

Stack Overflow用户
提问于 2013-05-23 12:29:58
回答 1查看 168关注 0票数 0

我有一段代码,其中有两个嵌套的for循环。当第一步有几步时,第二步有很多,而另一步则相反。我可以使用omp独立地运行这两个for循环,并且有一致的结果(和一些加速比)。不过,我想:

  1. 如果第一个步骤有16个或更多步骤,则并行运行第一个
  2. 否则并行运行第二个步骤(但即使有8个步骤也不能运行第一个步骤)

这不是嵌套并行,因为一个循环是并行的,另一个循环是并行的。如果我独立运行它们并运行顶级-H来查看线程,我有时只观察到一个线程,有时更多(在每种情况下),所以我想要做的事情是有意义的,并且实际上会提高性能?

到目前为止,我做了这样的事情:

代码语言:javascript
复制
#pragma omp parallel
{
    #pragma omp for schedule(static,16)
    for(...){
        /* some declarations */
        #pragma omp for schedule(static,16) nowait
        for(...){
            /* ... */
        }
    }
}

它不编译(工作共享区域可能不会紧密嵌套在工作共享、批判性、有序性、主任务或显式任务区域内),而且它不会像我所描述的那样表现。我也尝试过崩溃,但是遇到了"/* some */“的问题,我想避免它,因为它是openmp3.0,而且我不确定目标硬件的编译器是否会支持它。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-23 14:13:16

您不能嵌套绑定到同一个并行区域的工作共享结构,但是可以使用嵌套并行并使用if(condition)子句选择性地禁用这些区域。如果condition在运行时计算为true,则该区域处于活动状态,否则将依次执行。看起来是这样的:

代码语言:javascript
复制
/* 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的值将嵌套循环和分支的两个不同实现编写到适当的实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16713985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档