Выгодно ли использовать glibc strlen()/strcmp() или создавать свои собственные на основе SSE4.2?

Согласно Schema Validation with Intel® Streaming SIMD Extensions 4 (Intel® SSE4) (Intel, 2008 г.) [они] добавили инструкции, облегчающие поиск символов и сравнение двух операндов по 16 байт за раз. Я написал несколько основных функций strlen() и strcmp() на C, но они кажутся медленнее, чем glibc.

Я хотел бы, возможно, поэкспериментировать с использованием встроенной сборки, чтобы увидеть, как мой проект ведет себя с вводом/выводом XML.

Я читал (здесь), что использование SMID для таких вещей, как strlen(), изобилует потенциальными проблемами (выравнивание памяти), поэтому я немного обеспокоен его использованием в производственном коде.


person user1016031    schedule 26.10.2020    source источник
comment
Они не быстрее для strlen/strcmp. Используйте SSE2 или AVX2 pcmpeqb, как это делает glibc, или просто используйте функции glibc. Конечно, скалярный C будет медленнее, потому что gcc/clang не может автоматически векторизовать циклы, если количество поездок не известно во время компиляции. Это исключает циклы поиска с разрывом, зависящим от данных; вам нужно вручную векторизовать. SIMD strlen вполне возможен; это то, что glibc использует с рукописным asm, вам просто нужно быть осторожным: безопасно ли читать за конец буфера на той же странице на x86 и x64? показывает, как это сделать.   -  person Peter Cordes    schedule 26.10.2020
comment
Какой компилятор? ССЗ? МСВК?   -  person Michael Petch    schedule 26.10.2020
comment
comment
Теперь в основном дубликат Насколько быстрее строковые инструкции SSE4.2, чем SSE2 для memcmp? - нет, вам очень редко нужен SSE4. 2.   -  person Peter Cordes    schedule 26.10.2020
comment
Если ваш вариант использования включает в себя буферы, которые, как известно, выровнены, или когда вы знаете, что по какой-то другой причине безопасно читать до 15 байтов после конца строки, тогда да, ручная прокрутка может стоить того, обычно с использованием SSE2 . Особенно, если вы что-то знаете о типичных длинах строк, которые обычно составляют от 16 до 31 байта или что-то в этом роде. (Обычно короткие строки, например, менее 16 байт, могут стоить pcmpistri, особенно для strcmp.) Но на самом деле, если важно найти длину строки, часто лучше использовать строки явной длины, где вы сохраняете длину с помощью указателя.   -  person Peter Cordes    schedule 26.10.2020


Ответы (1)


реализации glibc будет сложно превзойти. Эти функции тщательно оптимизированы и включают части, написанные вручную на ассемблере. Вот реализация glibc x86_64 strcmp с использованием инструкций AVX2. Будьте осторожны, это 800 строк:
https://github.com/lattera/glibc/blob/master/sysdeps/x86_64/multiarch/strcmp-avx2.S

Подробнее см. также фантастическое объяснение Питера Кодса о реализации glibc.

person Pascal Getreuer    schedule 26.10.2020
comment
Как упоминал Паскаль, реализации glibc будет сложно превзойти. Они условно компилируются для всех версий процессора и реализаций SIMD (включая AVX). Какая последовательность использовать, зависит от конкретной модели (например, некоторые последовательности лучше/хуже других на данной модели). glibc сделает всю тяжелую работу за вас. - person Craig Estey; 26.10.2020
comment
@CraigEstey: они не компилируют условно, они выполняют диспетчеризацию ЦП во время выполнения через механизм разрешения динамического компоновщика. Таким образом, одна сборка glibc может работать на любом процессоре, но использовать AVX2 в системах, где он доступен. Со всеми затратами на отправку, выполняемыми один раз во время динамической компоновки, потому что вызовы общих библиотек уже проходят через указатель функции. - person Peter Cordes; 26.10.2020
comment
@pascal: обратите внимание, что glibc не фактически отправляет свою функцию strcmp SSE4.2 на любых реальных процессорах (AFAIK), потому что это не быстрее. AVX2 vpcmpeqb намного лучше, и даже версия SSE2 лучше, потому что pcmpistri микрокодируется как несколько мопов даже на последних процессорах. См. ссылки вверху статьи Почему strlen в glibc должен быть таким сложным для быстрой работы? - person Peter Cordes; 26.10.2020
comment
@PeterCordes спасибо за эти подробности! Ваш пост превосходен. Я обновил свой ответ, указав ссылку на strcmp-avx2.S, и добавил указатель на ваш пост. - person Pascal Getreuer; 26.10.2020