Я хочу измерить латентность каждого уровня иерархии памяти, от L1 до основной памяти. Итак, я пытался понять программу 1-single.c на https://gist.github.com/jiewmeng/3787223. Почему индекс массива вычисляется по [(i * 16) & lengthMod]?Измерение задержки каждого уровня иерархии памяти
Значения [(i * 16) & lengthMod] и i * 16 всегда будут одинаковыми. Например,
i=0, [(i * 16) & lengthMod]=0, [i*16]=0
i=1, [(i * 16) & lengthMod]=16, [i*16]=16
i=2, [(i * 16) & lengthMod]=32, [i*16]=32
i=3, [(i * 16) & lengthMod]=48, [i*16]=48
i=4, [(i * 16) & lengthMod]=64, [i*16]=64
i=5, [(i * 16) & lengthMod]=80, [i*16]=80
.........................................
Итак, я попытался запустить программу заменяющую [(я * 16) & lengthMod] с [я * 16] но, программа разбился каждый раз. Вот как я понял, что для этой побитовой операции должна быть веская причина. Может кто-нибудь объяснить, почему массив вычисляется по [(i * 16) & lengthMod]?