Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenMP:Visual C和#x2B+;2008年和2010年_C++_Performance_Visual Studio 2010_Openmp - Fatal编程技术网

C++ OpenMP:Visual C和#x2B+;2008年和2010年

C++ OpenMP:Visual C和#x2B+;2008年和2010年,c++,performance,visual-studio-2010,openmp,C++,Performance,Visual Studio 2010,Openmp,我正在运行一个摄像头采集程序,对采集的图像进行处理,并使用简单的OpenMP指令进行处理。所以基本上我会等待摄像机的图像,然后处理它 当迁移到VC2010时,我看到了非常奇怪的性能问题:在VC2010下,我的应用程序占用了将近100%的CPU,而在VC2008下,它只占用了10% 如果仅对处理代码进行基准测试,则VC2010和VC2008之间没有差异,使用采集功能时会出现差异 我已将重现问题所需的代码简化为一个简单的循环,该循环执行以下操作: for (int i=0; i<1000;

我正在运行一个摄像头采集程序,对采集的图像进行处理,并使用简单的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];
  }

for(int i=0;i您可以尝试VS2010附带的新并发运行时-仅从测试示例开始

就是

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];
  }

用于(int i=0;i我测试了另一个采集板,问题是相同的,因此罪魁祸首是VC++2010。如图所示,Microsoft对OpenMP实现进行了更改,使我这样的程序陷入困境。

在2010 OpenMP中,每个工作线程在任务完成后进行大约200毫秒的旋转等待。在我的例子中,是i/O等待和重复的OpenMP任务它正在大量加载CPU

解决方案是改变这种行为;英特尔C++有一个这样的代码,KMPyStIsBuffTime>>()/Cudio>。但是Visual 2010没有这样的可能性。

他们谈论英特尔C++的问题。这个编译器首先介绍了行为,但允许改变它(见上文)。Visual 2010切换到它,但是……没有像英特尔这样的工作。

[P>因此,将英特尔转换为C++,使用<代码> KMP-TestSub BuffTimes(0)< /C>解决了./P> 多亏了约翰·利利的帮助


问题已提交给,并收到“不会修复”反馈。

使用OpenMP 3.0,可以通过
OMP\u WAIT\u策略停用spinwait:

_putenv_s( "OMP_WAIT_POLICY", "PASSIVE" );
其效果与
kmp\u set\u blocktime(0)
基本相同,但当我们在运行时设置环境变量
OMP\u WAIT\u POLICY
时,它只会影响当前进程和子进程

当然,OMP_WAIT_策略也可以由启动器应用程序设置,例如Blender以这种方式处理


VC2010的修补程序可用,更高版本(如VC2013)直接支持它。

它消耗100%的CPU,但需要多长时间?它运行得更快吗?不,它运行得不更快。在这两种情况下,我都可以在新映像到达之前处理映像,因此如果处理速度更快,我将无法在程序中看到它。我的问题更多的是CPU占用n处理时间。使用OpenMP并没有看到它使用所有处理器资源才是真正的问题。获得100%的负载是预期的结果。更多信息:抱歉,Hans,我没有得到它?我有100%的负载,而在以前的情况下,负载不足5%。因此这是过度和不正常的。在我的实际程序中,我需要CPU进行其他处理,所以这会减慢应用程序的速度。@Hans Passant:这种逻辑只适用于固定加载程序。这是一个固定速率的程序:您每40毫秒(通常)会得到一张相机图像。您不可能提前完成。每40毫秒CPU使用就会出现峰值。MP为100%时,是的。但是峰值应该更短,平均超过40毫秒,结果应该是5%左右。我必须了解如何转换OpenMP指令以减少(+总和),然后返回编辑,谢谢你帮我做的!当然,即使这解决了他的问题,也不能解决Microsoft OpenMP的明显性能缺陷。@DeadMG请参阅状态更新,没有缺陷,但在我的情况下,并发运行时的性能与OpenMP相比非常差。通常,数组的大小是多少?@CharlesB:您可以尝试半手动展开版本,如我刚刚编辑的。将自旋块时间设置为某个较小的值,例如20,而不是零。如果值正好为0,则在某些情况下Intel OpenMP会冻结。多年来,我多次遇到此问题。
_putenv_s( "OMP_WAIT_POLICY", "PASSIVE" );