OpenMP - 部分

时间:2012-06-22 20:43:58

标签: c++ parallel-processing openmp

我使用OpenMP编写了一个应用程序。我创建了两个部分并将两个对象放入其中。他们每个人都调用一个运行近22-23秒的方法。这两个部分都是独立的。

当我设置num_threads(1)时,应用程序需要46秒才能运行。没关系,因为2×23 = 46。

当我设置num_threads(2)时,应用程序需要35秒才能运行,但我期待约25秒。

正如我所说,这些部分是独立的。 cm1cm2不使用任何外部变量。那么,谁能告诉我为什么我的应用程序比我预期的慢10秒?低级别是否有任何同步?

t1 = clock();
#pragma omp parallel num_threads(2)
{
    #pragma omp sections
    {
        #pragma omp section
        {
            Cam cm1;
            cm1.solveUsingCost();
        }

        #pragma omp section
        {
            Cam cm2;
            cm2.solveUsingTime();
        }
    }
}
t2 = clock();

2 个答案:

答案 0 :(得分:2)

您有多少CPU或核心?例如,如果您只有2个物理内核,其中一个还必须处理所有其他programm + OS,因此这将减慢其中一个线程。

另一种可能性是你的CPU的L3 chache足以在L3缓存中一次性保存一次计算的数据。但是当在并列中执行2时,使用了两倍的内存,因此可能需要将来自L3缓存的一些内存转移到ram(请注意,大多数多核CPU在内核之间共享L3缓存)。这将大大减慢您的计算速度,并可能导致所描述的结果。

然而,这些只是猜测,在进行并行计算时,可能会有更多原因导致没有因子2速度增益。

更新: 当然,在你提到你的CPU是i5之前我忘记了:i5和i7处理器都有这种“Turbo boost”,称为增加时钟速度的能力,在你的情况下从3.3到3.6 GHz。然而,只有在大多数内核处于空闲状态时(出于散热原因,我认为)并且单个内核被提升时才会这样做。因此,两个内核的速度不会超过一个内核,因为它们将以较低的时钟速度运行。

答案 1 :(得分:0)

从您对上一个答案和评论的回复来看,我的猜测是你的两个函数solveUsingCost()solveUsingTime()是内存密集型的,或者至少是内存带宽有限。

你正在计算什么?如何?粗略地说,每个内存访问的算术运算的比例是多少?你的记忆访问是如何图案化的,例如你经历过几次大型阵列吗?

相关问题