実コア数以上スレッド数設定のOpenMPの動作  | 並列化フォーラム | フォーラム

iSUS に投稿されている記事の内容や、IA プラットフォーム上でのソフトウェア開発に関するトピックを開発者同士でディスカッションできる場としてフォーラムを公開しています。

運営ルールはフォーラムの利用案内をご覧ください。
フォーラムの使い方はこちら

 
フォーラムに投稿するにはログインが必要ですログイン

実コア数以上スレッド数設定のOpenMPの動作 

メンバー投稿

2:36 PM
2013年9月9日


yoshihingis

投稿数 54

1

 OpenMPで実コア数以上のスレッド数を設定した時の動作について教えてください。
 実は、下記のようなコードで、作成したOpenMPの含まれたDLLを作成しました。4コアのCPUで使用している時は問題なかったのですが、このDLLを2コアのPC(Htper Threading OFF)で使用し、DLLをLOAD FreeLibraryを繰り返すと1500回-1600回くらいの時点で、Access violationが生じて、プログラムが落ちます。
 omp_set_num_threads(2)として、2コアPCで動作させると、この現象はなくなります。
 OpenMPにて、論理コア+物理コア以上の数のスレッド数を設定すると、このような現象は起きてもおかしくはないものなのでしょうか?

 似たような経験をした方がいましたら、教えてください。

 以上よろしくお願いいたします。

omp_set_num_threads(3);

#pragma omp parallel for private(i,m,n,dAve,iOriginalNumber,offset) firstprivate(iReductionNumber,iTotal,iMatrix)
for(j = 0; j < iReductionHeight ; j += iReduction){

処理A

}

8:10 PM
2013年9月9日


iSUS編集部 – 菅原

投稿数 206

2

投稿は 8:22 PM – 2013年9月9日 に iSUS編集部 – 菅原 さんにより更新されました


yoshihingis 様

Visual C++でOpenMPを利用したDLLを作成すると、類似した問題が報告されているようです。ちなみに、DLLを作成しているコンパイラーと、DLLを飛び出すプログラムのビルドに利用されているコンパイラー(とバージョン)はなんでしょうか?

8:10 AM
2013年9月10日


yoshihingis

投稿数 54

3

 菅原様、情報ありがとうございました。

DLL側はインテルコンパイラw_ccompxe_p_14.0.0.103 OpenMP有りでビルド。
DLL呼び出し側はVisual Studio2010のMicrosoftコンパイラでビルドしております。

 

9:30 AM
2013年9月10日


iSUS編集部 – 菅原

投稿数 206

4

yoshihingis 様

おそらくメモリーリークが起こっていると思われます。実は、Visual C++ のOpenMP環境は、main プログラムにインテルコンパイラーのような OpenMP 初期化ルーチンがないので、繰り返しDLLをLoad/Freeすると、メモリーがうまく管理されないみたいです。

メイン側をインテルコンパイラーでコンパイルして、コンパイル時にメインではOpenMPを使用していなくても /Qopenmp オプションをつけてコンパイルしてみていただけますか?
OpenMPラインタイムの初期化ルーチンが呼び出されるので、問題が解決するかもしれません。

3:59 PM
2013年9月13日


yoshihingis

投稿数 54

5

菅原様 ご助言ありがとうございます。パフォーマンスモニターで見る限りメモリーリークはしていないようです。
 実はサポートの方にも検証をお願いしたのですが、不具合の再現性に問題があり、少し時間をかけて検証しようと思っています。
 ただ、この不具合を生じるコードをVTUNE XEにかけると、VTUNEが停止してしまい、こちらの方は再現性が確実なので、まずはこちらの不具合をサポートの方に協力して頂き、インテル様の方へ問い合わせて頂くこととしました。
 

1:57 PM
2014年2月5日


yoshihingis

投稿数 54

6

OpenMPを使用したDLLのLOAD-Freeを繰り返すと、プログラムが落ちる件ですが、サポートの方の協力もあり、インテル様でも現象が再現し、近々のアップデートで修正されると連絡を受けました。
 DLLをFreeしたとき、OpenMPを初期化するようですが、この初期化中に、次のLOADが行われると、エラーが生じてプログラムが落ちるようです。
 DLLを呼び出す上位側でもインテルコンパイラを使用してOpenMP使用でビルドすれば、初期化時間が短くなり、エラーは生じにくくなるようです。(実験上は、インテルコンパイラでDLL呼び出し側もOpenMP使用にした場合はプログラムが落ちたことは有りません)
 これはコア数、スレッド数に関係なく生じるようです

 現状では、OpenMP使用のDLLのLOAD-Freeは繰り返さない方が良いようです。
 取り急ぎご報告まで。