Подтвердить что ты не робот

Сколько байтов Xeon выводит в кэш на доступ к памяти?

Я работаю над системой, написанной на С++, работающей на Xeon на Linux, которая должна запускаться как можно быстрее. Существует большая структура данных (в основном массив структур), хранящихся в ОЗУ, более 10 ГБ, и к ним необходимо периодически обращаться к элементам. Я хочу пересмотреть структуру данных, чтобы как можно больше работать с механизмом кэширования системы.

В настоящее время обращения выполняются в основном случайным образом по всей структуре, и каждый раз считываются 1-4 32-битных int. Прошло много времени, прежде чем другое чтение будет происходить в одном и том же месте, поэтому кеш не будет полезен.

Теперь я знаю, что, когда вы читаете байт из случайного местоположения в ОЗУ, больше, чем просто этот байт вводится в кеш. Мой вопрос: сколько байтов введено? Это 16, 32, 64, 4096? Это называется линией кэша?

Я хочу изменить структуру данных, чтобы минимизировать случайные обращения к ОЗУ и работать с кешем, а не против него. Знание того, сколько байтов вставляется в кеш при случайном доступе, будет информировать меня о выборе дизайна.

Обновление (октябрь 2014 года): Вскоре после того, как я поставил вопрос выше, проект был приостановлен. С тех пор он возобновился и, основываясь на предложениях ниже, я провел несколько экспериментов по доступу к ОЗУ, потому что казалось вероятным, что трэш TLB произошел. Я пересмотрел программу для работы с огромными страницами (2 МБ вместо стандартного 4 КБ), и наблюдал небольшое ускорение - около 2,5%. Я нашел отличную информацию о создании огромных страниц здесь и здесь.

4b9b3361

Ответ 1

Сегодняшние процессоры извлекают память в кусках (обычно) 64 байта, называемых строками кэша. Когда вы читаете конкретную ячейку памяти, вся строка кэша извлекается из основной памяти в кеш.

Подробнее здесь: http://igoro.com/archive/gallery-of-processor-cache-effects/

Ответ 2

Линия кэша для любого текущего процессора Xeon составляет 64 байта. Еще одна вещь, о которой вы могли бы подумать, - это TLB. Если вы действительно делаете произвольный доступ через 10 ГБ памяти, тогда у вас, вероятно, будет много пропусков TLB, которые потенциально могут быть столь же дорогостоящими, как промахи в кеше. Вы можете работать с большими страницами, но это нужно иметь в виду.

Ответ 3

Старый вопрос SO, в котором есть информация, которая может вам пригодиться (в частности, первый ответ, где искать информацию о процессоре Linux - ответчик не упоминает размер строки, но "другая информация" поверх ассоциативности и т.д.). Вопрос для x86, но ответы более общие. Стоит посмотреть.

Где зарегистрирован кеш памяти L1 процессоров Intel x86?

Ответ 4

Возможно, вам захочется перейти на http://agner.org/optimize/ и захватить доступные PDF файлы оптимизации - там много хороших (низкоуровневых) информация там. Довольно сосредоточены на уровне языка ассемблера, но есть уроки, которые нужно изучить для программистов на C/С++.

Том 3, "Микроархитектура процессоров Intel, AMD и VIA" должна представлять интерес: -)