Как известно, WaveFront (AMD OpenCL) очень похожа на WARP (CUDA): http://research.cs.wisc.edu/multifacet/papers/isca14-channels.pdfМожем ли мы использовать команду `shuffle()` для обмена рег-рег-обмена между элементами (потоками) в WaveFront?
языков GPGPU, как OpenCL ™ и CUDA, называются SIMT, потому что они карту зрения программиста нити в SIMD-полоса. Темы , выполняемые на одном SIMD-блоке в замке, называются волновым фронтом (деформирование в CUDA).
Также известно, что AMD предложила нам (уменьшить) добавление чисел с использованием локальной памяти. А для ускорения добавления (Уменьшить) предлагает использовать векторные типы: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/01/AMD_OpenCL_Tutorial_SAAHPC2010.pdf
Но есть ли Оптимизированные регистр-регистр указания данных EXCHAGE между элементами (нити) в WAVEFRONT:
, такие как
int __shfl_down(int var, unsigned int delta, int width=warpSize);
в WARP (CUDA): https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/или такие, как
__m128i _mm_shuffle_epi8(__m128i a, __m128i b);
SIMD-полосы на x86_64: https://software.intel.com/en-us/node/524215
Эта перетасовка-инструкция может, например, выполнить Reduce (сложить значения) из 8 элементов из 8 нитей/полос, для 3 циклов без каких-либо синхронизаций и без использования кеша/локальной/разделяемой памяти (с задержкой ~ 3 такта для каждого доступа).
I.e. нити отправляет его значение непосредственно в регистр других потоков: https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/
Или OpenCL мы можем использовать только команду gentypen shuffle(gentypem x, ugentypen mask)
который может быть использован только для векторных типов, таких как float16/uint16 в каждой позиции (нити), но не между пунктами (нитей) в WAVEFRONT: https://www.khronos.org/registry/OpenCL/sdk/1.1/docs/man/xhtml/shuffle.html
Можно ли использовать что-то выглядит как shuffle()
для р-к-рег обмен данными между элементами (нитей) в WAVEFRONT, которые более быстрее, чем-данных Echange через локальную память?
Есть ли в AMD OpenCL инструкции для регистра-регистр данных обмена внутрисетевого WAVEFRONT, таких как инструкции __any()
, __all()
, __ballot()
, __shfl()
для внутрисетевого WARP (CUDA): http://on-demand.gputechconf.com/gtc/2015/presentation/S5151-Elmar-Westphal.pdf
Деформации голосование функции:
__any(predicate)
возвращает ненулевое значение, если какой-либо из предикатов для потоков в варп возвращает ненулевое__all(predicate)
возвращает не нуль, если все предикаты для потоков в перекосе возвращает ненулевая__ballot(predicate)
возвращает битовую маску с соответствующими битами потоков, установленных в котором предикат возвращает ненулевое значение__shfl(value, thread)
возвращает значение от запрашиваемой нити (но только если эта нить также выполняли __shfl() - операция)
с ONCLUSION:
Как известно, в OpenCL-2.0 есть Подгруппы с SIMD исполнения модели сродни фронты: Does the official OpenCL 2.2 standard support the WaveFront?
Для подгруппы есть - страница-160: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf
int sub_group_all(int predicate)
же, как CUDA-__all(predicate)
int sub_group_any(int predicate);
так же, как CUDA-__any(predicate)
Но в OpenCL нет аналогичные функции:
- CUDA-
__ballot(predicate)
- CUDA-
__shfl(value, thread)
Там находится только Intel заданные встроенные функции воспроизведения в случайном порядке в версии 4, 28 августа 2016 Окончательный проект OpenCL Extension # 35 : intel_sub_group_shuffle
, intel_sub_group_shuffle_down
, intel_sub_group_shuffle_down
, intel_sub_group_shuffle_up
: https://www.khronos.org/registry/OpenCL/extensions/intel/cl_intel_subgroups.txt
Также в OpenCL есть функции, которые нам ually осуществляется перетасовки-функций, но не все функции, которые могут быть реализованы с помощью Shuffle-функций:
<gentype> sub_group_broadcast(<gentype> x, uint sub_group_local_id);
<gentype> sub_group_reduce_<op>(<gentype> x);
<gentype> sub_group_scan_exclusive_<op>(<gentype> x);
<gentype> sub_group_scan_inclusive_<op>(<gentype> x);
Резюме:
shuffle
-функция остается более гибкие функции, а также обеспечить максимально возможную связь между потоками с прямым регистром-регистр данных обмена.Но функции
sub_group_broadcast
/_reduce
/_scan
не гарантирует прямые данные, обмен, и эти суб-групповые функции регистра-регистр менее гибкими.
@huseyin Tugrul buyukisik Да мне нужно открыть частный регистр другого потока. Например, если у меня есть небольшой массив в локальной памяти с 32-64 элементами, и я хочу их обобщить. Тогда самый быстрый способ - использовать потоки 32-64, но без слишком большого доступа к локальной памяти. – Alex
Если массив большой, команды work_group_-reduce-scan могут помочь –
Я не совсем уверен, но описанные здесь операции 'swizzle' [1] напоминают о nvidia shuffle. Может ли кто-нибудь более осведомленный комментарий по этому поводу? [1]: http://gpuopen.com/amd-gcn-assembly-cross-lane-operations/ – mSSM