openmpで "reduce"を使用している私のコードは、実行結果と同じ結果を返しません。Openmpでの削減は、コード内の同じスレッド数で異なる結果を返します。
ケース1:使用して "削減"(ⅱ)FUNCと
sum = 0;
omp_set_num_threads(4);
#pragma omp parallel for reduction(+:sum)
for(ii = 0; ii < 100; i++)
sum = sum + func(ii);
は副作用があります。実際、func(ii)は並列実行で競合状態につながる可能性のある他のcalcul()関数を使用します。私はcalcul()関数がこの問題の原因になると思います。しかし、私は「クリティカル」を使用しますが、結果は常に同じですが、このソリューションはパフォーマンスにはあまり適していません。
ケース第2回:使用
func(int val)
{
read_file(val);
calcul(); /*calculate something from reading_file(val)*/
return val_fin;
}
はそれを解決するために私を助けてくださいFUNC(ⅱ)機能付き
sum = 0;
#pragma omp parallel for
for(ii = 0; ii < 100; i++)
{
#pragma omp critical
sum = sum + func(ii);
}
"クリティカル"?
ありがとうございます!
あなたの問題は、 'reduction'一部ではなく、' FUNC(ⅱ) 'コール内の競合状態にないように見えます。 'func'や' calcul'のコードを見ることができないので、もっと言いにくいです。 –
こんにちはダン、私のfunc(ii)も複雑です。私はあなたにそのコピーfunc(ii){... read(ii); ... calcul(); ...戻り値。 } – hamalo
問題を再現できるだけの十分な機能を投稿する必要はありません。 [最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve)を参照してください。 –