collapse(多层for循环的分配)

2020-04-02  本文已影响0人  小幸运Q

小心i的执行顺序不一定是按照逻辑次序。因为分配给对应线程,对应线程的启动还有先后,这个是随机的。(parallel与for之间不能有{)

# 不适用collapse,则只注意到第一个for,忽略了里面嵌套的第二个for
int i,j;
#pragma omp parallel num_threads(6)
#pragma omp for schedule(dynamic)
for(i=0;i<3;i++)
    for(j=0;j<3;j++){
        printf("i=%d,j=%d,thread=%d\n",i,j,omp_get_thread_num()) ;           
    }
/*
i=2,j=0,thread=0
i=2,j=1,thread=0
i=2,j=2,thread=0
i=1,j=0,thread=2
i=0,j=0,thread=1
*/
int i,j;
#pragma omp parallel num_threads(6)
#pragma omp for schedule(dynamic) collapse(2)
for(i=0;i<3;i++)
    for(j=0;j<3;j++){
        printf("i=%d,j=%d,thread=%d\n",i,j,omp_get_thread_num()) ;           
    }
/*
i=0,j=2,thread=5
i=2,j=0,thread=5
i=2,j=1,thread=5
i=2,j=2,thread=5
i=0,j=1,thread=3
i=1,j=2,thread=4
i=1,j=0,thread=1
i=1,j=1,thread=2
i=0,j=0,thread=0
*/
# 可以看到i=0,j=1还没执行,i=2,j=2都执行了,说明并不会严格按照i=0->2的顺序来。
上一篇 下一篇

猜你喜欢

热点阅读