我使用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();
答案 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()
是内存密集型的,或者至少是内存带宽有限。