Полностью оптимизирован memcpy / memmove для архитектуры Core 2 или Core i7?
-
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 (не зависит от компилятора и языка) для оптимизации приложений.
Вот статья об оптимизации игрового движка.