5

これはばかげた質問のように思えるかもしれませんが、私は OpenMP を学んでいるので、用語について少し混乱しています。ディレクティブとコンストラクトは同じものですか? それとも、ディレクティブは、構成要素と孤立したディレクティブを含む包括的な単語ですか?

のような単語を見 たことPARALLEL DirectiveがありますがPARALLEL Region Construct 、いくつかのチュートリアルWork Sharing Constructsでは、の下にリストされていOpenMP Directivesます。

Microsoftのページを見ると、次の行全体がディレクティブである可能性があると思われます。

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

「各ディレクティブは #pragma omp で始まる」という文言のため。そして、これは単語paralleland for(およびその他) が構成要素であることを意味します。しかし、同時に、上記のまったく同じ行でdirective-name、プラグマの直後に配置しています。

誰かが明確にできれば、それは素晴らしいことです:D

4

2 に答える 2

3

OpenMPの仕様を実際に読むことは恥ずべきことではありません。§1.2.2 は、OpenMP 用語に専念しています。その中には、次のようなさまざまな定義があります。

ディレクティブ- C/C++ では 、 Fortran ではOpenMP プログラムの動作#pragmaを指定するコメント。コメント: OpenMPディレクティブ構文の説明については、22 ページのセクション 2.1 を参照してください。

22 ページのセクション 2.1 には次のように書かれています。

C/C++ の OpenMP ディレクティブは、pragma前処理ディレクティブで指定されます。OpenMP ディレクティブの構文は、正式には付録 C の文法で指定され、非公式には次のように指定されます。

#pragma omp ディレクティブ名 [節[ [,] 節]...] 改行

各ディレクティブは で始まり#pragma ompます。ディレクティブの残りの部分は、コンパイラ ディレクティブの C および C++ 標準の規則に従います。特に、空白は の前後に使用でき#、ディレクティブ内の単語を区切るために空白を使用する必要がある場合もあります。に続く前処理トークン#pragma ompは、マクロ置換の対象となります。

ディレクティブは大文字と小文字が区別されます。

OpenMP 実行可能ディレクティブは、最大 1 つの後続のステートメント (構造化ブロックでなければならない) に適用されます。

別の便利な定義:

実行可能ディレクティブ-宣言型ではないOpenMPディレクティブ。つまり、実行可能なコンテキストに置くことができます。コメント:ディレクティブを除くすべてのthreadprivate ディレクティブ実行可能なディレクティブです。

次に、前の 2 つの用語で説明した構成が続きます。

construct - OpenMP実行可能ディレクティブ(および Fortran の場合は、ペアのend ディレクティブ) と、関連付けられているステートメント、ループ、または構造化ブロック(存在する場合)。呼び出されたルーチンのコードは含まれません。つまり、実行可能なディレクティブの字句範囲内です。

Microsoft のページでは、(かなり) 以前の 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 に答える