2016-12-19 24 views
0

Я только недавно обнаружил эквивалент AMD для __byte_perm CUDA; amdgcn_ds_swizzle (Или, по крайней мере, я думаю, что это эквивалент функции перестановки байтов). Моя проблема заключается в следующем: байты CUDA perte берут два беззнаковых 32-битных целых числа, а затем переставляют их на основе значения аргумента селектора (поставляемого в виде шестнадцатеричного значения). Однако функция swizzle от AMD занимает всего одно целое без знака 32 бита, а один int - как «шаблон». Как использовать встроенную функцию AMD Swizzle?AMD HCC Swizzle Intrinsic

+0

Вы прочитали инструкцию? – user3528438

+0

[This] (http://scchan.github.io/hcc/hc_8hpp.html) - это единственное руководство, которое у меня есть. Это не дает много информации. Я уже искал по всему Интернету и ничего не нашел (к сожалению, я не ищу место). Поэтому я перешел на stackoverflow в качестве своего последнего средства. – ligosan

+0

http://gpuopen.com/amd-gcn-assembly-cross-lane-operations/ – user3528438

ответ

0

ds_swizzle и __byte_perm сделать это немного по-другому. Один переставляет весь регистр по дорожкам, а позже переводит все четыре байта из двух 32-битных регистров.

Инструкция AMD ds_swizzle_b32 GCN фактически заменяет значения другими дорожками. Вы указываете 32-битный регистр в полосе, которую вы хотите прочитать, и 32-разрядный регистр, в который вы хотите поместить его. Также имеется жестко закодированное значение, указывающее, как они должны быть заменены. Отличным объяснением ds_swizzle_b32 является here как указано пользователем3528438.

__byte_perm не заменяет данные другими дорожками. Он просто собирает любые 4 байта из двух 32-битных регистров в своей собственной полосе и сохраняет их в регистре. Нет никакого перекрестного движения.

Я предполагаю, что следующий вопрос будет состоять в том, как выполнить «байтовую перестановку» на оборудовании AMD GCN. Инструкция для этого: v_perm_b32. (см. стр. 12-152 here) Он в основном выбирает любые четыре байта из двух указанных 32-разрядных регистров.

+0

Благодарим вас за эту информацию. Функция v_perm_b32, похоже, не была реализована с помощью компилятора HCC. Есть ли способ реализовать его вручную, используя инструкцию необработанной сборки? Я думал о вызове инструкции «v_perm_b32» внутри кода устройства, используя функцию «asm», но, видимо, это незаконно с HCC. – ligosan

+0

Извините, я мало знаю о компиляторе HCC, потому что у него нет поддержки Windows Visual Studio. Я знаю, что это возможно в C# (__asm4GCN), но это, вероятно, не то, что вы ищете. Было бы здорово, если бы HCC или OpenCL поддерживали встроенный asm! Кстати, возможно, вы можете запросить поддержку v_perm_b32 в компиляторе HCC. (или даже лучше поддержка asm) – Sunsetquest