Pull to refresh

«The Simdsons» — немного о семействе векторных инструкций SIMD

Reading time4 min
Views14K
image
Когда я впервые увидела этот мультфильм, то абсолютно не впечатлилась. Какие-то желтые (хорошо хоть не зеленые) человечки с выпученными глазами, сюжет не особенно интересный, шутки несмешные…

Но вскоре все радикально изменилось. Нет, «Симпсоны» остались теми же, зато я провела около месяца в командировке в мир Симпсонов — США, где наконец поняла, почему этот сериал многие считают лучшим. «The Simpsons» — действительно прекрасная пародия на американский образ жизни от мелочей до глобальных вопросов, это и юмор и философия и еще много отличных поводов для просмотра.

К чему это я? А к тому, что наверняка первое знакомство с семейством векторных инструкций SIMD (и, в частности, SSE) многих программистов не впечатлило. Какие-то новые инструкции с выпученными длинными регистрами, одновременно работающие над группой данных, возни много, а толку, скорее всего, мало…

Попробую радикально изменить это представление. Нет, я не буду убеждать вас, что SSE — прекрасное средство оптимизации приложений. Пойду другим путем. В Симпсонах — 21 сезон (кстати, это — самый длинный сериал в истории американского ТВ). В честь этого я приведу 21 интересный факт про Intel SIMD. Надеюсь, что действительно интересный — даже знатокам SIMD.

  1. В 2012 году мы будем отмечать конец света круглую дату — 16 лет с момента появления первого набора интеловских векторных инструкций — MMX (57 комманд работы с целочисленными данными, упакованными в 64-битные векторы)
  2. Поддержка Intel SIMD (генерация соответствующего векторизованного кода) есть во всех (известных мне) компиляторах С/С++, причем, последние несколько лет она делается даже с опережением — так новейших векторных Intel AVX инструкций «в железе» на рынке еще нет, а в Microsoft Visual Studio 2010 их поддержка уже есть — можно пользоваться.
  3. Компьютеры без SIMD сейчас — редчайшее исключение из правил. Так по данным очень популярного сервиса цифровой дистрибуции STEAM (через Steam распространяется почти тысяча игр и сборников, количество активных пользователей превышает более 15 миллионов) в апреле 2010 при соотношении общего количества CPU Intel к AMD около 70% к 30% у 98.40% пользователей компьютер поддерживает SSE2, а у 95.17% — SSE3 и SSE4!
  4. Компиляторы Microsoft, Intel и GCC C/C++ также поддерживают intrinsic функции для работы с SIMD. Для программиста они выглядят как обычные С-функции, выполняющие арифметические, логические и некоторые вспомогательные операции над группой 2-16 чисел (в зависимости от их типа, операции и использованного набора инструкций), например, сложение 4-ех чисел _mm_add_ps(a,b). А для компилятора intrinsic — это совсем не функция, а просто «ассемблерный макрос», так что время на его вызов не тратится. Интринсики хорошо документированы как в MSDN, так и в Intel Compiler help.
  5. Еще один возможный интерфейс работы с SIMD при использовании Intel Compiler — это входящие в его состав библиотеки классов — Intel C++ Class Libraries. Они содержат классы как целочисленных, так и floating point векторов ( I32vec4, F32vec4, I8vec16,..), их методы и перегруженные операторы используют MMX-SSE-SSE2 интринсики. Но если интринсики у разработчиков достаточно популярны, то векторные классы — нет, хотя они при абсолютно пренебрежимых накладных расходах украшают и упрощают код. Скорее всего, дело здесь в универсальности-портируемости кода. Если для интринсиков обычно используется условная компиляция (что-то типа #ifdef USE_SIMD {интринсики} #else {обычный код}), то для классов это сделать вроде бы немного сложнее. Но только на первый взгляд. Реализации векторных классов совмещены с их определениями, так что подправить заголовочные файлы (какие именно — см. документацию к Intel Compiler ) на свой вкус, например, включив туда не SIMD версию — элементарно.
  6. Узнать, насколько эффективно компилятору Intel удалось векторизовать ваш код, можно при помощи опции /(Q)vec-report[n]. Где n задает уровень детализации сообщения. Компилятор может не только указать, какие циклы были векторизованы, а какие нет, но, главное, и объяснить причину последнего. Например, “Existence of vector dependence” (Существование зависимости обрабатываемых в цикле массивов), “Condition too Complex” (Слишком сложное условие оператора if) или “Mixed Data Types” (Смешение в одной операции разных типов данных), “Not Inner Loop” (Этот цикл — не самый внутренний, а векторизуются пока только самые) и даже «Vectorization possible but seems inefficient» (Bекторизация возможна, но бесполезна для увеличения производительности)
  7. Если вы не согласны с мнением компилятора Intel насчет векторизации конкретного цикла, то можете его забанить воспользоваться специальными прагмами для более тонкого контроля векторизации. А именно, для запрета векторизации- #pragma novector ; а для «принудительной» векторизации — #pragma ivdep (ignore vector dependencies = игнорировать возможные зависимости последующих итераций цикла от предыдущих) и #pragma vector с аргументами, позволяющими\запрещающими компилятору использовать более быстрые инструкции перемещения выровненных данных или потокового сохранения (streaming store). Все подробности смотрите в документации к компилятору Intel.
  8. В готовящейся к выпуску новой версии компилятора Intel С\С++ будет улучшена работа автовекторизатора: в частности станет возможно получить не только диагностику невекторизуемости цикла, но и совет по исправлению ситуации. Также планируется добавить еще одну прагму контроля векторизации циклов — #pragma simd со множеством возможных аргументов позволит программисту более гибко управлять векторизацией по сравнению с существующей #pragma ivdep. Подробности — будут позже.
  9. Если вы используете компилятор не Intel, или если у вас есть только исполняемый файл, а хочется узнать, какие SIMD инструкции сгенерированы компилятором и в каком количестве, то можно воспользоваться простым и удобным инструментом. Написанная инженером Intel и совершенно бесплатная утилита Simd Check покажет статистику использования SIMD в exe файле. Прочитать подробности и скачать Simd Check можно здесь.
  10. Еще одну возможность узнать (хотя и приблизительно), сколько SIMD-инструкций использует ваше приложение, а главное, в каких именно функциях, дает Intel Vtune. Этот инструмент позволяет профилировку MMX и SSE Technology Events — регистрируемых процессором событий исполнения определенных SIMD-инструкций. Например, SIMD_INST_RETIRED.VECTOR посчитает количество целочисленных SSE2 инструкций, а SIMD_INSTR_RETIRED — общее количество исполненных SIMD-инструкций. Подробности — конечно же в Intel Vtune help.


Конец первых 10 серий, продолжение следует.
Tags:
Hubs:
+33
Comments26

Articles

Change theme settings