現在地 >> メニュー >> OpenMP >> OMP::基本編05::ループの分割方法

OMP::基本編05::ループの分割方法


for文の並列において、その並列の仕方は以下の3つがある。
  • schedule(static,チャンクサイズ)
  • schedule(dynamic,チャンクサイズ)
  • schedule(runtime) ← 実行時の環境変数で指定

サンプルコード → OMP::単純なループ

schedule(static,チャンクサイズ)


繰り返しをチャンクサイズ毎に分割し、各スレッドに順番に割り当てる。
割り当て終わったら、最初のスレッドに戻って割り当てる。

デフォルトのチャンクサイズは以下のように計算される

 [デフォルトのチャンクサイズ]=[ループ回数] / [スレッド数]


[例]


#pragma omp parallel for schedule(static,100) num_threads(4)
for(int i = 0; i < 800 ;++i)
{
 ... ...
}



この場合、スレッドが4つで

スレッド0 → 0〜99
スレッド1 → 100〜199
スレッド2 → 200〜299
スレッド3 → 300〜399

スレッド0 → 400〜499
スレッド1 → 500〜599
 ... ...

と割り当てて行く。



schedule(dynamic,チャンクサイズ)


繰り返しをチャンクサイズ毎に分割し、暇なやつに割り当てていく。
なお、
  • デフォルトのチャンクサイズ=1
である。

[例]


#pragma omp parallel for schedule(dynamic,10) num_threads(4)
for(int i = 0; i < 800 ;++i)
{
 ... ...
}



この場合、10ずつ割り当てて行く。
(例えば、画像処理を考えた場合、10ピクセル単位で並列をする事になる)

この時、割り当て方法は「暇なスレッド」である。

つまり、

スレッド0 → 作業中
スレッド1 → 暇
スレッド2 → 作業中

のような場合、スレッド1にチャンクを割り当てる。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます