最終更新:
mikk_ni3_92 2008年05月29日(木) 18:03:21履歴
現在地 >> メニュー >> OpenMP >> OMP::基本編05::ループの分割方法
for文の並列において、その並列の仕方は以下の3つがある。
サンプルコード → OMP::単純なループ
繰り返しをチャンクサイズ毎に分割し、各スレッドに順番に割り当てる。
割り当て終わったら、最初のスレッドに戻って割り当てる。
デフォルトのチャンクサイズは以下のように計算される
[デフォルトのチャンクサイズ]=[ループ回数] / [スレッド数]
[例]
#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
... ...
と割り当てて行く。
繰り返しをチャンクサイズ毎に分割し、暇なやつに割り当てていく。
なお、
[例]
#pragma omp parallel for schedule(dynamic,10) num_threads(4)
for(int i = 0; i < 800 ;++i)
{
... ...
}
この場合、10ずつ割り当てて行く。
(例えば、画像処理を考えた場合、10ピクセル単位で並列をする事になる)
この時、割り当て方法は「暇なスレッド」である。
つまり、
スレッド0 → 作業中
スレッド1 → 暇
スレッド2 → 作業中
のような場合、スレッド1にチャンクを割り当てる。
for文の並列において、その並列の仕方は以下の3つがある。
- schedule(static,チャンクサイズ)
- schedule(dynamic,チャンクサイズ)
- schedule(runtime) ← 実行時の環境変数で指定
サンプルコード → OMP::単純なループ
繰り返しをチャンクサイズ毎に分割し、各スレッドに順番に割り当てる。
割り当て終わったら、最初のスレッドに戻って割り当てる。
デフォルトのチャンクサイズは以下のように計算される
[デフォルトのチャンクサイズ]=[ループ回数] / [スレッド数]
[例]
#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
... ...
と割り当てて行く。
繰り返しをチャンクサイズ毎に分割し、暇なやつに割り当てていく。
なお、
- デフォルトのチャンクサイズ=1
[例]
#pragma omp parallel for schedule(dynamic,10) num_threads(4)
for(int i = 0; i < 800 ;++i)
{
... ...
}
この場合、10ずつ割り当てて行く。
(例えば、画像処理を考えた場合、10ピクセル単位で並列をする事になる)
この時、割り当て方法は「暇なスレッド」である。
つまり、
スレッド0 → 作業中
スレッド1 → 暇
スレッド2 → 作業中
のような場合、スレッド1にチャンクを割り当てる。