関数により 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. 無断での引用、転載を禁じます。