имеет ли смысл переписывать memcpy / memcmp / ... с инструкциями SIMD - PullRequest
12 голосов
/ 16 марта 2011

Имеет ли смысл перезапись memcpy / memcmp / ... с инструкциями SIMD в крупномасштабном программном обеспечении?

Если так, почему gcc по умолчанию не генерирует инструкции simd для этих библиотечных функций.

Кроме того, можно ли улучшить какие-либо другие функции с помощью SIMD?

Ответы [ 4 ]

6 голосов
/ 16 марта 2011

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

У меня есть пользовательская SIMD memchr, которая является адскимбыстрее, чем версия библиотеки.Особенно, когда я нахожу первый из 2 или 3 символов (например, я хочу знать, есть ли в этой строке текста уравнение, я ищу первый из =, \n, \r).

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

4 голосов
/ 16 марта 2011

Это вероятно не имеет значения. Процессор намного быстрее полосы пропускания памяти, и реализации memcpy и т. Д., Предоставляемые библиотекой времени выполнения компилятора, вероятно, достаточно хороши. В «крупномасштабном» программном обеспечении ваша производительность не будет зависеть от копирования памяти, во всяком случае (вероятно, это будет зависеть от ввода / вывода).

Чтобы повысить реальное быстродействие копирования памяти, некоторые системы имеют специальную реализацию DMA , которую можно использовать для копирования из памяти в память. Если требуется существенное увеличение производительности, аппаратное обеспечение - это способ получить его.

3 голосов
/ 16 марта 2011

Это не имеет смысла. Ваш компилятор должен неявно испускать эти инструкции для memcpy / memcmp / подобных встроенных функций, если он вообще способен выдавать SIMD.

Возможно, вам придется явно указать GCC на выдачу кодов SSE с например, -msse -msse2; некоторые GCC не включают их по умолчанию. Кроме того, если вы не скажете GCC оптимизировать (т. Е. -o2), он даже не попытается выдать быстрый код.

Использование опкодов SIMD для работы с памятью может привести к значительному снижению производительности, поскольку они также включают предварительные выборки из кэша и другие подсказки DMA, которые важны для оптимизации доступа к шине. Но это не значит, что вам нужно излучать их вручную; хотя большинство компиляторов воняют при генерации SIMD-операций вообще, каждый из них, который я использовал, по крайней мере обрабатывает их для основных функций памяти CRT.

Базовые математические функции также могут принести большую пользу от установки компилятора в режим SSE. Вы можете легко получить 8-кратное ускорение на базовом sqrt(), просто сказав компилятору использовать код операции SSE вместо ужасного старого x87 FPU.

1 голос
/ 20 апреля 2011

на оборудовании x86, это не должно иметь большого значения, с обработкой вне порядка.Процессор достигнет необходимого ILP и попытается выдать максимальное количество операций загрузки / сохранения за цикл для memcpy, будь то набор команд SIMD или Scalar.

...