首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这种OpenMP并行操作不能尽可能快?

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

Stack Overflow用户
提问于 2012-11-03 00:32:14
回答 1查看 540关注 0票数 1

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

代码语言:javascript
复制
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核的英特尔i5 430M。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-03 01:50:34

由于您使用的是英特尔酷睿I5,因此它的可扩展性较差。英特尔酷睿I5有2个核心和4个线程,因此只有2个真正的核心,而不是4个。(该类型的处理器使用超线程技术)

具有2个核心和2个线程的处理器(例如,双核、酷睿2双核、核心I3)与您的核心I5 (具有2个核心和4个线程,并使用超线程来充当四核处理器)之间的区别在于,您的超线程核心I5 的性能提升最高可达30%。但您不能将超线程核心I5与核心I7 (具有4个核心和4个线程)进行比较。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13199384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档