Прошу прощения за плохую формулировку - ночь уже.
C++, линукс, винда, разное железо.
Есть два вычислительных алгоритма, обращающихся к константам в ОЗУ, общим объёмом примерно 150 метров. Алгоритмы различаются схемой доступа к данным в ОЗУ и схемой их расположения там. Например один алгоритм одновременно читает данные из нескольких блоков по 320 байт из разных удалённых мест. Второй алгоритм - те же данные, но запакованные в один последовательный блок в 8КБ, т.к. везде меняются паттерны чтения памяти.
При этом на разном железе - однопроцессорном и многопроцессорном, одноядерном и многоядерном (древние пни, core i5, серверные матери с несколькими Xeon-ами с огромными кешами...) не находится лучшего алгоритма по производительности.
Наблюдается такая закономерность - чем древнее и однопроцессорнее машина, тем больше она любит последовательный доступ к памяти (настольные древние P4, Core i5..., core2duo). Чем сервернее и многопроцессорнее девайс (Xeon-сервера), тем хуже работает алгоритм с «очень последовательным» доступом.
При отсутствии знаний по сабжу имею смелое предположение. Может быть, читая одновременно несколько разнесённых блоков я более вероятно использую разные линии кеша, а читая одновременно близко расположенные адреса (в блоке 8КБ) у меня больше риск создать ситуацию, когда одна линия кеша постоянно переписывается целиком двумя разными блоками (т.к. номер линии кеша - это адрес с отброшенными младшими битами)?
Спасибо.