0

在 github 的这个虚假共享测试中,一个数组被定义为int array[100]. 它说 bad_index = 1 good_index = 99。然后它创建两个线程并执行以下操作:

  1. 虚假共享:thread_1 更新A[0],thread_2 更新A[bad_index]
  2. 无虚假共享:thread_1 更新A[0],thread_2 更新A[good_index]

使用虚假共享,操作速度会慢 2 倍以上。我的问题是为什么索引1不好而索引99好?

4

1 回答 1

0

索引1是一个“坏”元素,因为数组元素是没有填充的整数,所以说 64 字节的公共缓存行将包含索引01. 这将导致 thread_1 和 thread_2 之间的错误共享,因为每次 thread_2 增加 index 处的元素时,thread_1 的缓存行都会失效1,即使元素的计算0不依赖于它,也会强制重新加载它。

99是一个“好”索引,因为它距离第一个元素足够远,因此不会在同一个缓存行中。不过,这取决于运行程序的特定 cpu。

于 2021-11-22T05:50:32.547 回答