这可能看起来像一个愚蠢的问题,但我正在学习OpenMP,我对术语有点困惑。 指令和构造是一样的吗?或指令是一个无所不包的单词,包括结构和孤立的指令?
我看过像这样的词
PARALLEL Directive
还PARALLEL Region Construct
在某些教程Work Sharing Constructs
中列出了OpenMP Directives
。
Microsoft page让我觉得可能整个下一行都是一个指令:
#pragma omp directive-name [clause[ [,] clause]...] new-line
由于声明,“每个指令都以#pragma omp 开头”。这意味着单词parallel
和for
(以及其他单词)是构造。然而,与此同时,在上面完全相同的一行中,他们将directive-name
放在了pragma之后。
如果有人能澄清,那就太棒了:D
答案 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;