Я недавно написал Внутренний патч VSX для Chroma from Luma (CfL) в AV1 и решил, что могу написать об этом опыте.

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

В этом посте мы рассмотрим самые полезные ресурсы, с которыми мне приходилось сталкиваться (пока что).

Встроенные функции XL C Vector

Самый полезный источник документации - это раздел векторные встроенные функции документации компилятора IBM XL C. Таблица содержания (которая по умолчанию скрыта и может быть открыта, щелкнув стрелку в левой части страницы) позволяет быстро выполнять поиск (используя функцию поиска в вашем браузере ) для внутреннего. Приведенная документация довольно ограничена, но часто полезны таблицы поддерживаемых типов.

Примечание: эта документация не на 100% совместима с GCC, но все же очень хороша. Например, vec_perm недоступен в предыдущем списке, но доступен в GCC.

Power ISA v2.07B

Хорошим дополнением к векторным встроенным функциям является Power ISA. Этот документ не касается непосредственно встроенных функций VSX, в нем перечислены инструкции PowerPC (на которых основаны встроенные функции).

Поскольку мне дали доступ к Power8, я использовал Power ISA v2.07B. В этом руководстве в главе 6 (стр. 213) перечислены все инструкции VSX Integer SIMD. Эта глава содержит большое количество документации по каждой инструкции, а инструкции сгруппированы по функциям (инструкции сложения векторных целых чисел, инструкции векторного целочисленного умножения, инструкции сравнения векторных целых чисел ...). Это очень полезно, если у вас есть только общее представление о том, что вы хотите сделать, и вы хотите изучить различные доступные инструкции.

Алтивек ПИМ

Altivec PIM - это старое (1999 г.) руководство по внутренним функциям altivec.

AltiVec является товарным знаком, принадлежащим исключительно Freescale, поэтому система также упоминается Apple как Velocity Engine и VMX (Vector Multimedia Extension ) IBM и PA Полу.
Ссылка: https://en.wikipedia.org/wiki/AltiVec

Поскольку VSX является расширением VMX, это руководство охватывает многие основные особенности, которые я использовал при написании патча VSX. Что мне действительно нравится в этом руководстве, так это то, что оно хорошо документировано и содержит множество иллюстраций.

В главе 4 на стр. 54 вы получите листы с описанием работы встроенных компонентов Altivec. Вы можете сравнить документацию vec_perm для встроенных векторных функций и Power ISA v2.07B на предыдущих снимках экрана с документацией Altivec PIM на следующем снимке экрана.

Переход с Intel SSE на PowerPC AltiVec

Идея здесь отличная, Розеттский камень внутренних компонентов, но, как и в случае с Розеттским камнем, отсутствуют детали. Изначально я планировал использовать этот документ в качестве основного источника документации для моего патча VSX, но быстро обнаружил, что многие встроенные функции Intel, которые я искал, не были включены.

Не поймите меня неправильно, здесь много внутренних особенностей Intel, я думаю, что проблема скорее в том, что между Intel SIMD и VSX не всегда есть однозначное преобразование.

Этот ресурс также содержит раздел, озаглавленный «Краткий справочник по GNU / GCC PowerPC AltiVec API». Одна вещь, которая очень полезна в нем, - это столбец комментариев, который может предоставить интересную информацию или указать другие рекомендуемые альтернативные встроенные функции.

Встроенные функции GCC PowerPC AltiVec

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

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

Технические ресурсы Apple Velocity Engine

Похоже, это архив серии руководств по Apple Velocity Engine, датируемых 2004 годом и предназначенных для PowerMac G4 и G5.

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

Вывод

Конечным ресурсом может быть: подробные описания и иллюстрации, актуальные, с возможностью быстрого поиска, совместимость компилятора списков и даже указание задержки и циклов. Честно говоря, вы не найдете этот документ для Intel или для встроенных функций Arm.

Написание патчей SIMD для любых платформ включает в себя открытие нескольких вкладок и циклическое переключение между ними для поиска нужной информации. Особенность VSX в том, что у вас открыто еще несколько вкладок.

Кстати, найти хорошее (после 2000 года) видео на PowerPC SIMD на YouTube чрезвычайно сложно, но я наткнулся на презентацию Velocity Engine 2004 года на WWDC. Это, вероятно, лучшее видео PowerPC SIMD на Youtube, поэтому его определенно стоит посмотреть. Наслаждаться.