炼数成金 门户 CUDA 查看内容

OpenMP指令之指令格式和指令范围

2015-9-11 13:10| 发布者: 炼数成金_小数| 查看: 1429| 评论: 0|原作者: gengshenghong|来自: CSDN

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

函数

(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

鲜花

握手

雷人

路过

鸡蛋

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

热门文章

     

    GMT+8, 2020-1-21 20:26 , Processed in 0.155031 second(s), 23 queries .