如何正确使用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
答案 0 :(得分:3)
OpenMP ordered
子句应该用于两个不同的阶段:
for
指令的一个子句,用于指示迭代的一些可能顺序;然后所以从本质上讲,你的例子应该是:
#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
然而,这里有两个评论:
ordered
指令ordered
指令引起的序列化影响,则应使用schedule
指令。有效的&#34;有效的&#34;例如,在有序循环的情况下,调度将是schedule( static, 1 )
。最后,Hristo Iliev解释这一切比我能够here
更好。