【发布时间】:2011-01-19 16:44:29
【问题描述】:
我正在运行一个相机采集程序,该程序对采集的图像执行处理,并且我正在使用简单的 OpenMP 指令进行此处理。所以基本上我等待来自相机的图像,然后处理它。
在迁移到 VC2010 时,我看到非常奇怪的性能消耗:在 VC2010 下,我的应用程序占用了近 100% 的 CPU,而在 VC2008 下它只占用了 10%。
如果我只对处理代码进行基准测试,我发现 VC2010 和 VC2008 之间没有差异,那么在使用采集功能时就会出现差异。
我已将重现问题所需的代码简化为执行以下操作的简单循环:
for (int i=0; i<1000; ++i)
{
GetImage(buffer);//wait for image
Copy2Array(buffer, my_array);
long long sum = 0;//do some simple OpenMP parallel loop
#pragma omp parallel for reduction(+:sum)
for (int j=0; j<size; ++j)
sum += my_array[j];
}
这个循环在 2008 年消耗了 5% 的 CPU,在 2010 年消耗了 70%。
我做了一些分析,这表明在 2010 年大部分时间都花在了 OpenMP 的vcomp100.dll!_vcomp::PartialBarrierN::Block
我还做了一些并发分析:
在 2008 年,处理工作分布在 3 个工作线程上,这些工作线程非常活跃,因为处理时间远不如图像等待时间
同样的线程出现在2010年,但都100%被PartialBarrierN::Block函数占用。由于我有四个核心,它们占用了 75% 的工作,这大致是我在 CPU 占用中看到的。
因此,OpenMP 和 Matrox 采集库(专有)之间似乎存在冲突。但这是 VS2010 还是 Matrox 的错误? 有什么我可以做的吗? VC++2010 对我来说是必须的,所以我不能只坚持 2008 年。
非常感谢
状态更新
使用 DeadMG 建议的新并发框架会导致 40% 的 CPU。对其进行分析表明时间花费在处理上,因此它没有显示我在 OpenMP 中看到的错误,但在我的情况下,性能比 OpenMP 差得多。
状态更新 2
我已经安装了最新英特尔 C++ 的评估版。它显示了完全相同的性能问题!
我交叉发布到MSDN forum
状态更新 3
在 Windows 7 64 位和 XP 32 位上测试,结果完全相同(在同一台机器上)
【问题讨论】:
-
消耗了100%的CPU,但是需要多长时间呢?它跑得更快吗?
-
不,它不会跑得更快。在这两种情况下,我都可以在新图像到达之前处理图像,因此如果处理速度更快,我将不会在我的程序中看到它。我的问题更多是 CPU 占用而不是处理时间。
-
使用 OpenMP 而不看到它使用所有处理器资源才是真正的问题。获得 100% 的负载是预期的结果。更多信息:blogs.msdn.com/b/oldnewthing/archive/2010/12/03/10097861.aspx
-
对不起,汉斯,我不明白?我有 100% 的负载,而在以前的情况下,负载不到 5%。因此它是过度的和不正常的。在我的实际程序中,我需要 CPU 进行其他处理,因此会减慢应用程序的速度。
-
@Hans Passant:该逻辑仅适用于固定负载程序。这是一个固定速率的程序:您每 40 毫秒(通常)获得一张相机图像。没有办法提前完成。每 40 毫秒 CPU 使用率就会达到峰值。 MP达到100%,是的。但峰值应该更短,平均超过 40 毫秒,结果应该是 5% 左右。
标签: c++ performance visual-studio-2010 openmp