OpenMP有序条款

时间:2015-11-27 12:37:25

标签: c loops for-loop parallel-processing openmp

如何正确使用OpenMP中的ordered子句?有一个测试代码来检查循环是否会通过增加n的值来执行,但情况并非总是如此。

我是否误解了有序条款的定义?

  

有序构造指定循环区域中的结构化块   这将按循环迭代的顺序执行。这个   在有序区域内对代码进行顺序化和排序   允许区域外的代码并行运行。

    #include <stdio.h>
    #include <stdlib.h>
    #include <omp.h>

    int main(){

        int n;
    omp_set_num_threads(4);
    #pragma omp parallel
        {
    #pragma omp for ordered
            for (n=0;n<10;n++)
                printf("n = %d\n",n);
        }
        return 0;
    }

使用

进行编译时
   gcc -Wall -Wextra -fopenmp test_par.c

输出

    ./a.out 
    n = 0 
    n = 1 
    n = 2 
    n = 9 
    n = 3 
    n = 4 
    n = 5 
    n = 6 
    n = 7 
    n = 8 

1 个答案:

答案 0 :(得分:3)

OpenMP ordered子句应该用于两个不同的阶段:

  1. 作为for指令的一个子句,用于指示迭代的一些可能顺序;然后
  2. 作为一个独立的指令,用于指示循环中语句的哪些部分要保持有序。
  3. 所以从本质上讲,你的例子应该是:

    #include <stdio.h>
    #include <stdlib.h>
    #include <omp.h>
    
    int main(){
    
        int n;
        omp_set_num_threads(4);
        #pragma omp parallel
        {
            #pragma omp for ordered
            for (n=0;n<10;n++)
                #pragma omp ordered
                printf("n = %d\n",n);
        }
        return 0;
    }
    

    给出了:

    $ g++ -fopenmp order.cc
    $ ./a.out 
    n = 0
    n = 1
    n = 2
    n = 3
    n = 4
    n = 5
    n = 6
    n = 7
    n = 8
    n = 9
    

    然而,这里有两个评论:

    1. 这个并行循环实际上是完全顺序化的,因为ordered指令
    2. 之外没有任何内容
    3. 此外,如果要减轻ordered指令引起的序列化影响,则应使用schedule指令。有效的&#34;有效的&#34;例如,在有序循环的情况下,调度将是schedule( static, 1 )
    4. 最后,Hristo Iliev解释这一切比我能够here

      更好。