如果我们希望 OpenMP 线程按顺序执行,我们必须使用该ordered
子句。但是,我们必须小心。以下将按i
顺序打印(和线程ID)(i
从0
到19
,tid从0
到omp_get_num_threads() - 1
):
#pragma omp parallel
#pragma omp for ordered
for (i = 0; i < 20; i++)
#pragma omp ordered
printf("i=%d - tid=%d\n", i, omp_get_thread_num());
输出(在我的 8 核 intel x86_64 机器中):
i=0 - tid=0
i=1 - tid=0
i=2 - tid=0
i=3 - tid=1
i=4 - tid=1
i=5 - tid=1
i=6 - tid=2
i=7 - tid=2
i=8 - tid=2
i=9 - tid=3
i=10 - tid=3
i=11 - tid=3
i=12 - tid=4
i=13 - tid=4
i=14 - tid=5
i=15 - tid=5
i=16 - tid=6
i=17 - tid=6
i=18 - tid=7
i=19 - tid=7
但请注意:
#pragma omp parallel
#pragma omp for ordered
for (i = 0; i < 20; i++)
{
// the threads enter this for() section in order but won't
// print this statement in order!
printf("other i=%d - tid=%d\n", i, omp_get_thread_num());
#pragma omp ordered
// these are printed in order
printf("i=%d - tid=%d\n", i, omp_get_thread_num());
}
输出:
other i=16 - tid=6
other i=18 - tid=7
other i=12 - tid=4
other i=0 - tid=0
i=0 - tid=0
other i=1 - tid=0
i=1 - tid=0
other i=2 - tid=0
i=2 - tid=0
other i=3 - tid=1
other i=6 - tid=2
other i=14 - tid=5
i=3 - tid=1
other i=4 - tid=1
i=4 - tid=1
other i=5 - tid=1
i=5 - tid=1
i=6 - tid=2
other i=7 - tid=2
i=7 - tid=2
other i=8 - tid=2
i=8 - tid=2
other i=9 - tid=3
i=9 - tid=3
other i=10 - tid=3
i=10 - tid=3
other i=11 - tid=3
i=11 - tid=3
i=12 - tid=4
other i=13 - tid=4
i=13 - tid=4
i=14 - tid=5
other i=15 - tid=5
i=15 - tid=5
i=16 - tid=6
other i=17 - tid=6
i=17 - tid=6
i=18 - tid=7
other i=19 - tid=7
i=19 - tid=7
最后请注意,这个数组是按顺序填充的:
// threads filling up array
int Arr[20] = {0};
#pragma omp parallel for ordered
for (i = 0; i < 20; i++)
Arr[i] = i;
printf("\n\n");
// lets check to see if threads have put values to the array in order
for (i = 0; i < 20; i++)
printf("Arr[%d]=%d\n", i, Arr[i]);
输出:
A[0]=0
A[1]=1
A[2]=2
A[3]=3
A[4]=4
A[5]=5
A[6]=6
A[7]=7
A[8]=8
A[9]=9
A[10]=10
A[11]=11
A[12]=12
A[13]=13
A[14]=14
A[15]=15
A[16]=16
A[17]=17
A[18]=18
A[19]=19