omp指导语句后有双层for循环,内层循环与外层循环相互独立OR内层循环依赖于外层循环时,任务与线程分布关系

本人电脑2个CPU,每个CPU上有8个核,总共有2*8*2=32个逻辑CPU

结论:不管内层for循环是否依赖于外层for循环,其任务分配依据外层for循环迭代的次数来分配线程,这里下面1、2两种情况外层for循环均是32次,所以刚好将任务分为32个线程并行运行。

1、内层for循环依赖于外层for循环时

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

int main()
{
int n,i;
int csum_ch[32];
/*csum_ch[0]=0;*/

#pragma omp parallel for private(n,i,csum_ch,)
    for(n=0;n<32;n++){
      printf("n=%d id=%d\n",n,omp_get_thread_num());
      for(i=0;i<n;i++)
       {
         csum_ch[n]=i+1;
       }
       printf("csum_ch[%d]=%d id=%d\n",n,csum_ch[n],omp_get_thread_num());
    }
  /* printf("csum_ch[0]=%d\n",csum_ch[0]); */

}

vi project5.c

gcc -fopenmp -o project5 project5.c

./project5

输出:

n=6 id=6

csum_ch[6]=6 id=6
n=12 id=12
csum_ch[12]=12 id=12
n=15 id=15
csum_ch[15]=15 id=15
n=7 id=7
csum_ch[7]=7 id=7
n=25 id=25
csum_ch[25]=25 id=25
n=26 id=26
csum_ch[26]=26 id=26
n=10 id=10
csum_ch[10]=10 id=10
n=14 id=14
csum_ch[14]=14 id=14
n=8 id=8
csum_ch[8]=8 id=8
n=5 id=5
csum_ch[5]=5 id=5
n=22 id=22
csum_ch[22]=22 id=22
n=23 id=23
csum_ch[23]=23 id=23
n=21 id=21
csum_ch[21]=21 id=21
n=24 id=24
csum_ch[24]=24 id=24
n=11 id=11
csum_ch[11]=11 id=11
n=20 id=20
csum_ch[20]=20 id=20
n=29 id=29
csum_ch[29]=29 id=29
n=19 id=19
csum_ch[19]=19 id=19
n=1 id=1
csum_ch[1]=1 id=1
n=27 id=27
csum_ch[27]=27 id=27
n=4 id=4
csum_ch[4]=4 id=4
n=3 id=3
csum_ch[3]=3 id=3
n=16 id=16
csum_ch[16]=16 id=16
n=30 id=30
csum_ch[30]=30 id=30
n=28 id=28
csum_ch[28]=28 id=28
n=9 id=9
csum_ch[9]=9 id=9
n=2 id=2
csum_ch[2]=2 id=2
n=0 id=0
csum_ch[0]=32 id=0
n=13 id=13
csum_ch[13]=13 id=13
n=18 id=18
csum_ch[18]=18 id=18
n=17 id=17
csum_ch[17]=17 id=17
n=31 id=31

csum_ch[31]=31 id=31

不太明白初始csum_ch[0]的值为何不是0?

2、内层循环与外层循环相互独立时

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

int main()
{
int n,i;
int csum_ch[32];
/*csum_ch[0]=0;*/

#pragma omp parallel for private(n,i,csum_ch,)
    for(n=0;n<32;n++){
      printf("n=%d id=%d\n",n,omp_get_thread_num());
      for(i=0;i<5;i++)
       {
         csum_ch[n]+=i;
       }
       printf("csum_ch[%d]=%d id=%d\n",n,csum_ch[n],omp_get_thread_num());
    }
  /* printf("csum_ch[0]=%d\n",csum_ch[0]); */

}

vi project4.c

gcc -fopenmp -o project4 project4.c

./project4

输出:

n=27 id=27
csum_ch[27]=10 id=27
n=26 id=26
csum_ch[26]=10 id=26
n=13 id=13
csum_ch[13]=10 id=13
n=15 id=15
csum_ch[15]=10 id=15
n=30 id=30
csum_ch[30]=10 id=30
n=28 id=28
csum_ch[28]=10 id=28
n=0 id=0
csum_ch[0]=42 id=0
n=22 id=22
csum_ch[22]=10 id=22
n=25 id=25
csum_ch[25]=10 id=25
n=23 id=23
csum_ch[23]=10 id=23
n=24 id=24
csum_ch[24]=10 id=24
n=14 id=14
csum_ch[14]=10 id=14
n=6 id=6
csum_ch[6]=10 id=6
n=17 id=17
csum_ch[17]=10 id=17
n=12 id=12
n=2 id=2
csum_ch[2]=10 id=2
n=20 id=20
csum_ch[20]=10 id=20
n=4 id=4
csum_ch[4]=10 id=4
n=21 id=21
csum_ch[21]=10 id=21
n=29 id=29
csum_ch[29]=10 id=29
n=18 id=18
csum_ch[18]=10 id=18
n=3 id=3
csum_ch[3]=10 id=3
n=31 id=31
csum_ch[31]=10 id=31
n=19 id=19
csum_ch[19]=10 id=19
n=7 id=7
csum_ch[7]=10 id=7
n=1 id=1
csum_ch[1]=10 id=1
n=10 id=10
csum_ch[10]=10 id=10
n=5 id=5
csum_ch[5]=10 id=5
csum_ch[12]=10 id=12
n=9 id=9
csum_ch[9]=10 id=9
n=11 id=11
csum_ch[11]=10 id=11
n=8 id=8
csum_ch[8]=10 id=8
n=16 id=16

csum_ch[16]=10 id=16

不太明白初始csum_ch[0]的值为何不是0?

3、将第二种情况中的外层for迭代次数32改为33,

    cp project4.c project6.c

    vi project6.c (修改迭代次数, for(n=0;n<33;n++))

    gcc -fopenmp -o project6 project6.c

    ./project6

c源程序为

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

int main()
{
int n,i;
int csum_ch[33];
/*csum_ch[0]=0;*/

#pragma omp parallel for private(n,i,csum_ch,)
    for(n=0;n<33;n++){
      printf("n=%d id=%d\n",n,omp_get_thread_num());
      for(i=0;i<5;i++)
       {
         csum_ch[n]+=i;
       }
       printf("csum_ch[%d]=%d id=%d\n",n,csum_ch[n],omp_get_thread_num());
    }
  /* printf("csum_ch[0]=%d\n",csum_ch[0]); */

}

输出:n=0 id=0
csum_ch[0]=42 id=0
n=1 id=0
csum_ch[1]=10 id=0
n=2 id=1
csum_ch[2]=9 id=1
n=3 id=1
csum_ch[3]=10 id=1
n=22 id=11
csum_ch[22]=10 id=11
n=23 id=11
csum_ch[23]=10 id=11
n=30 id=15
csum_ch[30]=10 id=15
n=31 id=15
csum_ch[31]=10 id=15
n=26 id=13
csum_ch[26]=10 id=13
n=27 id=13
csum_ch[27]=10 id=13
n=32 id=16
csum_ch[32]=10 id=16
n=12 id=6
csum_ch[12]=10 id=6
n=13 id=6
csum_ch[13]=10 id=6
n=16 id=8
csum_ch[16]=10 id=8
n=17 id=8
csum_ch[17]=10 id=8
n=10 id=5
csum_ch[10]=10 id=5
n=6 id=3
csum_ch[6]=10 id=3
n=7 id=3
csum_ch[7]=10 id=3
n=28 id=14
csum_ch[28]=10 id=14
n=29 id=14
csum_ch[29]=10 id=14
n=20 id=10
csum_ch[20]=10 id=10
n=8 id=4
csum_ch[8]=10 id=4
n=9 id=4
csum_ch[9]=10 id=4
n=11 id=5
n=18 id=9
csum_ch[18]=10 id=9
n=19 id=9
n=4 id=2
csum_ch[4]=10 id=2
n=5 id=2
csum_ch[5]=10 id=2
csum_ch[11]=10 id=5
n=14 id=7
csum_ch[14]=10 id=7
n=15 id=7
csum_ch[15]=10 id=7
n=21 id=10
csum_ch[21]=10 id=10
n=24 id=12
csum_ch[24]=10 id=12
n=25 id=12
csum_ch[19]=10 id=9

csum_ch[25]=10 id=12

依然不清楚csum_ch[0]初始值的由来,请高人指点。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值