为什么这个OpenMP并行操作不能尽可能快?

时间:2012-11-02 16:32:14

标签: c parallel-processing openmp

我有一个必须使用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.46s。当运行两个线程时,它在41s完成,几乎完美的加速1.93次,但是当运行3个线程时它完成37.86s(加速只有2.1倍),而4个线程需要34.104s(加速只有2.3次)。

为什么这不可扩展?

PS。我有一个4核的Intel i5 430M。

1 个答案:

答案 0 :(得分:8)

由于您拥有英特尔酷睿i5,因此不具备可扩展性。 Intel Core I5有2个内核和4个线程,所以只有2个真核,而不是4个。(这种处理器使用超线程技术)

具有2个内核和2个线程的处理器(例如双核,Core 2 Duo,Core I3)和Core I5(具有2个内核和4个线程,并使用超线程来充当四核)的区别处理器)是你的超线程核心I5 CAN 的性能提升高达30%。但您无法将Hyper-Threaded Core I5与Core I7(具有4个内核和4个线程)进行比较。