質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

1841閲覧

[VS2012→VS2019]C++でのOpenMPでC1001コンパイラ内部エラーが発生

ononon

総合スコア4

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/06 02:29

前提・実現したいこと

VS2012で作成したプログラムをVS2019(16.6.3)にアップグレードして使用したい。

発生している問題・エラーメッセージ

C1001 内部コンパイラエラーが発生しました。

該当のソースコード

C++

1int main() 2{ 3 #pragma omp parallel for //エラーが発生する箇所 4 for(int y=o;y<5;y++){ 5 ... 6 } 7  8 try{ 9 ... 10 catch(std::exception e){ 11 ... 12 } 13 catch(...) { 14 ... 15 } 16}

試したこと/わかったこと

・エラーが発生している箇所は「#pragma omp parallel for」
・「catch(std::exception e)」を削除するとエラーはなくなる。
⇒「catch(...)」は問題ない
・同一メソッド内に「#pragma omp parallel for」と「catch(std::exception e)」があるとエラーになる。
・試しに"std::exception e"を"int a"など色々変更してみたがエラーは消えず。
・プロパティで共通言語ランタイムサポートを「使用しない」にするとエラーはなくなる。
⇒共通言語ランタイムサポートを「使用しない」にすると当たり前のように多くのエラーが発生するので、
「使用しない」にするのは厳しい。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2020/07/06 03:04

単に例外補足を外に出すのではだめなのですかね?ラッパー関数をかませることで大抵の問題は解決するのですが
ononon

2020/07/06 04:32

例外補足を外に出すのは厳しいと考えています。 記載したサンプルコードでは並列処理外にTryCatchを記載していますが、実際のコードでは並列処理内にもTryCatchがあり、continueしています。 また、OpenMPには以下のような規約があります。 「並列領域内で実行される throw は、同じ構造化ブロックの動的な範囲内で実行が再開される必要があります。また、例外をスローしたのと同じスレッドでキャッチする必要があります。」 上記より例外処理の外出しは難しいです。
guest

回答2

0

解決はしていないのですが、以下のDeveloper Communityの記載にあるように
issueとして扱われているようなので現時点ではvc142のバグと判断しました。

https://developercommunity.visualstudio.com/content/problem/729125/internal-compiler-error-when-using-openmp-and-tryc.html

投稿2020/07/09 12:27

ononon

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2020/07/09 12:30

本質的に複雑性が高すぎるんでしょうね・・・
guest

0

やっぱりC++/CLIとOpenMPを併用はこう悪魔合体的なものを感じます。

C++17でSTLのalgorithm系関数が並列化に対応しましたので、それの利用を検討してください。

あといずれにしても並列中の例外はスレッド内で捕捉されないとabortすると思いますのでご注意ください。

投稿2020/07/06 10:54

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問