関数による OpenMP* 構造の不正終了

関数により OpenMP* 構造が不正に終了されています。

OpenMP* 構造は、一般に構造ブロック、つまり、単一のエントリー/終了ポイントを持つ文に適用されます。OpenMP* 構造内で呼び出される関数は、longjmp の呼び出しや構造外でキャッチされる C++ 例外スローによって構造外へ移動することはできません。同様に、並列領域内での setjmp の使用も、標準ではない制御フローから領域に入ることができるようになるため、許可されていません。

このような方法で OpenMP* 構造の内側/外側へ移動すると、ランタイム環境を管理する重要なコンパイラー生成コードが省略されます。そのため、このような間接的な制御フローは、OpenMP* ランタイム環境の整合性を阻害します。C 終了ルーチンと FORTRAN STOP ルーチンは OpenMP* 構造内で呼び出すことができます。これらのルーチンは OpenMP* 構造を間接的に終了すると同時に、通常、プロセスを終了させます。

ID

問題箇所

説明

1

OpenMP* の使用方法に関するエラー

不正終了が発生した場所


#include <cstdio>
#include <stdexcept>
#include <omp.h>

int main(int argc, char **argv)
{
    try {
        #pragma omp parallel for ordered
        for (int i = 1; i < 100; i++) {
            if (i > 10) {
                // bad: exception not caught
                // inside parallel region
                throw std::runtime_error("test");
            }
        #pragma omp ordered
            printf("test: %d\n", i);
        }
    } catch (std::runtime_error) {
    }
    return 0;
}
        

© 2010 Intel Corporation. 無断での引用、転載を禁じます。