30得票3回答
False sharing 和 128 字节对齐/填充

在研究无锁/无等待算法时,我偶然发现了伪共享问题。进一步挖掘后,我找到了Folly的源代码(Facebook的C++库),特别是这个头文件和FOLLY_ALIGN_TO_AVOID_FALSE_SHARING宏的定义(目前在第130行)。最让我惊讶的是其值:128(而不是64)... ///...

29得票1回答
缓存行乒乓和伪共享是相同的吗?

为了我的学士论文,我必须评估多核系统上的常见问题。 在一些书籍中,我读到了关于虚假共享(false sharing)的内容,而在其他书籍中则是有关缓存行乒乓(cache-line-ping-pong)的。这些具体问题听起来非常熟悉,那么这些是相同的问题但是给出了其他名称吗? 可以有人给我列举...

28得票2回答
为什么多个线程从同一缓存行读取不会导致严重的减速?

看这段代码:#include <atomic> #include <thread> typedef volatile unsigned char Type; // typedef std::atomic_uchar Type; void fn(Type *p) { ...

22得票2回答
英特尔和AMD使用哪种缓存一致性协议?

我本科毕业论文需要分析False Sharing对多核系统的影响。在查找不同的高速缓存一致性协议类型时,我在维基百科上发现Intel开发了MESIF高速缓存一致性协议,但没有信息表明Intel也使用了它。 在查阅Intel® 64 和 IA-32 架构软件开发者手册: Vol. 3A后,我没...

18得票1回答
什么是“伪共享”?如何重现/避免它?

今天我在并行编程课上和我的教授就“伪共享”问题有了不同的理解。我的教授的说法让我感到困惑,所以我立即指出了这一点。她认为,“伪共享”会导致程序结果出错。 我说,“伪共享”发生在将不同内存地址分配给同一高速缓存行时,向其中一个写入数据将导致另一个被移出缓存。如果处理器在这两个伪共享地址之间交替...

13得票1回答
x86-64的缓存填充大小应该设置为128字节吗?

我在 crossbeam 的评论中发现了以下内容。 从英特尔的 Sandy Bridge 开始,空间预取器现在每次拉取一对 64 字节的缓存行,因此我们必须对齐到 128 字节而不是 64 字节。 来源: https://www.intel.com/content/dam/www/publ...

12得票2回答
使用数组避免OpenMP中的错误共享问题

我已经开始学习如何使用OpenMP作为大学课程的一部分。作为实验练习,我们被要求并行化一个串行程序。 我们首先意识到了False Sharing的危险性,尤其是在并行循环中更新数组时。 然而,我发现很难将以下代码片段转换为可并行化的任务,而不会引起False Sharing: int i...

12得票1回答
并行框架及避免虚假共享

最近,我回答了一个关于优化一种可能可并行化的方法以生成任意基数数字的排列的问题。我发表了类似于并行化,低效实现代码块列表的答案,并有人几乎立即指出: 这几乎肯定会给你带来虚假共享,并且可能会慢很多倍。(归功于gjvdkamp) 他们说得对,它运行得非常慢。尽管如此,我研究了这个话题...

11得票3回答
C/C++应用程序中检测伪共享的工具

有没有检测和报告 C 或 C++ 应用程序中 False Sharing 的工具?

10得票1回答
使用缓存行对C语言全局共享状态的修改进行无锁检查

编辑:ST不允许新手发布超过两个链接。很抱歉缺少参考资料。 我正在尝试在一个C应用程序中减少锁定开销,其中检测全局状态的变化对性能非常重要。尽管我最近一直在阅读相关主题(例如来自H. Sutter等许多人的内容),但我仍然对我的实现不太有信心。我想使用类似于CAS操作和DCL的组合,对Cac...