openmp reduction的介绍

标签:
gpu |
分类: 并行编程:GPU/MPI/OPEN*** |
竞态条件(race condition):
这是所有多线程编程最棘手的问题。当多个线程并行执行时,有可能多个线程同时对某变量进行了读写操作,从而导致不可预知的结果。
比如,对于包含10个整型元素的数组a,我们用for循环求它各元素之和,并将结果保存在变量sum里。
openMP为我们提供了另一个工具,归约(reduction)
reduction很方便,但它支持一些基本操作,比如+,-,*,&,|,&&,||等。
#pragma omp
parallel for reduction(+:sum)
上面代码里,我们在#pragma omp parallel for 后面加上了 reduction(+:sum),它的意思是告诉编译器:下面的for循环你要分成多个线程跑,但每个线程都要保存变量sum的拷贝,循环结束后,所有线程把自己的sum累加起来作为最后的输出。
有些情况下,我们既要避免race condition,但涉及到的操作又超出了reduction的能力范围。
这就要用到openMP的另一个工具,critical。
执行到critical里面时,要注意有没有其他线程正在里面执行,如果有的话,要等其他线程执行完再进去执行。这样就避免了race
condition问题,但显而易见,它的执行速度会变低,因为可能存在线程等待的情况。
比如,求数组a的最大值,将结果保存在max里。
#pragma omp critical
用#pragma omp critical将 if (temp > max) max = temp
括了起来,它的意思是:各个线程还是并行执行for里面的语句,但当你们执行到critical里面时,要注意有没有其他线程正在里面执行,如果有的话,要等其他线程执行完再进去执行。
注意reduction与private之类的不一起用,看例程用了语法不可以而且传不到外面了
http://s5/mw690/006TEzk1zy7hjnWBSQI74&690reduction的介绍" TITLE="openmp