我有一个必须使用 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 秒内运行。使用两个线程运行时,它在 41 秒内完成,几乎完美地加速了 1.93 倍,但在运行 3 个线程时,它在 37.86 秒内完成(加速仅为 2.1 倍),而使用 4 个线程时,它需要 34.104 秒(加速仅为 2.3 倍)。
为什么这不可扩展?
PS。我有一个 4 核的 Intel i5 430M。