2014-10-16 38 views
4

我在调整高性能多线程应用程序,我怀疑虚假共享可能是导致性能不佳的原因。我怎么能证实这是事实?如何检测虚假共享减慢性能?

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

+3

这是远远没有足够的信息给你任何有用的信息。 – sjdowling 2014-10-16 12:31:49

+0

删除虚假共享并查看性能是否提高。 – molbdnilo 2014-10-16 12:42:09

+0

@molbdnilo我怀疑它正在发生,但我不知道它是否是。我正在寻找一种明确的方式来说“是的错误分享正在发生”,然后我可以删除它,看看是否性能提高。 – 2014-10-16 12:46:16

回答

4

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

测试错误共享的一种方法是在可由不同线程同时访问的数据元素之间添加大量填充块。

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

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

+1

填充确实可以帮助很多,虽然64k可能是过度的。请参阅http://stackoverflow.com/questions/8620303/how-many-bytes-does-a-xeon-bring-into-the-cache-per-memory-access,并访问被接受的答案中链接的文章。另外,不要手动添加填充,你可以使用'aligned'类型属性[在gcc上可用](https://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Type-Attributes.html) – fvu 2014-10-17 15:40:39

2

对此的回答几乎与其他任何性能问题相同,如“我如何知道X是否会减慢我的程序?”或者“会不会更快”,这个答案是你打破你的分析器,并且你可以分析它。

对于这个特定的例子,你会感兴趣的是在访问存储器的指令上花费了不寻常的时间。此外,如果您正在使用您的CPU供应商的分析器(CODEXL for AMD或VTune Pro for Intel),那么您可以通过缓存未命中进行配置,并查看哪些代码和指令行正在刷新缓存行。您可能想要read this article for more