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

StackOverflow https://stackoverflow.com/questions/613294

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top