5

这似乎是一个愚蠢的问题,但我正在学习 OpenMP,我对术语有点困惑。指令和构造是一回事吗?或者指令是一个包罗万象的词,包括结构和孤立指令?

我见过类似 PARALLEL Directivebut also之类的词PARALLEL Region Construct 并且在一些教程Work Sharing Constructs中列在OpenMP Directives.

Microsoft 页面让我认为整个下一行可能是一个指令:

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

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

如果有人能澄清一下,那就太好了:D

4

2 回答 2

3

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

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

第 22 页的第 2.1 节内容如下:

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

#pragma omp 指令名称 [clause[ [,] 子句]...] 换行符

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

指令区分大小写。

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

另一个方便的定义:

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

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

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

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

于 2013-03-12T23:06:27.657 回答
1

如果我没看错的话,指令就是 OpenMP 语句,比如

#pragma omp for

或者

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

指令可能包括子句,如private上面的语句或schedule(dynamic, CHUNKSIZE).

指令与代码结合形成一个结构。也就是说,构造是完成某事的模式。所以“并行构造”是一个parallel指令、它的可选子句和任何要执行的代码:

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

“工作共享构造”是一个parallel for指令,后跟循环的代码:

#pragma omp parallel for
for (i = 0; i < N; i++)
    a[i] = 2 * i;
于 2013-03-12T19:56:14.723 回答