加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

openmp reduction的介绍

(2018-01-12 09:22:32)
标签:

gpu

分类: 并行编程:GPU/MPI/OPEN***

竞态条件(race condition):

这是所有多线程编程最棘手的问题。当多个线程并行执行时,有可能多个线程同时对某变量进行了读写操作,从而导致不可预知的结果。

比如,对于包含10个整型元素的数组a,我们用for循环求它各元素之和,并将结果保存在变量sum里。

openMP为我们提供了另一个工具,归约(reduction)

reduction很方便,但它支持一些基本操作,比如+,-,*,&,|,&&,||等。


#pragma omp parallel for reduction(+:sum)

 

[cpp] view plain copy
  1. void reduction_test()  
  2.  
  3.     int sum 0;  
  4.     int a[10] {1,2,3,4,5,6,7,8,9,10};  
  5. #pragma omp parallel for reduction(+:sum)  
  6.     for (int i=0;i<10;i++)  
  7.      
  8.         sum sum a[i];  
  9.      
  10.     printf("Sum: %d\n"sum);  
  11.  

上面代码里,我们在#pragma omp parallel for 后面加上了 reduction(+:sum),它的意思是告诉编译器:下面的for循环你要分成多个线程跑,但每个线程都要保存变量sum的拷贝,循环结束后,所有线程把自己的sum累加起来作为最后的输出。

 


有些情况下,我们既要避免race condition,但涉及到的操作又超出了reduction的能力范围。

这就要用到openMP的另一个工具,critical

执行到critical里面时,要注意有没有其他线程正在里面执行,如果有的话,要等其他线程执行完再进去执行。这样就避免了race condition问题,但显而易见,它的执行速度会变低,因为可能存在线程等待的情况。

比如,求数组a的最大值,将结果保存在max里。

#pragma omp critical

 

[cpp] view plain copy
  1. void critical_test()  
  2.  
  3.     int max 0;  
  4.     int a[10] {11,2,33,49,113,20,321,250,689,16};  
  5. #pragma omp parallel for  
  6.     for (int i=0;i<10;i++)  
  7.      
  8.         int temp a[i];  
  9. #pragma omp critical  
  10.          
  11.             if (temp max)  
  12.                 max temp;  
  13.          
  14.      
  15.     printf("Max: %d\n"max);  
  16.  

 

 

用#pragma omp critical将 if (temp > max) max = temp 括了起来,它的意思是:各个线程还是并行执行for里面的语句,但当你们执行到critical里面时,要注意有没有其他线程正在里面执行,如果有的话,要等其他线程执行完再进去执行。


http://s2/mw690/006TEzk1zy7hjnW6CAN51&690reduction的介绍" TITLE="openmp reduction的介绍" />


注意reduction与private之类的不一起用,看例程用了语法不可以而且传不到外面了

http://s5/mw690/006TEzk1zy7hjnWBSQI74&690reduction的介绍" TITLE="openmp reduction的介绍" />


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有