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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Здесь article для оптимизации игрового движка.