OpenMP - sections
OpenMP - sections
我用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 个物理内核,其中一个还必须处理所有其他程序 + 操作系统,因此这会减慢其中一个线程的速度。
另一种可能性是,CPU 的 L3 chache 足以将一次一个计算的数据完全保存在 L3 缓存中。但是当在 paralell 中执行 2 时,会使用双倍的内存量,因此可能必须将来自 L3 缓存的一些内存传输到 ram(请注意,大多数多核 CPU 在内核之间共享 L3 缓存)。这会大大减慢您的计算速度,并可能导致所描述的结果。
然而,这些只是猜测,在并行计算时,可能还有很多其他原因导致没有因子 2 的速度增益。
更新:当然,在您提到您的 CPU 是 i5 之前我忘记了什么:i5 和 i7 处理器具有这种"Turbo 提升"功能,称为提高时钟速度的能力,在您的情况下从 3.3 GHz 增加到 3.6 GHz。但是,仅当大多数内核处于空闲状态(我认为出于热原因)并且单个内核被提升时,才会执行此操作。因此,两个内核的速度不会是一个内核的两倍,因为它们将以较低的时钟速度运行。
从您对之前答案和评论的回复来看,我的猜测是您的两个函数,solveUsingCost()
和solveUsingTime()
,内存密集型或至少内存带宽有限。
你到底在计算什么?又如何?每次内存访问的算术运算比率大致是多少?您的内存访问模式如何,例如,您是否多次运行大型数组?
- OpenMP阵列性能较差
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- OpenMP:并行更新数组总是需要减少数组吗
- 如何使用OpenMP并行这两个循环
- 从python调用openMP共享库时,未定义opnMP函数
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用OpenMP使这个循环并行
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 查找最近配对时的OpenMP竞赛条件
- 使用输入打破 OpenMP 中的循环
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- OpenMP 加上unordered_map<字符串、双字符串的缩减>
- OpenMP 与有序和关键指令并行
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- OpenMP for 循环并行性问题
- OpenMP and sections
- OpenMP - sections