Библиотека в стиле SSE Stdlib?

Обычно все, что я встречаю "в сети" в отношении SSE / MMX, оказывается математическим материалом для векторов и матраций. Тем не менее, я' Я ищу библиотеки "стандартных функций", оптимизированных для SSE, например, предоставленные Agner Fog , или некоторые из алгоритмов сканирования строк на основе SSE в GCC.

Вкратце: это будут вещи такие как memset, memcpy, strstr, memcmp BSR / BSF, то есть stdlib-esque, построенный из встроенных функций SSE

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

Обновление 1

Я натолкнулся на многообещающие вещи после некоторого поиска, одна библиотека привлекла мое внимание:

  • LibFreeVec : кажется, только для Mac / IBM (из-за того, что AltiVec) на основе), поэтому мало полезен (для меня), плюс я не могу найти прямую ссылку для скачивания, в нем также не указана минимально поддерживаемая версия SSE

. Я также наткнулся на статью о нескольких векторизованных строковых функциях (strlen, strstr strcmp). Однако SSE4.2 способ вне моей досягаемости (как было сказано ранее, я хотел бы придерживаться SSE1 / MMX).

Обновление 2

Пол Р побудил меня провести небольшой сравнительный анализ к сожалению, поскольку мой опыт кодирования ассемблера SSE близок к zip, я использовал чужой ( http://www.mindcontrol.org/~hplus/ ) код тестирования и добавил к нему. Все тесты (за исключением оригинала, который является VC6 SP5) были скомпилированы под VC9 SP1 с полной / индивидуальной оптимизацией и / arch: SSE on.

Первым тестом была моя домашняя машина (AMD Sempron 2200+) 512 МБ DDR 333), ограниченный SSE1 (таким образом, без векторизации с помощью MSVC memcpy):

comparing P-III SIMD copytest (blocksize 4096) to memcpy
calculated CPU speed: 1494.0 MHz
  size  SSE Cycles      thru-sse    memcpy Cycles   thru-memcpy     asm Cycles      thru-asm
   1 kB 2879        506.75 MB/s     4132        353.08 MB/s     2655        549.51 MB/s
   2 kB 4877        598.29 MB/s     7041        414.41 MB/s     5179        563.41 MB/s
   4 kB 8890        656.44 MB/s     13123       444.70 MB/s     9832        593.55 MB/s
   8 kB 17413       670.28 MB/s     25128       464.48 MB/s     19403       601.53 MB/s
  16 kB 34569       675.26 MB/s     48227       484.02 MB/s     38303       609.43 MB/s
  32 kB 68992       676.69 MB/s     95582       488.44 MB/s     75969       614.54 MB/s
  64 kB 138637      673.50 MB/s     195012      478.80 MB/s     151716      615.44 MB/s
 128 kB 277678      672.52 MB/s     400484      466.30 MB/s     304670      612.94 MB/s
 256 kB 565227      660.78 MB/s     906572      411.98 MB/s     618394      603.97 MB/s
 512 kB 1142478     653.82 MB/s     1936657     385.70 MB/s     1380146     541.23 MB/s
1024 kB 2268244     658.64 MB/s     3989323     374.49 MB/s     2917758     512.02 MB/s
2048 kB 4556890     655.69 MB/s     8299992     359.99 MB/s     6166871     484.51 MB/s
4096 kB 9307132     642.07 MB/s     16873183        354.16 MB/s     12531689    476.86 MB/s

полные тесты

Вторая тестовая партия была проведена на университетской рабочей станции (Intel E6550, 2,33 ГГц, 2 ГБ DDR2 800?)

VC9 SSE/memcpy/ASM:
comparing P-III SIMD copytest (blocksize 4096) to memcpy
calculated CPU speed: 2327.2 MHz
  size  SSE Cycles      thru-sse    memcpy Cycles   thru-memcpy     asm Cycles      thru-asm
   1 kB 392         5797.69 MB/s    434         5236.63 MB/s    420         5411.18 MB/s
   2 kB 882         5153.51 MB/s    707         6429.13 MB/s    714         6366.10 MB/s
   4 kB 2044        4447.55 MB/s    1218        7463.70 MB/s    1218        7463.70 MB/s
   8 kB 3941        4613.44 MB/s    2170        8378.60 MB/s    2303        7894.73 MB/s
  16 kB 7791        4667.33 MB/s    4130        8804.63 MB/s    4410        8245.61 MB/s
  32 kB 15470       4701.12 MB/s    7959        9137.61 MB/s    8708        8351.66 MB/s
  64 kB 30716       4735.40 MB/s    15638       9301.22 MB/s    17458       8331.57 MB/s
 128 kB 61019       4767.45 MB/s    31136       9343.05 MB/s    35259       8250.52 MB/s
 256 kB 122164      4762.53 MB/s    62307       9337.80 MB/s    72688       8004.21 MB/s
 512 kB 246302      4724.36 MB/s    129577      8980.15 MB/s    142709      8153.80 MB/s
1024 kB 502572      4630.66 MB/s    332941      6989.95 MB/s    290528      8010.38 MB/s
2048 kB 1105076     4211.91 MB/s    1384908     3360.86 MB/s    662172      7029.11 MB/s
4096 kB 2815589     3306.22 MB/s    4342289     2143.79 MB/s    2172961     4284.00 MB/s

полные тесты

Как видно, SSE очень быстро работает в моей домашней системе , но падает на машину Intel (вероятно, из-за плохого кодирования?). мой вариант сборки x86 идет вторым на моем домашнем компьютере и вторым в системе Intel (но результаты выглядят немного противоречивыми, одно объятие блокирует его доминирование над версией SSE1). MSVC memcpy выигрывает в тестах системы Intel, это связано с векторизацией SSE2, хотя на моем домашнем компьютере он терпит неудачу, даже ужасный __ movsd побеждает его ...

ловушки: память были все выровнены с степенями 2. кеш был (надеюсь) очищен. rdtsc использовался для измерения времени.

интересных мест: MSVC имеет (не указано ни в одной ссылке) __ movsd внутреннее, он выводит тот же ассемблерный код, который я использую, но он терпит неудачу (даже если он встроен!). Вероятно, поэтому его нет в списке.

VC9 memcpy можно принудительно векторизовать на моей машине, отличной от sse 2, однако это приведет к повреждению стека FPU, в нем также есть ошибка.

Это полный источник того, что я использовал для тестирования (включая мои изменения, опять же, кредит на http://www.mindcontrol.org/~hplus/ за оригинал). Бинарные файлы и файлы проекта доступны по запросу.

В заключение, похоже, что вариант переключения может быть лучшим, похожим на вариант MSVC crt, только намного более надежный, с большим количеством опций и однократным однократным 11119063] проверяет (через встроенные указатели на функции? Или что-то более изощренное, например внутренний патч прямого вызова) однако при встраивании, вероятно, придется использовать метод наилучшего случая

Обновление 3

Вопрос, заданный Эшаном, напомнил о чем-то полезном и связанном с этим, хотя только для битовых наборов и битовых операций, BitMagic и будет весьма полезен для больших наборов битов, в нем даже есть хорошая статья по SSE2 (бит) оптимизации . К сожалению, это все еще не библиотека типов CRT / stdlib. похоже, что большинство из этих проектов посвящено конкретному небольшому разделу (проблем).

Возникает вопрос, стоит ли тогда создавать проект crt / stdlib с открытым исходным кодом, вероятно, многоплатформенный, производительный , создание различных версий стандартизованных функций, каждая из которых оптимизирована для определенной ситуации, а также «лучший вариант» / вариант общего использования функции, либо с ветвлением времени выполнения для скаляра / MMX / SSE / SSE2 + (а-ля MSVC), либо с принудительным переключением скаляра времени компиляции / SIMD.

Это может быть полезно для HPC или проектов, где важен каждый бит производительности (например, игры), освобождая программиста от беспокойства о скорости встроенных функций, требуя лишь небольшой настройки, чтобы найти оптимальный оптимизированный вариант.

Обновление 4

Я думаю, что характер этого вопроса следует расширить, включив в него методы, которые может применяться с использованием SSE / MMX для оптимизации не-векторных / матричных приложений, это, вероятно, также может использоваться для 32/64-битного скалярного кода. Хорошим примером является то, как проверить наличие байта в данном 32/64/128/256-битном типе данных, сразу с использованием скалярных методов (битовых манипуляций), MMX и SSE / SIMD

Кроме того, я вижу много ответов типа «просто используйте ICC», и это хороший ответ, это не мой ответ, поскольку, во-первых, ICC - это не то, что я могу использовать постоянно (если у Intel нет бесплатной студенческой версии для windows ) из-за пробной версии 30. во-вторых, что более уместно, я ищу не только библиотеки, но и методы, используемые для оптимизации / создания функций, которые они содержат, для моего личного обучения и улучшения, и поэтому я могу применять такие методы и принципы к моему собственному коду. (где необходимо) в сочетании с использованием этих библиотек. надеюсь, это проясняет эту часть :)

15
задан OneArb 8 December 2014 в 07:06
поделиться