9

オンラインのチュートリアルやリソースから OpenMP について学んでいます。parallel forループを使用して行列を2乗(それ自体で乗算)したい。IBM コンパイラーの資料で、 「反復変数はsigned整数でなければならない」という要件を見つけました。これは GCC 実装にも当てはまりますか? OpenMP 標準で指定されていますか? もしそうなら、この要件の理由はありますか?

(予想される次元は よりもはるかに小さいため、それほど重要ではありませんがINT_MAX、キャストが必要になります。)

4

4 に答える 4

10

なぜ unsigned OpenMP インデックス変数が許可されないのですか?からの引用 :

OpenMP 2.0 C/C++ API仕様 (pdf) のセクション 2.4.1 によると、これは for ループの制限の 1 つです。理由は示されていませんが、範囲が型の最大値をオーバーフローしないようにするための特別なコードがあるため、コードとコンパイラが行う必要がある仮定を単純化するためだと思います。

OpenMP 3.0 では unsigned 型も許可されているようですが、実際の動作はまだ見ていません。

つまり、これは標準の一部であり、次のバージョンでは符号なし整数が許可される予定です。

于 2010-10-21T14:31:05.963 に答える
8

その背後にある考えられる理由は次のとおりです。同じ記事はそれを言います

  • b, ub, incrループ不変の符号付き整数式であり、
  • exit_cond次の形式を取ります:iv <= ubまたはiv < ubまたはiv >= ubまたはiv > ubivあなたが尋ねる反復変数はどこにありますか)

条件にはexit_cond比較が含まれ、符号付き変数に対して比較が行われるため、符号付き/符号なしの比較で発生する可能性のある問題を回避するためにub、ループ変数に符号を付ける必要があります。iv

于 2010-10-21T14:35:11.037 に答える
7

OpenMP 3.0 仕様: http://www.openmp.org/mp-documents/spec30.pdfによると、変数は符号付きまたは符号なしの整数型である可能性があります。2.5.1 ループ構成を参照してください。問題は、特定の OpenMP 実装がこの最新の仕様と一致するかどうかです。

于 2010-10-21T14:33:34.500 に答える
3

についての最初の質問に答えるにはgcc。いいえ、次のような変数をgcc簡単に受け入れunsignedたりsize_tループしたりできるようです

#pragma omp parallel for
for (size_t i = 0; i < N; ++i) {
  /* do it */
}

少なくとも私のもの(64ビットubuntuのgcc v 4.4)は文句言わず、正しいことをします。

于 2010-10-21T15:36:05.133 に答える