【问题标题】:How can I detect false sharing slowing down performance?如何检测会降低性能的虚假共享?
【发布时间】:2014-10-16 12:25:01
【问题描述】:

我正在调整一个高性能的多线程应用程序,我怀疑错误共享可能是导致性能不佳的原因。我如何验证是否是这种情况?

我正在使用 gcc 4.82 在 Ubuntu 12.04 上运行 C++。

【问题讨论】:

  • 这些信息远不足以为您提供任何有用的信息。
  • 去掉虚假分享,看看性能有没有提升。
  • @molbdnilo 我怀疑它正在发生,但我不确定它是否是。我正在寻找一种明确的方式来表示“是的错误共享正在发生”,然后我可以将其删除并查看性能是否有所提高。
  • 虚假共享只是缓存性能不佳的一种特定方式。所以我建议this question,尤其是perf 来检查缓存未命中。使用perf stat -e cache-misses 运行维基百科错误共享示例:使用 OpenMP,129515 缓存未命中。没有 OpenMP(串行):1551 次缓存未命中。显然有一些与线程相关的缓存问题。

标签: c++ multithreading performance concurrency


【解决方案1】:

我将发布一些我刚刚从 C++ Concurrency in Action 中了解到的内容。

测试虚假共享的一种方法是在数据元素之间添加巨大的填充块,这些填充块可以被不同的线程同时访问。

struct protected_data
{
   std::mutex m;
   char padding[65536];
   my_data data_to_protect; 
}; 

如果这提高了性能,那么您就知道虚假共享是个问题。

【讨论】:

【解决方案2】:

这个问题的答案与“我如何知道 X 是否正在减慢我的程序速度?”这样的任何其他性能问题几乎相同。或“你会更快”,答案是你打破你的分析器并分析它。

对于这个特定的示例,您可能会对访问内存的指令是否花费了异常多的时间感兴趣。此外,如果您使用 CPU 供应商的分析器(适用于 AMD 的 CODEXL 或适用于 Intel 的 VTune Pro),那么您可以按缓存未命中进行分析,并查看哪些代码和指令行正在刷新您的缓存行。

您可能想read this article for more

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2012-01-10
    • 1970-01-01
    • 2015-07-01
    • 2018-12-12
    相关资源
    最近更新 更多