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