c语言 - 为什么这个 OpenMP 并行操作没有尽可能快?



我有一个C程序,必须使用OpenMP库来实现。它的结构是:

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运行。当使用两个线程运行时,它在41秒内完成几乎完美的加速度为1.93次,但是在运行3个线程时,它以37.86秒(仅加速2.1次)完成,并且有4个线程需要34.104s(加快加速度仅2.3次)。

为什么这是不可扩展的?

ps。我有一个Intel i5 430m,带4个内核。

它不是那么可扩展,因为您具有Intel Core i5。Intel Core i5具有2个核心和4个线程,因此只有2个真实内核,而不是4个(此类处理器使用超线程技术)

带有2个内核和2个线程的处理器之间的差异(例如双核,核心2二重奏,核心i3)和您的核心i5(具有2个内核和4个线程,并使用超线程像Quad core一样起作用处理器)是,超线核心i5 can 的性能提高了30%。但是您无法将超线程的核心i5与核心i7进行比较(其中有4个内核和4个线程)。

最新更新