OpenMP 学习(二)

一、OpenMP的并行定义

一个并行区域 是一段代码,被所有的线程同时执行。

master线程的线程ID总是0

对线程的设置要在进入并行区域之前

IF 语句可以被使用来确保并行区域。当条件语句的值是“false”时,代码串行执行。

语句格式

#pragma omp directive [clause[clause]...]

延续性:在pragma中使用 \

OpenMP 子句

许多OpenMP指令支持 子句,这些子句 为指令提供许多额外信息。

比如,private(a) 是 for指令的子句

#pragma omp for private(a)

不同指令对应不同可以使用的子句

例子 

dingx@stoker:~$ cat 1.c
#include 
#include 
int main()
{
	int a[10],b[10];
	int i,j;
	int x = 21;
	#pragma omp parallel for default(none) \
		private(i) shared(a,b,x)
	for (i=0; i<10; i++)
	{
		a[i] = x*i; 
		b[i] = x-i;
	}
	#pragma omp parallel if(10>5) \
		shared(a,b) private(i)
	{
		#pragma omp for
		for(i=0; i<10; i++)
		{	
			a[i] += b[i];
			printf("%d\n",i);
		}
	}

}
执行结果

dingx@stoker:~$ gcc -fopenmp 1.c -o 1
dingx@stoker:~$ ./1
4
3
9
6
1
7
8
5
2
0

OpenMP性能例子

OpenMP 学习(二)_第1张图片

从这幅图可以看出,在OpenMP中,我们可以使用if语句避免执行性能低下。


二、If 子句

if(数量级表达式)

只有在if表达式的值为真时,程序并行执行,如果表达式的值不为真,串行执行。

#pragma omp parallel if( n> some_threhold) \
	shared(n,x,y) private(i)
{
	#pragma omp for
	for (i=0; i

三、barrier(界限)

何时使用barrier

数据异步,并且要保证数据完整性时

比如:某一部分代码要同时读写同一块存储区域

barrier代价比较高,使用需要考虑清楚。

#pragma omp barrier

四、nowait 子句

为了最小化同步时间,许多OpenMP指令支持nowait子句

#pragma omp for nowait

ORACLE官方例子

OpenMP 学习(二)_第2张图片




你可能感兴趣的:(OpenMP)