none
[VS2012→VS2019]C++でのOpneMPでC1001コンパイラ内部エラー RRS feed

  • 質問

  • VS2012で問題なかった以下のC++コードがVS2019でビルドエラー(C1001)になってしまいます。

    VS2019のバージョンは16.6.3です

    ****************************************

    int main()
    {
     #pragma omp parallel for
     for (int y = 0; y < 5; y++)
     {
      try
      {
       ...
      }
      catch (std::exception e)
      {
       ...
      }
     }
    }

    ****************************************

    [状況]

    ・「#pragma omp parallel for」をコメントアウトするとエラーは消えます。

    ・「catch (std::exception e)」を「catch (...)」に変更するとエラーは消えます。

    上記より、OpenMPの処理とcatch句の"std::exception e"の組み合わせでエラーが

    発生していると考えます。

    ちなみに、既存のプログラムであるため、並列処理は必要です。

    また、catch内でエラー内容を出力しているため、「...」にはできません。

    catch句の記載方法をいろいろ変更して試したのですが、「...」にする以外には

    ビルドエラーが消えません。。。

    その他プロパティをいろいろ変更したりしたのですが、OpenMPを有効に

    している限りビルドエラーは消えませんでした。

    原因、解決方法のご教授をお願いします。

    2020年7月3日 11:26

すべての返信

  • try { ...; } catch (std::exception& e) { ...; } catch (...) { ...; }

    でだめですか? ちなみに次の制約があります。

    並列領域内で実行される throw は、同じ構造化ブロックの動的な範囲内で実行が再開される必要があります。また、例外をスローしたのと同じスレッドでキャッチする必要があります。
    2020年7月3日 12:50
  • アドバイスありがとうございます。

    提案いただいた記載を試してみましたがダメでした。。。

    2020年7月5日 23:54
  • エラーが発生している状況について追加報告させていただきます。

    以下のようなコードでもエラーが発生します。

    並列処理外であっても、同一メソッド内に「catch (...)」以外のcatch句があるとエラーが発生します。

    また、共通言語ランタイムサポートを未使用にするとビルドが成功しました。

    ****************************************
    int main()
    {
     #pragma omp parallel for
     for (int y = 0; y < 5; y++)
     {
      …
     }
     
     try
     {
      ...
     }
     catch (std::exception e)
     {
      ...
     }
     catch (...)
     {
      …
     }
    }
    ****************************************




    • 編集済み onononnon 2020年7月6日 1:55
    2020年7月6日 1:43
  • onononnonさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    OpenMPは、複数の独立した操作を同時に実行できる多数のスレッドを生成するように設計されています。 
    OpenMP仕様では、スレッドが並列領域の終わりを経由するパス以外の終了コードパスを持つことを禁止しています。 

    returnステートメントを使用するか、また並列領域外のラベルに移動するか。 
    もしそうなら、この問題を解決するために「return」行を削除してみることをお勧めします。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年7月7日 7:31
    モデレータ
  • アドバイスありがとうございます。

    すいません。サンプルで記載したコードはmain()になっていますが、実際はmain関数ではないので終了コードに関する

    ご指摘は関係のないものと考えます。

    また、終了コードで考えた場合でも「catch(std::exception e)」を削除するとエラーが発生しないこと、

    VS2012では問題なかったがVS2019でエラーになることが理解できない状況です。

    2020年7月7日 8:20
  • 確認ですが、VS2012でも共通言語ランタイムサポートを有効化していたのでしょうか?

    2020年7月7日 9:17
  • VS2012でも共通言語ランタイムサポートを有効化しています。
    • 編集済み onononnon 2020年7月7日 11:58
    2020年7月7日 11:57
  • onononnonさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    https://developercommunity.visualstudio.com/content/problem/729125/internal-compiler-error-when-using-openmp-and-tryc.htmlによると、これは一つのissueのようです。

    より良いサポートのため、 [Developer Community]にご投稿することをお勧めします。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年7月9日 8:24
    モデレータ