1

我有一个必须使用 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。

4

1 回答 1

8

它不是那么可扩展,因为您拥有 Intel Core I5。Intel Core I5 有 2 Cores 和 4 Threads,所以只有 2 个真正的核心,而不是 4 个。(这种处理器使用超线程技术)

具有 2 个内核和 2 个线程的处理器(例如 Dual Core、Core 2 Duo、Core I3)和您的 Core I5(具有 2 个内核和 4 个线程并使用超线程来充当四核处理器)之间的区别是您的超线程酷睿 I5 的性能提升高达 30%。但是您无法将超线程 Core I5 与 Core I7(具有 4 个内核和 4 个线程)进行比较。

于 2012-11-02T17:50:34.413 回答