注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Hao的博客

I'm on my way……

 
 
 

日志

 
 
 
 

OPENMP随笔  

2010-10-05 10:14:38|  分类: 编程杂记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

      parallel和parallel for的区别在于,前者采用复制执行的方式,将代码在所有的线程内部执行一次。后者采用工作分配的方式,将循环所需的工作量按一定的方式分配到各个执行线程上。

比较下面两个程序段的输出:

    int i;
#pragma omp parallel
    for(i=0;i<5;i++){
         printf("i=%d\n",i);
    }


    int i;
#pragma omp parallel for
    for(int i=0;i<5;i++){
         printf("i=%d\n",i);
    }


      第一个程序段应该输出两套i=0~4,第二个程序段应该输出一套i=0~4,顺序根据实际情况有些不同(在执行过程中,环境变量OMP_NUM_THREADS=2)。但第一个程序段与预期不同,实际输出的是两个i=0和一套i=1~4。经分析,for循环代码被拷贝到了两个执行线程中,由于i变量在并行区外部定义,所以i被两个线程所共享。加上其中一个线程执行速度较快,很快就将i自增到了5,而此时另一个线程仅仅输出了i=0就发现变量i>4并退出了循环,所以就得到了上述结果。解决的方法有两个,一个是将i的定义移到循环中,即写成for(int i=0;i<5;i++),另一个方法就是明确要求在线程中使用与i同名的局部变量,即写成#pragma omp parallel private(i)。

备注:
      在将printf("i=%d\n",i)改成cout<<"i="<<i<<endl后,程序输出中有一段如下:
      i=i=0
      0
      这段输出明显是因为第一个线程输出i=后就被第二个线程打断,等第二个线程输出i=0后又继续输出的结果。很早以前就知道printf的速度比cout快很多,但是从来没有想过为什么。看了这个输出结果后,我似乎明白了一点。我的理解是cout<<"i="<<i<<endl实际上应该会被分为cout<<"i="、cout<<i、cout<<endl三次I/O访问,而printf("i=%d\n",i)应该只有一次I/O访问,所以速度上才会有那么大的差异。如果我的理解是对的,那么printf("Hello World!")和cout<<"Hello World!"的输出速度应该是相差不大的。

  评论这张
 
阅读(247)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017