2017-01-19 5 views
0

動的なスケジュールでopenmpでforループを実行したいと思います。動的なスケジュールでopenmpのループ反復を順番に実行する

#pragma omp for schedule(dynamic,chunk) private(i) nowait 
for(i=0;i<n;i++){ 
//loop code here 
} 

と私は、このような

例えばその命じたチャンクを実行する各スレッドを持っているしたいのですが

スレッド2 k個>の反復0 - - スレッド1>反復回数kの+ 1 - > K +チャンク

などを...

静的スケジュールは、部分的に私が欲しいものを行いますが、私は動的にロードしたいのですが反復のバランスを取る。

私が正しく理解していれば、それは何の命令節でもありません。

私の質問は、割り当てられたチャンクが順序付けされたチャンクであることを確認する方法ですか?

私はあなたが専門家のOpenMPのプログラマが便利な機能と考えられているomp for、に頼ることなく、この自分自身を実装することができますgccの

+1

「ガイド付き」スケジュールが好きかもしれません。あなたのケーキを食べて食べたいと思っています - OpenMPがあなたのためにバランスを取ることを望みますが、チャンクを順番に割り当てることも望みます。極端な例を挙げると、ループ1はループ2〜250の長さを取らないことをスケジューラがどのように知ることができますか?スレッド1にループ1を与えたら、スケジューラはループ2とスレッド2で何をすべきですか? –

+2

質問がありません。 'schedule(dynamic、chunk)'はあなたが望むものではないのですか? –

+0

@HristoIliev私は、ダイナミックなスケジュールがランダムに順序付けられていない反復を選ぶと考えました。チャンク= 5、N = 10、スレッド= 2の場合、スレッド1は反復{0,3,5,6,9}を持つことはできませんか?私はこのような状況を避けたいと思います。 – Marouen

答えて

0

でのOpenMP 3.1を使用しています。

以下はおおまかなことを示しています。算術を注意深くチェックしてください。

#pragma omp parallel 
{ 
    int me = omp_get_thread_num(); 
    int nt = omp_get_num_threads(); 
    int chunk = /* divide n by nt appropriately */ 
    int start = me * chunk; 
    int end = (me+1) * chunk; 
    if (end > n) end = n; 
    for (int i = start; i < end; i++) { 
     /* do work */ 
    } 
} /* end parallel */ 

これは動的ロードバランシングを行いません。あなたは先験的にコスト関数を知っていれば、ループの反復をスレッドに不均等に割り当てることで、自分自身で行うことができます。インスペクタ/エグゼキュータモデル(たとえば1)を読んでみてください。

関連する問題