OpenMP - sections

OpenMP - sections

本文关键字:sections OpenMP      更新时间:2023-10-16

我用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();

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

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

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

更新:当然,在您提到您的 CPU 是 i5 之前我忘记了什么:i5 和 i7 处理器具有这种"Turbo 提升"功能,称为提高时钟速度的能力,在您的情况下从 3.3 GHz 增加到 3.6 GHz。但是,仅当大多数内核处于空闲状态(我认为出于热原因)并且单个内核被提升时,才会执行此操作。因此,两个内核的速度不会是一个内核的两倍,因为它们将以较低的时钟速度运行。

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

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