C++ OpenMP-部分

C++ OpenMP-部分,c++,parallel-processing,openmp,C++,Parallel Processing,Openmp,我使用OpenMP编写了一个应用程序。我创建了两个部分,并将两个对象放入其中。它们中的每一个都调用一个正在运行将近22-23秒的方法。两个部分都是独立的 当我设置num_threads(1)时,应用程序运行需要46秒。没关系,因为2×23=46 当我设置num_threads(2)时,应用程序运行需要35秒,但我预计需要25秒 正如我所说,这些部分是独立的cm1和cm2不使用任何外部变量。那么,有人能告诉我为什么我的应用程序比我预期的慢10秒吗?低电平是否有任何同步 t1 = clock();

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

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

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

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

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

从您对前面答案和注释的答复来看,我猜想您的两个函数,
solveUsingCost()
solveUsingTime()
,非常占用内存,或者至少内存带宽有限


你到底在计算什么?怎么做?粗略地说,每个内存访问的算术运算的比率是多少?您的内存访问模式如何,例如,您是否在一个大型阵列中运行了多次?

好的,那么这不应该是我的第一个猜测。你大概知道你的计算需要多少内存吗?快速搜索说你的CPU有6MB的共享三级缓存。是的,我的i5有6MB的三级缓存。在任务管理器中,我的应用程序最大使用27MB。即使启用了Turbo boost,我也不相信时间会这么长。这比我预期的要多出近10秒。你可能还想研究一下,特别是如果
sizeof(Cam)我希望你知道
clock()
测量的是CPU时间,而不是实际(或挂钟)时间。我想这不重要。我可以用我的秒表,但我仍然可以看到不同之处。这只是对阅读你的问题的其他人的一句评论-大多数人使用
clock()
而不是
omp\u get\u wtime()
从未看到使用OpenMP:)会有任何加速问题-英特尔VTune(Windows上需要商业许可证)或类似的记录硬件性能计数器的性能工具,可以帮助您解决线程性能问题。除了英特尔VTune可以揭示瓶颈外,您还可以在引入“大炮”(VTune)之前,先尝试或快速了解情况。perf是Linux,不知道您的开发环境。。。