Джалф в основном прав. Кэш-память первого уровня разделена на порции, размер порций зависит от процессора, но составляет порядка 32 байтов. Таким образом, если бы вы шагали по памяти по байтам за раз, вы бы получали пропуск кеша через каждые 32 байта (или любой другой размер фрагмента). Теперь чип Intel довольно умен и способен обнаруживать последовательные операции чтения и предварительной выборки данных, уменьшая последствия пропуска кэша.
Скорее всего, матрица 4x4 будет находиться в одном фрагменте L1 (или в строке кэша), поэтому доступ к ней по строке или по столбцу не имеет большого значения. Конечно, вы не хотите разбивать матрицу на две строки кэша, поэтому важно правильно выровнять память.
Матрица 16x16, однако, не помещается в строку кэша. Таким образом, если вы пропустите столбцы обработки массива, вы получите много пропусков кэша. Вычисление индекса, как сказал Джальф, не имеет большого значения, так как соотношение между процессором и памятью велико (т. Е. Вы можете выполнять большую работу с процессором при каждом промахе кэша).
Теперь, если вы в основном обрабатываете матрицу ориентированно на столбцы, тогда ваш лучший вариант - это транспонировать все ваши матрицы (поменять строки столбцами), таким образом, ваш доступ к памяти будет более последовательным, а количество пропусков кеша будет уменьшено, и процессор сможет лучше предварительно выбирать данные. Итак, вместо того, чтобы организовывать матрицу так:
0 1 2 .... 15
16 17 18 .... 31
....
240 241 242 .... 255
где число - это смещение памяти от начала матрицы, упорядочить так:
0 16 32 ... 240
1 17 33 ... 241
...
15 31 47 ... 255