2

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

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

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

正如我所说,这些部分是独立的。cm1并且cm2不要使用任何外部变量。那么,谁能告诉我为什么我的应用程序比我预期的慢 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();
4

2 回答 2

2

您有多少个 CPU 或内核?例如,如果您只有 2 个物理内核,其中一个还必须处理所有其他程序 + 操作系统,因此这会减慢其中一个线程的速度。

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

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

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

于 2012-06-22T20:51:47.300 回答
0

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

你到底在计算什么?如何?粗略地说,每次内存访问的算术运算比率是多少?您的内存访问模式如何,例如您是否多次运行大型数组?

于 2012-06-23T17:43:52.940 回答