У меня есть большой массив, хранящий объекты размером 256 байт. Будет несколько писательских тем, 1 читатель. Я не могу изменить дизайн на данный момент. Я также не могу увеличить размер объекта. Поэтому мое решение состоит в том, что каждый поток будет иметь свою собственную локальную последовательность индексов потока, которую он будет использовать для доступа к основному массиву.
EX:
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 к каждому предыдущему индексу при каждом переносе (index> size of array).
EX:
Array size = 2304
3 writer threads:
thread0 0 768 1536 *1* 769
thread1 256 1024 1792 *257* 1025
thread2 512 1280 2048 *513* 1281
Есть ли способ изменить формулу для учета этого?
ОБНОВЛЕНИЕ с информацией о процессоре:
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
Задача ещё не решена.
Других решений пока нет …