问题标签 [false-sharing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
882 浏览

multithreading - 与错误共享相关的性能计数器事件

我正在查看 OpenMP 程序的性能,特别是缓存和内存性能。我之前找到了如何使用 Vtune 分析性能的指南,其中提到了要注意哪些计数器。但是现在似乎找不到手册。

如果您知道我有问题的手册,或者您知道计数器/事件,请告诉我。另外,如果您有其他分析多线程内存性能的技术,请分享

谢谢

0 投票
3 回答
2137 浏览

c++ - 虚假共享和堆栈变量

我有小但经常使用的功能对象。每个线程都有自己的副本。一切都是静态分配的。副本不共享任何全局或静态数据。我是否需要保护这些对象免受虚假共享?

谢谢你。编辑:这是一个使用 Boost.Threads 的玩具程序。字段数据是否会发生虚假共享?

0 投票
2 回答
1935 浏览

.net - 什么是并行编程.net 4.0 中的“错误共享”

任何人都可以分享并行编程.net 4.0中“虚假共享”的知识吗?如果你能举例说明就好了。提前致谢 。我想要我的代码的最大性能。

0 投票
3 回答
2547 浏览

c++ - 在 C/C++ 应用程序中检测虚假共享的工具

是否有任何工具可以检测和报告用 C 或 C++ 编写的应用程序的错误共享?

0 投票
2 回答
4238 浏览

c - 虚假共享和 pthreads

我有以下任务来演示虚假共享并编写了一个简单的程序:

当我看到结果时我非常惊讶(我在 i5-430M 处理器上运行它)。

  • 使用虚假共享,它是 1020 毫秒。
  • 如果没有虚假共享,则为 710 毫秒,仅快 30% 而不是 300%(在某些网站上写它会比 300-400% 快)。
  • 不使用 pthreads,它是 580 毫秒。

请告诉我我的错误或解释它发生的原因。

0 投票
1 回答
984 浏览

c++ - C++ 使用 `.reserve()` 填充 `std::vector` 以防止多线程缓存失效和错误共享

我有一个具有如下所示一般结构的程序。基本上,我有一个对象向量。每个对象都有成员向量,其中一个是包含更多向量的结构向量。通过多线程,对象被并行操作,进行涉及大量访问和修改成员向量元素的计算。一个对象一次只能被一个线程访问,并被复制到该线程的堆栈中进行处理。

问题是该程序无法扩展到 16 个内核。我怀疑并被告知问题可能是错误共享和/或缓存失效。如果这是真的,那么原因似乎一定是向量分配的内存彼此太近,因为据我了解,这两个问题(简单来说)都是由不同处理器同时访问的近端内存地址引起的。这种推理是否有意义,这可能会发生吗?如果是这样,我似乎可以通过使用 .reserve() 填充成员向量来增加额外的容量来解决这个问题,在向量数组之间留下大量的空内存空间。那么,这一切有意义吗?我完全出去吃午饭了吗?

0 投票
2 回答
1704 浏览

c++ - OpenMP 虚假共享

我相信我正在使用 OpenMP 进行错误共享。有什么方法可以识别并修复它吗?

我的代码是:https ://github.com/wchan/libNN/blob/master/ResilientBackpropagation.hpp第 36 行。

与单线程 1 核版本相比,使用 4 核 CPU 仅产生 10% 的额外性能。当使用 NUMA 32 个物理(64 个虚拟)CPU 系统时,CPU 利用率卡在 1.5 个内核左右,我认为这是错误共享和无法扩展的直接症状。

我还尝试使用英特尔 VTune 分析器运行它,它表明大部分时间都花在了“f()”和“+=”函数上。我相信这是合理的,并不能真正解释为什么我的缩放比例如此之差......

有什么想法/建议吗?

谢谢。

0 投票
1 回答
411 浏览

c - 使用 Cache-Line 对齐对 C 中全局共享状态的修改进行无锁检查

编辑:ST 不允许为新手发布两个以上的链接。很抱歉缺少参考资料。

我正在尝试减少 C 应用程序中的锁定开销,其中检测全局状态的更改与性能相关。尽管我最近读了很多关于这个主题的书(例如,很多来自 H. Sutter 的书,等等),但我对自己的实施没有信心。我想使用类似CAS的操作和DCL的组合来检查Cache-Line Aligned全局变量,从而避免错误共享,以从多个线程之间共享的数据更新线程本地数据。我缺乏信心主要是因为

  1. 我未能解释关于类型属性的 GNU 文档
  2. 我似乎无法找到任何可以轻松翻译为 C 的文献和示例,例如ST 或1上的 aligning-to-cache-line-and-knowing-the-cache-line-size(尽管1似乎可以回答我的问题有点我对我的实施没有信心)
  3. 我对 C 的经验有限

我的问题:

  1. 类型属性文档指出:

    此属性为指定类型的变量指定最小对齐方式(以字节为单位)。例如,声明:

    (请参阅类型属性文档进行声明)

    强制编译器确保(尽可能地)每个变量的类型已经struct Smore_aligned_int将被分配并至少在8-byte边界上对齐。在 SPARC 上,将所有类型的变量与边界struct S对齐8-byte允许编译器在将一个 struct S 类型的变量复制到另一个变量时使用 ldd 和 std(双字加载和存储)指令,从而提高运行时效率。

    这是否意味着开始struct Smore_aligned_int将始终与8-byte边界对齐?这并不意味着数据将被填充为正好使用 64 个字节,对吧?

  2. 假设 1. 的每个实例struct cache_line_aligned(参见下面的代码示例 1)在边界上对齐64-byte并恰好使用一个高速缓存行(假设高速缓存行的64 bytes长度)为真

  3. 使用typedef类型声明不会改变的语义__attribute__ ((aligned (64)))(参见下面的代码示例 2

  4. 如果aligned_mallocstruct 声明为__attribute__ ...

最后是一个函数的草图,它使用缓存行对齐的方法来有效地检查全局状态是否已被其他线程修改:

对不起,很长的帖子。

谢谢!

0 投票
2 回答
153 浏览

c++ - 从 char[] 访问对齐的 T & 的最有效方法是什么?

昨晚我在这个类上工作,作为内存对齐对象的类型安全包装器。我有字节数组和数学来访问字节数组的内存以读取和写入T. 不过,我很好奇,如何才能最有效地访问对齐的T.

我尝试使用一个公共T &调用Value,我将其初始化为T构造函数初始化列表中的对齐。像这样:

这增加了类的大小,sizeof(T *)因为T & Value需要存储对齐的地址T

我的另一种方法是不存储地址,而是在每次需要访问时通过访问器方法计算它......

这种方法将需要指针算术和指针解引用(我认为?)每次访问但不会增加类的大小。

有没有其他方法或技巧来获得这两个优势?

0 投票
2 回答
137 浏览

java - 虚假共享仅在某些机器上变得明显

我在 java 中编写了以下测试类来重现“错误共享”引入的性能损失。

基本上,您可以将数组的“大小”从 4 调整为更大的值(例如 10000),以打开或关闭“错误共享现象”。具体来说,当 size = 4 时,不同的线程更有可能更新同一缓存行中的值,从而导致更频繁的缓存未命中。理论上,当 size = 10000 时,测试程序应该比 size = 4 运行得快得多。

我在两台不同的机器上多次运行相同的测试:

机器 A: Lenovo X230 笔记本电脑 w/ Intel® Core™ i5-3210M 处理器(2 核,4 线程)Windows 7 64 位

大小 = 4 => 5.5 秒

大小 = 10000 => 5.4 秒

机器 B: Dell OptiPlex 780 w/ Intel® Core™2 Duo 处理器 E8400(2 核)Windows XP 32 位

大小 = 4 => 14.5 秒

大小 = 10000 => 7.2 秒

后来我在其他几台机器上进行了测试,很明显,错误共享只在某些机器上变得明显,我无法弄清楚造成这种差异的决定性因素。

任何人都可以看看这个问题并解释为什么这个测试类中引入的错误共享只在某些机器上变得明显吗?

}