2010-11-23 12 views
12

私は2つの同様のコードを持っています。OpenMPの静的スケジュールと動的スケジュールの相違点

まず

#pragma omp parallel for shared(g) private(i) schedule(dynamic, 1) 
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++) 
{ 
    AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes 
    #pragma omp atomic 
    (*g).actualNumberOfChromosomes++; 
} 

#pragma omp parallel for shared(g) private(i) schedule(static, 1) 
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++) 
{ 
    AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes 
    #pragma omp atomic 
    (*g).actualNumberOfChromosomes++; 
} 

唯一の違いは、最初の行です。最初のコードは正常に動作しますが、2番目のコードはクラッシュします。どうして?

問題はactualNumberOfChromosomesのどこかにありますが、これを解決するだけではなく、理由を理解したいと思います。私はこれを解決変数pを作成し、それにactualNumberOfChromosomesを割り当てて、ipに等しくなるようにループを変更することで解決できました。

+0

2番目のプログラムがクラッシュする理由を詳しく説明できますか?ポインタgが壊れていますか?そして、それが墜落したとき?あなたはiの値をprintfすることができます。この問題を理解するにはもっと情報が必要です。各反復と各スレッドに対していくつかの変数を出力することができます。 – minjang

答えて

13

問題は、このコードはOpenMPに準拠していないため、準拠していないプログラムでは「指定されていない」動作があることです。あなたは、OpenMP API V3.0の仕様を見れば、セクション2.5.1ループ構築し、説明の下にそれは述べて:

を関連付けられた各ループの反復回数が最も外側の ループに入る前に計算されます。関連するループの実行によって、計算に使用された値のいずれかが変更された場合、反復回数のいずれかがカウントされ、その動作は未定義です。

静的と動的のスケジュールタイプの大きな違いは、静的では、チャンクは計算中にスレッドにスケジュールされ、動的では実行時に行われる(より多くのロックが必要です)。

13

staticスケジュール型およびdynamicスケジュールタイプの違いはdynamicと同じことが行われているのに対し、staticとチャンクが、同様にどのようにコンパイル自体中のスレッドにスケジュールすることを決めたように予め計算することができるということです実行時にdynamicの使用に

、それはあなたがでいくつかの詳細情報を取得することができますいくつかの複雑なデッドロック処理機構のようなメカニズム、荷役など

が含まれますhttp://openmp.blogspot.com