Практическое использование автоматической векторизации? - PullRequest
4 голосов
/ 03 января 2009

Кто-нибудь воспользовался автоматической векторизацией, которую может делать gcc? В реальном мире (в отличие от примера кода)? Требуется ли реструктуризация существующего кода, чтобы воспользоваться преимуществами? Есть ли значительное количество случаев в любом производственном коде, который можно векторизовать таким образом?

Ответы [ 5 ]

5 голосов
/ 20 октября 2009

Мне еще предстоит увидеть, как GCC или Intel C ++ автоматически векторизуют все, кроме очень простых циклов, даже если дан код алгоритмов, которые можно (и были после того, как я переписал их вручную с использованием встроенных функций SSE).

Часть этого является консервативной - особенно когда сталкиваются с возможным наложением указателей, для компилятора C / C ++ может быть очень трудно «доказать» себе, что векторизация будет безопасной, даже если вы, как программист, знаете, что это. Большинство компиляторов (разумно) предпочитают не оптимизировать код, а не рисковать его некомпиляцией. Это одна из областей, где языки более высокого уровня имеют реальное преимущество перед C, по крайней мере, теоретически (я говорю теоретически, поскольку на самом деле я не знаю о каких-либо автоматических векторизациях компиляторов ML или Haskell).

Другая часть этого - просто аналитические ограничения - большинство исследований в векторизации, насколько я понимаю, связано с оптимизацией классических численных задач (скажем, гидродинамики), которые были хлебом и маслом для большинства векторных машин раньше, чем несколько лет назад (когда между CUDA / OpenCL, Altivec / SSE и STI Cell в коммерческих системах стали широко доступны векторные программы в различных формах.

Маловероятно, что вектору, написанному для скалярного процессора, будет легко векторизовать компилятор. К счастью, многие вещи, которые вы можете сделать, чтобы компилятору было легче понять, как его векторизовать, такие как разбиение на циклы и частичное развертывание цикла, также (как правило) помогают повысить производительность на современных процессорах, даже если компилятор не понимает, как векторизовать его.

1 голос
/ 04 января 2009

Сложно использовать в любой бизнес-логике, но ускоряет работу при одинаковой обработке объемов данных.

Хорошим примером является обработка звука / видео, где вы применяете одну и ту же операцию к каждому семплу / пикселю. Я использовал VisualDSP для этого, и вам пришлось проверять результаты после компиляции - действительно ли он используется там, где должен.

0 голосов
/ 31 марта 2011

Возможно, вы заметили, что практически никто не знает, как эффективно использовать автоматическую векторизацию GCC. Если вы просматриваете в Интернете, чтобы увидеть комментарии людей, всегда приходит мысль о том, что GCC позволяет вам включить автоматическую векторизацию, но она крайне редко использует ее, и поэтому, если вы хотите использовать ускорение SIMD (например, MMX, SSE, AVX, NEON, AltiVec), тогда вам в основном нужно выяснить, как написать его, используя встроенные функции компилятора или код ассемблера.

Но проблема с внутренними компонентами заключается в том, что вам необходимо понять часть языка ассемблера, а также изучить метод описания внутренних функций, который может привести к гораздо менее эффективному коду, чем если бы вы написали его в Код ассемблера (например, в 10 раз), потому что у компилятора по-прежнему будут проблемы с использованием ваших внутренних инструкций!

Например, вы можете использовать SIMD Intrinsics, чтобы многие операции могли выполняться параллельно, но ваш компилятор, вероятно, сгенерирует ассемблерный код, который передает данные между регистрами SIMD и обычными регистрами ЦП и обратно, эффективно заставить ваш код SIMD работать с той же скоростью (или даже медленнее), чем обычный код!

Так что в основном:

  • Если вы хотите до 100% ускорений (2x скорость), то либо купи официальные компиляторы Intel / ARM или конвертируйте часть своего кода в SIMD C / C ++ Intrinsics.
  • Если вы хотите 1000% ускорений (10-кратная скорость), затем запишите его в коде сборки, используя инструкции SIMD от руки. Или, если доступно на вашем оборудовании, используйте вместо этого ускорение GPU, такое как OpenCL или CvA SDK от Nvidia, поскольку они могут обеспечить ускорение в GPU, аналогичное SIMD в ЦП.
0 голосов
/ 22 февраля 2009

Векторизованные инструкции не ограничиваются процессорами Cell - большинство современных рабочих станций, таких как CPU, имеют их (PPC, x86 начиная с Pentium 3, Sparc и т. Д.). При правильном использовании для операций с плавающей запятой это может очень помочь для задач, требующих больших вычислительных ресурсов (фильтры и т. Д.). По моему опыту, автоматическая векторизация работает не так хорошо.

0 голосов
/ 05 января 2009

Векторизация будет в первую очередь полезна для числовых программ. Векторизованные программы могут работать быстрее на векторных процессорах, таких как STI Cell Processor, используемый в игровых консолях PS3. Там числовые вычисления, используемые, например, для визуализации игровой графики, могут быть значительно ускорены векторизацией. Такие процессоры называются процессорами SIMD (Single Instruction Multiple Data).

На других процессорах векторизация не будет использоваться. Векторизованные программы работают на векторизованном наборе команд, который неприменим к процессору без SIMD.

В серии процессоров Intel Nehalem (выпущенных в конце 2008 года) реализованы инструкции SSE 4.2, которые являются инструкциями SIMD. Источник: Википедия .

...