Сколько байтов Xeon вносит в кеш за доступ к памяти? - PullRequest
12 голосов
/ 24 декабря 2011

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

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 24 декабря 2011

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

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

3 голосов
/ 24 декабря 2011

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

2 голосов
/ 24 декабря 2011

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

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

1 голос
/ 27 декабря 2011

Хорошая (длинная) статья об организации структур данных для учета иерархии кэша и ОЗУ от сопровождающего libc GNU: https://lwn.net/Articles/250967/ (полный PDF здесь: http://www.akkadia.org/drepper/cpumemory.pdf)

1 голос
/ 24 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...