OpenMP - 指令和构造之间的差异

时间:2013-03-12 18:47:30

标签: openmp

这可能看起来像一个愚蠢的问题,但我正在学习OpenMP,我对术语有点困惑。 指令和构造是一样的吗?或指令是一个无所不包的单词,包括结构和孤立的指令?

我看过像这样的词 PARALLEL DirectivePARALLEL Region Construct 在某些教程Work Sharing Constructs中列出了OpenMP Directives

Microsoft page让我觉得可能整个下一行都是一个指令:

 #pragma omp directive-name  [clause[ [,] clause]...] new-line

由于声明,“每个指令都以#pragma omp 开头”。这意味着单词parallelfor(以及其他单词)是构造。然而,与此同时,在上面完全相同的一行中,他们将directive-name放在了pragma之后。

如果有人能澄清,那就太棒了:D

2 个答案:

答案 0 :(得分:3)

实际阅读OpenMP specification并不可耻。 §1.2.2完全专注于OpenMP术语。人们可以在其中找到各种定义,包括:

  

指令 - 在C / C ++中,#pragma,在Fortran中,注释,指定 OpenMP程序行为。注释:有关OpenMP 指令语法的说明,请参见第22页的第2.1节。

第22页第2.1节内容为:

  

使用pragma预处理指令指定C / C ++的OpenMP指令。 OpenMP指令的语法由附录C中的语法正式指定,并且非正式地指定如下:

     

#pragma omp directive-name [clause [[,] clause] ...] new-line

     

每个指令都以#pragma omp开头。该指令的其余部分遵循编译器指令的C和C ++标准的约定。特别是,可以在#之前和之后使用空格,有时必须使用空格来分隔指令中的单词。 <{1}}之后的预处理令牌可以进行宏替换。

     

指令区分大小写。

     

OpenMP可执行指令最多适用于一个后续语句,该语句必须是结构化块。

另一个方便的定义:

  

可执行指令 - 不是声明性的OpenMP 指令。也就是说,它可以放在可执行的上下文中。注释:除#pragma omp 指令之外的所有指令都是可执行指令

然后是构造,在前两个术语中解释:

  

构建 - OpenMP 可执行指令(对于Fortran,配对结束 指令,如果有的话)以及相关的语句,循环或结构化块,如果有的话,不包括任何被调用例程中的代码。也就是说,在可执行指令的词汇范围内。

微软的页面只引用了早期(很多)早期OpenMP规范的部分内容。

答案 1 :(得分:1)

如果我正确读取此内容,指令是OpenMP语句,例如

#pragma omp for

#pragma omp parallel private(th_id) shared(nthreads)

指令可能包含子句,例如上面的private声明或schedule(dynamic, CHUNKSIZE)

指令与代码结合形成构造。也就是说,构造是一个模式来完成某些事情。所以&#34;并行构造&#34;是一个parallel指令,它的可选子句,以及任何要执行的代码:

#pragma omp parallel
  printf("Hello, world.\n");

A&#34;工作共享结构&#34;是一个parallel for指令,后跟循环代码:

#pragma omp parallel for
for (i = 0; i < N; i++)
    a[i] = 2 * i;