如何解决数组中的错误共享,但避免填充

时间:2018-07-19 15:12:21

标签: c++ array-formulas false-sharing

我有一个大数组,用于存储大小为256个字节的对象。将有多个写程序线程,一个读程序。我目前无法更改设计。我也无法增加对象的大小。因此,我的解决方案是,每个线程将具有其自己的线程局部索引序列,它将用于访问主数组。 例如:

3 writer threads:
thread0 0   768  1536
thread1 256 1024 1792 
thread2 512 1280 2048 

这应确保每个线程不共享相同的缓存行。我知道我可以在启动时填充这些序列,但是我很好奇是否有一个公式可以像这样确定下一个索引:

Tn=thread number
width = 256 (cacheline size / object size)
Tc = number of threads
an = (Tn-1)*width + (n-1)*(width*Tc)
n = index 

Ex index 3 for thread 3 should be 2048:
(2)*256 + (2) * (256 * 3) = 512 + 2 * 768 = 2048

但是,这并不能解决我们最终到达数组末尾的情况,在这种情况下,我只想在每次包装(索引>数组大小)时向每个先前的索引加1。 例如:

Array size = 2304
3 writer threads:
thread0 0   768  1536 *1*   769
thread1 256 1024 1792 *257* 1025
thread2 512 1280 2048 *513* 1281

有什么方法可以修改公式以解决此问题?

使用cpu信息更新:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24
On-line CPU(s) list:   0-23
Thread(s) per core:    1
Core(s) per socket:    12
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Stepping:              2
CPU MHz:               2596.945
BogoMIPS:              5193.42
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              30720K
NUMA node0 CPU(s):     0-5,12-17
NUMA node1 CPU(s):     6-11,18-23

0 个答案:

没有答案