Воронкообразный сдвиг - что это?

При чтении через Руководство по программированию CUDA 5.0 я наткнулся на функцию под названием "Смещение последовательности", которая присутствует в устройстве с поддержкой вычислений, но не в 3.0. Он содержит аннотацию "см. Справочное руководство", но когда я ищу термин "сдвиг воронки" в руководстве, я ничего не нахожу.

Я попробовал поиск по сайту, но только нашел упоминание в http://www.cudahandbook.com в главе 8:

8.2.3 Смещение воронки (SM 3.5)

GK110 добавил 64-битную инструкцию "сдвиг воронки", к которой можно получить доступ со следующими характеристиками:

__ funnelshift_lc(): возвращает наиболее значимые 32 бита сдвига левой воронки.

__ funnelshift_rc(): возвращает наименее значимые 32 бит правильного сдвига воронки.

Эти встроенные функции реализованы как встроенное устройство функции (используя встроенный ассемблер PTX) в sm_35_intrinsics.h.

... но он все еще не объясняет, что такое "сдвиг левой воронки" или "правый сдвиг воронки".

Итак, что это такое и где он нужен?

Ответ 1

В случае CUDA два 32-разрядных регистра объединяются вместе в 64-битное значение; это значение смещено влево или вправо; и наиболее значимые (для сдвига влево) или наименее значимые (для правого сдвига) возвращаются 32 бита.

Внутренние свойства из sm_35_intrinsics.h следующие:

unsigned int __funnelshift_lc(unsigned int lo, unsigned int hi, unsigned int shift);
unsigned int __funnelshift_rc(unsigned int lo, unsigned int hi, unsigned int shift);

Согласно Энди Глоу (удаленная ссылка удалена), приложения для сдвига воронки включают быструю смещенную memcpy; и, как упоминает njuffa в комментариях выше, его можно использовать для реализации поворота, если два входных слова одинаковы.