OpenMP Tutorial学习笔记(3)OpenMP指令之指令格式和指令范围

OpenMP Tutorial:https://computing.llnl.gov/tutorials/openMP/#Directives

OpenMp Directives


(1)OpenMP指令格式


指令基本规则:

大小写敏感;每个指令只能指定一个directive-name(指令名称);每一个指令最多应用于一个后继语句,语句必须是一个结构块(structured block);长指令可以使用反斜线("\")分行书写。


(2)OpenMP指令作用范围

为何要讨论指令范围?看下面的例子:

foo()
{
	#pragma omp parallel
	{
	#pragma omp do
	...
	sub1();
	...
	sub2();
	...
	}
}

sub1() 
{
	...
	#pragma omp critical
	{
	}
	...
}

sub2() 
{
	...
	#pragma omp section
	{
	}
	}
	...
}
函数foo()调用函数sub1和sub2。三个函数都是用了OpenMP指令,所以存在指令的嵌套,如果不符合OpenMP的规则,那么就会导致指令被忽略或出现错误。

1. Static(Lexical)Extent:静态扩展。如上面的例子foo()中do指令出现在parallel的并行块中,就属于静态扩展。这样的指令不能跨函数或者跨文件。

2. Orphaned Directive:孤立指令。如上面例子中的critical和section,都是孤立存在的,不存在于任何并行区域中,它属于静态扩展区域之外的部分。会跨函数或文件。

3. Dynamic Extent:动态扩展。对于OpenMP,上面的foo函数,由于调用了子函数,结合起来,critical和section就出现在了do和parallel的动态扩展范围内。

这里的三种情况是比较容易理解的,OpenMP之所以这样区分,是为了更好的描述其嵌套规则。具体规则参考:

https://computing.llnl.gov/tutorials/openMP/#BindingNesting


 

你可能感兴趣的:(OpenMP Tutorial学习笔记(3)OpenMP指令之指令格式和指令范围)