C++ 什么';探查器输出中线程并发开销时间的含义是什么?

C++ 什么';探查器输出中线程并发开销时间的含义是什么?,c++,c,multithreading,profiling,C++,C,Multithreading,Profiling,如果有对英特尔VTune放大器有丰富经验的人告诉我这件事,我将不胜感激。 最近,我收到了其他人的性能分析报告,他们在我的程序中使用了英特尔VTune放大器。它告诉我们,在线程并发区域中存在高开销时间 开销时间的含义是什么?他们不知道(问我),我没有访问英特尔VTune放大器的权限 我有模糊的想法。该程序有许多线程休眠调用,因为目标平台中的pthread condition不稳定(或者我做得很糟糕),所以我更改了许多例程来执行循环中的工作,如下所示: while (true) { mutex

如果有对英特尔VTune放大器有丰富经验的人告诉我这件事,我将不胜感激。

最近,我收到了其他人的性能分析报告,他们在我的程序中使用了英特尔VTune放大器。它告诉我们,在线程并发区域中存在高开销时间

开销时间的含义是什么?他们不知道(问我),我没有访问英特尔VTune放大器的权限

我有模糊的想法。该程序有许多线程休眠调用,因为目标平台中的
pthread condition
不稳定(或者我做得很糟糕),所以我更改了许多例程来执行循环中的工作,如下所示:

while (true)
{
   mutex.lock();
   if (event changed)
   {
      mutex.unlock();
      // do something
      break;
   }
   else
   {
      mutex.unlock();
      usleep(3 * 1000);
   }
}
这可以标记为开销时间

有什么建议吗


我在英特尔网站上找到了有关开销时间的帮助文档。

摘录:

开销时间是从释放共享资源开始到接收该资源结束的持续时间。理想情况下,开销时间的持续时间非常短,因为它减少了线程等待获取资源的时间。然而,并不是并行应用程序中的所有CPU时间都花在了真正的有效负载工作上。在并行运行时(英特尔线程构建块,OpenMP*)使用效率低下的情况下,大量时间可能会花在并行运行时内部,在高并发级别浪费CPU时间。例如,这可能是由于递归并行算法中的工作分割粒度较低造成的:当工作负载大小变得太低时,分割工作和执行内务管理工作的开销就变得非常大。
仍然令人困惑。。这是否意味着“您进行了不必要的/过于频繁的锁定”

对不起,我不是
pthread
或英特尔VTune放大器方面的专家,但是,是的,锁定互斥锁并解锁它可能算作开销时间


锁定和解锁互斥锁可以作为系统调用来实现,探查器可能只会将其包含在线程开销中。

我不熟悉vTune,但在操作系统开销中存在线程间切换的问题。每次一个线程停止并且另一个线程加载到处理器上时,都需要存储当前线程上下文,以便在线程下次运行时可以恢复它,然后需要恢复新线程的上下文,以便它可以继续处理


问题可能是线程太多,因此处理器大部分时间都在线程之间切换。如果多线程应用程序的线程数与处理器的线程数相同,则多线程应用程序的运行效率最高

虽然我自己也尝试过使用
pthread

为了证明我对开销时间的理解,让我们以一个简单的单线程程序为例来计算数组和:

for(i=0;i<NUM;i++) {
    sum += array[i];
}

for(i=0;iI不知道您的确切设计,但是,IMHO,我们可能也会为此开销添加上下文切换时间。