OpenMP ライブラリを使用して実装する必要がある C プログラムがあります。その構造は次のとおりです。
for (t = 0; t < IT; ++t) {
#pragma omp parallel for private(i, j, k, l) schedule(dynamic)
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
for (k = 0; k < n; ++k) {
for (l = 0; l < n; ++l) {
// calculations 0
}
}
// calculations 1
}
}
#pragma omp parallel for private(i, j) schedule(dynamic)
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
// calculations 2
}
}
}
このプログラムは、行列に対していくつかの計算を行います。計算 2 は、計算 0 と 1 が完了した後に実行する必要があります。これは、行列にいくつかの変更を加えるためです。
問題は、スピードアップが非常に悪いことです。つまり、プログラムはスケーラブルではありません。特定の入力のシリアル バージョンは 79.46 秒で実行されます。2 スレッドで実行すると 41 秒で終了し、ほぼ完全に 1.93 倍の速度アップが得られますが、3 スレッドで実行すると 37.86 秒 (わずか 2.1 倍の速度向上) で終了し、4 スレッドで実行すると 34.104 秒 (速度向上) かかります。わずか2.3倍)。
なぜこれはスケーラブルではないのですか?
PS。4 コアの Intel i5 430M を使用しています。