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

最佳答案

它不是那么可扩展,因为你有英特尔酷睿I5英特尔酷睿I5有2个内核和4个线程,因此只有2个真正的内核,而不是4个。(这类处理器使用超线程技术)
拥有2核和2线程(例如双核、双核、I3)的处理器与拥有2核和4线程、使用超线程来充当四核处理器的核心I5之间的区别在于,超线程核心I5的性能提升可以达到30%。但是你不能将你的超线程核心I5和核心I7(有4个核心和4个线程)进行比较。

关于c - 为什么这种OpenMP并行操作没有达到最快的速度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13199384/

10-08 21:30