2012-02-23 23 views
0

OpenMPを使用して、各スレッドがグリッドのサブセクションで動作する2dグリッドでの演算を並列化したいと考えています。OpenMP For Loop Range

サブセクションを処理する関数f(lower,upper,grid)を想定します(下位と上位はグリッドの軸の1つを参照します)。

lowerupperを明示的に計算することなくfを呼び出すことができるかどうかという疑問はありますか?

たとえば、forループがあると、OpenMPはスレッド間で自動的にループを分割します。 OpenMPで範囲を分割し、その範囲のチャンクをfに割り当てる方法はありますか?

ありがとうございます!

アップデート:私はループのために持っていた場合

は、明確にする:

#pragma omp parallel for 
for(int i=0;i<50;i++) 

のOpenMPがループのために分けるでしょう。私が知りたいことは、forループがどのように分割されたかを知ることに似ています。

+0

OpenMPに2Dワークセットを動的にスケジュールするように依頼していますか? – Mysticial

+0

2Dデータには複雑な計算がいくつか含まれているため、単純な 'for'のアプリケーション(' collapse')は実現できません。私は、OpenMPが、その境界が何であるかを見ることができるような方法で、ループの「下位」境界と上限の境界を動的に分割したいと思います。 – Richard

+0

OpenMPがどのように範囲を把握しているのかわかりません(どちらも理解できません...)?ある時点で、ある種の範囲を与える必要があります。 – Mysticial

答えて

0

より重いオーバーヘッドによってomp taskを試すことができます。私はあなたがそのような

としてコードを記述する必要がありますことを考えます upper()lower()は、今あなたがしたい領域分割を行い、入力引数としてスレッドIDを取る機能するある
f(lower(omp_get_thread_num()),upper(omp_get_thread_num()),grid) 

私はあなたに任せて、OpenMPをあなたの仕事のやりかたに合わせるか、自分のやり方をOpenMPに適応させるかを決定します(この場合、OpenMPでスレッド間でループ反復を分割することは意味があります) )問題にあなたに。

+0

ああ、これが唯一の方法だとあなたは正しいかもしれないと思います。この場合、OpenMPのパラダイムは私のアプリケーションにはあまり適していないと思います。私は代替手段としてTBBを検討しています。 – Richard

0

あなたは私はあなたの質問への答えはノーであると合理的に確信していますどのように大きな各タスクがある(parallel for

+0

'omp task'がどのようにして範囲のチャンクを動的に割り当てるのかは不明です。おそらくあなたはその質問を理解していないでしょう。このコメントは、明確にするのに役立ちます。 – Richard