#pragma omp parallel for default(none) shared(x) private (y, z, f) ordered
for (i = 0; i < 512; i++) {
#pragma omp ordered
for (y = 0; y < 512; y++) {
for (z = 0, f = 0; z < 512; z++) {
x[f++] = z + i + y;
}
}
}
上記のコードは、非SMP実行よりもデュアルコアで約20%遅く実行されます( )。 「#pragma omp ordered」がなければ、非SMPより約50%高速です。Ordered並列コードはシングルスレッドよりも低速で実行されます。解決策はありますか?
x [f ++]シーケンスは、同様に後で再利用されるため、順序付けられた形式のままでなければならないとみなされます。
シングルスレッドよりも速い順序コードを使用できますか?それを達成する別の方法がありますか?
システムはwin32/mingw-w64です。
このコードは意味を持ちません。以前の値を考慮せずにxを上書きします。最も内側のループだけが実際に書き込みます。 iとzを512に設定して内部ループを実行すると、コードは25万倍高速に実行されます。 –