Parallel processing Openmp调度

Parallel processing Openmp调度,parallel-processing,openmp,Parallel Processing,Openmp,我有一段带有两个嵌套for循环的代码。当第一个步骤很少时,第二个步骤很多,反之亦然。我可以使用omp for指令独立地运行这两个for循环,并且我有一致的结果(和一些加速)。然而,我想: 如果有16个步骤或更多步骤,则并行运行第一个步骤 否则,并行运行第二个步骤(但不运行第一个步骤,即使它有8个步骤) 这不是嵌套并行,因为一个循环是并行的,或者另一个是并行的。如果我独立运行它们并运行top-H来查看线程,我有时只观察一个线程,有时观察更多线程(在每种情况下),那么我想做的事情是有意义的,并且实际

我有一段带有两个嵌套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{}中编写了两个不同的并行区域。这很难看,但效率很高。当我在寻找优雅的东西时,我会尝试你的解决方案。