我有一个大数组,用于存储大小为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