Я работаю над системой, написанной на С++, работающей на Xeon на Linux, которая должна запускаться как можно быстрее. Существует большая структура данных (в основном массив структур), хранящихся в ОЗУ, более 10 ГБ, и к ним необходимо периодически обращаться к элементам. Я хочу пересмотреть структуру данных, чтобы как можно больше работать с механизмом кэширования системы.
В настоящее время обращения выполняются в основном случайным образом по всей структуре, и каждый раз считываются 1-4 32-битных int. Прошло много времени, прежде чем другое чтение будет происходить в одном и том же месте, поэтому кеш не будет полезен.
Теперь я знаю, что, когда вы читаете байт из случайного местоположения в ОЗУ, больше, чем просто этот байт вводится в кеш. Мой вопрос: сколько байтов введено? Это 16, 32, 64, 4096? Это называется линией кэша?
Я хочу изменить структуру данных, чтобы минимизировать случайные обращения к ОЗУ и работать с кешем, а не против него. Знание того, сколько байтов вставляется в кеш при случайном доступе, будет информировать меня о выборе дизайна.
Обновление (октябрь 2014 года): Вскоре после того, как я поставил вопрос выше, проект был приостановлен. С тех пор он возобновился и, основываясь на предложениях ниже, я провел несколько экспериментов по доступу к ОЗУ, потому что казалось вероятным, что трэш TLB произошел. Я пересмотрел программу для работы с огромными страницами (2 МБ вместо стандартного 4 КБ), и наблюдал небольшое ускорение - около 2,5%. Я нашел отличную информацию о создании огромных страниц здесь и здесь.