Как решить ложное разделение в массиве, но избежать заполнения

У меня есть большой массив, хранящий объекты размером 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

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …