Полностью оптимизирован memcpy / memmove для архитектуры Core 2 или Core i7? - PullRequest
10 голосов
/ 05 марта 2009

Теоретический максимум пропускной способности памяти для процессора Core 2 с двухканальной памятью DDR3 впечатляет: согласно статье Википедии об архитектуре, 10+ или 20+ гигабайт в секунду. Однако вызовы stock memcpy () этого не достигают. (3 ГБ / с - это самый высокий показатель, который я видел в таких системах.) Вероятно, это связано с требованием поставщика ОС настраивать memcpy () для каждой линии процессора на основе характеристик процессора, поэтому стандартная реализация memcpy () должно быть разумным по широкому кругу марок и линий.

Мой вопрос: есть ли свободно доступная, сильно настроенная версия для процессоров Core 2 или Core i7, которую можно использовать в программе на C? Я уверен, что я не единственный человек, нуждающийся в этом, и для всех было бы огромной тратой усилий на микрооптимизацию своих собственных memcpy ().

Ответы [ 3 ]

7 голосов
/ 05 марта 2009

При измерении пропускной способности вы учитывали, что memcpy был одновременно и чтением, и записью, поэтому скопированная память 3 ГБ / с - это фактически 6 ГБ / с полосы пропускания?

Помните, что пропускная способность является теоретически максимальной - реальное использование будет намного ниже. Например, ошибка одной страницы и ваша пропускная способность упадут до МБ / с.

memcpy / memmove являются встроенными функциями компилятора и обычно будут встроены в rep movsd (или соответствующие инструкции SSE, если ваш компилятор может нацеливаться на это). Это может быть невозможно улучшить codegen по сравнению с этим, так как современные процессоры будут очень хорошо обрабатывать команды rep, подобные этой.

6 голосов
/ 05 марта 2009

Если вы указываете / ARCH: SSE2 для MSVC, он должен предоставить вам настроенный memcpy (по крайней мере, мой делает).

В противном случае, используйте встроенные встроенные функции загрузки / хранения SSE, чтобы скопировать память большими кусками, используя устройство чтения слов Даффом, где это необходимо, чтобы иметь дело с заголовком и хвостом данных, чтобы получить их к выровненной границе. Вам также понадобится использовать встроенные функции управления кэшем, чтобы получить хорошую производительность.

Вероятно, вашим ограничивающим фактором являются пропуски кеша и пропускная способность южного моста, а не циклы процессора. Учитывая, что на шине памяти всегда будет много другого трафика, я обычно рад получить около 90% теоретической пропускной способности памяти при таких операциях.

2 голосов
/ 05 марта 2009

Вы можете написать свой собственный. Попробуйте использовать оптимизирующий компилятор Intel для непосредственного нацеливания на архитектуру?

Intel также производит нечто, называемое VTune (не зависит от компилятора и языка) для оптимизации приложений.

Вот статья по оптимизации игрового движка.

...