ちょっと複雑な並列モデルはOpenMPで実現可能でしょうか。 | 並列化フォーラム | フォーラム

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

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

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

ちょっと複雑な並列モデルはOpenMPで実現可能でしょうか。

メンバー投稿

2:08 PM
2012年12月28日


yoshihingis

投稿数 54

1

 OpenMPは、単純なデータ並列コードを容易に作成でき非常に便利ですが以下のような並列モデルは実現可能でしょうか?
(1)CPUは6個の実コアを有していると仮定
(2)4つの異なったタスク(A,B,C,D)があり、まずこれを#pragma omp sections
  で4並列化します。
 (3)section並列化されたタスクの内、AとBには、for分があるので、これをさらにparallel forで2スレッドで並列化する。

AとBには2コアづつ割り当てられ、CとDは1コアで動作すれば、6コアで並列化できる事になりますが、AとBのfor文を明示的に2コアで動作させる手法がどうも思いつきません。

 こういう並列モデルはOpenMPのみでは無理なのでしょうか?

 A,B,C,Dが異なるインテルIPPのマルチスレッド対応関数で、これをsectionsで4並列化し、A,BのIPP関数をippSetNumThreadsで2スレッドで動作できるとすれば、可能のような気がしますが。

 初歩的な質問ですいませんが、どなたかお知恵を拝借できれば幸いです。

コードで書けば以下の様な感じになると思います。
#pragma omp paralle
{
#pragma omp sections
{
#pragma omp section
{
//task A
#pragma omp for
for(i=0;i<100;i++){
}
}

#pragma omp section
{
//task B
#pragma omp for
for(j=0;j<100;j++){
}
}

#pragma omp section
{
//task C

}

#pragma omp section
{
//task D

}

}//__pragma omp sections

}//__pragma omp paralle

11:30 AM
2012年12月29日


iSUS編集部 – 菅原

投稿数 206

2

yoshihingis さん

こんにちは。

残念ながら記述いただいたようなOpenMP構文は許されません。
OpenMPでは、section 構文の中で omp for 構文の記述を許しません。
上記のソースをコンパイルすると、その趣旨のメッセージが表示されるはずです。

OpenMPでは、並列領域内で並列領域を定義すると、過剰にスレッドが生成される傾向があるため、あまり向いているとは言えません。この辺の考察はiSUS記事を参照ください。

で、どうするかというと、上記ソースのfor文をOpenMPではなく、cilk plus を使用して、for を cilk_for に置き換えればこのソース構造のまま並列化できます。ただ、section 構造の中でタスクを生成できるようになるだけで、実際の計算でパフォーマンスがどうなるかは、

お試しあれ。

すがわら

10:45 PM
2012年12月29日


yoshihingis

投稿数 54

3

菅原様

 いつもながらご丁寧な回答ありがとうございます。
 実は、パイプライン処理を行おうと考えています。
 OpenMPで手取り早くコードを作って所望の動作はしているのですが、次のステップに進もうとして悩みが出てきました。
 まぁ、御用納めしましたから、休み中は、少し仕事のことは忘れて、新年また、いろいろとご相談させていただきます。

 菅原さまも良い年をお迎えください。

11:33 PM
2012年12月29日


iSUS編集部 – 菅原

投稿数 206

4

yoshihingis 様

パイプラインですか。それは是非年明けにでも TBBの parallel_pipeline をお試しください。詳しくは、書籍で!!

こちらこそ、iSUSを引き立てていただきありがとうございます。

A Happy New yaer !!

菅原

8:45 AM
2012年12月30日


yoshihingis

投稿数 54

5

菅原様

 やはりパイプラインはTBBを使用ですかね。
 今までは、OpenMPの単純データ並列や、IPP,MKLのライブラリで用が足りていたのですが、新年からは、複雑な並列モデルを扱わないと目的が達成できそうにありません。
 来年は、スキルアップのためにもTBBを勉強していきたいと思っております。

 正月休みは、しっかり休んで充電しないと・・。

9:13 PM
2013年1月22日


yoshihingis

投稿数 54

6

ふと思ったのですが、Xeon Phiまで使用しなくても、CPUを4個搭載できるマザーボードは容易に入手できます。
 6コアコアのCPUを4個搭載して、1CPUに1つのパイプライン処理を割り当てれば、CPU4個で4段のパイプラインが組め、なおかつ6コアCPUなので、1パイプライン内の処理を6並列で高速化できると思ったのですが、こうのようなシステムは可能なのでしょうか?
まず、4つのCPUは非同期で動作するので、CPU間同士のデータの受け渡しがうまくいかにような気がします。
 また4個つのCPUを仮にA,B,C,Dとしたとき、1段目のパイプラインをCPU-Aに、2段目のパイプラインをCPU-Bに・・・・と各CPUにパイプライン処理を明示的に割り当てる方法が思いつきません。
 まず、このようなシステムは可能か?ということと、各CPUに明示的に処理を割り当てる方法など、ご存知の方がいましたら教えてください。
 また参考になる記事が記載されているURLなどをもしご存知なら教えてください。
 非常に初歩的な質問で毎度、申し訳ないです。

2:44 AM
2013年1月24日


iSUS編集部 – 中村

投稿数 13

7

yoshihingis 様

6 コア x 4 CPU = 24 or 48 (HTT 有効時) threads システムとしての動作は OS が保証するため、特別に意識する必要はありません。また、4段のパイプラインとその内部処理の両方で並列性を利用することは、TBB や Cilk Plus のモデルであれば比較的素直に記述できるでしょう。

ただし、任意の処理を任意の CPU またはコアに指示するのは容易ではないと思われます。実現するには、OS の API などでプロセッサーアフィニティ (Affinity) を指示する必要があります。これは特定のマシン、OS、実装に依存するようになるため、一般的なアプリケーションではあまり推奨されることではないようです。

ひとまず、ご参考まで。

8:07 AM
2013年1月24日


yoshihingis

投稿数 54

8

中村様

 どうもご回答ありがとうございました。任意CPUに任意処理を割り付けることを考えなければ、TBBやCilk plusのモデルで4CPUで4段のパイプラインを組み、1パイプライン内の処理をコア数(+HTT数)で並列可可能ということですね。
 
 どうも、ありがとうございました。

9:55 PM
2013年1月24日


iSUS編集部 – 菅原

投稿数 206

9

yoshihingis 様

どの程度のリアルタイム性(応答性)が求められるかわかりませんが、さならるスケーリングを考慮すれば、MPIとOpenMPのハイブリッドでパイプラインを実装するのも1つの方法かと思います。パイプラインの各段の算術強度が高ければコアに跨る実装もあり、かと。

MPI、パイプラインで検索いただくといくつか実装例がでてきます。

すがわらでした。