2017-02-15 58 views
3

Как известно, 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

enter image description here


Но есть ли Оптимизированные регистр-регистр указания данных EXCHAGE между элементами (нити) в WAVEFRONT:

Эта перетасовка-инструкция может, например, выполнить Reduce (сложить значения) из 8 элементов из 8 нитей/полос, для 3 циклов без каких-либо синхронизаций и без использования кеша/локальной/разделяемой памяти (с задержкой ~ 3 такта для каждого доступа).

I.e. нити отправляет его значение непосредственно в регистр других потоков: https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/

enter image description here

Или 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);

Резюме:

  1. shuffle -функция остается более гибкие функции, а также обеспечить максимально возможную связь между потоками с прямым регистром-регистр данных обмена.

  2. Но функции sub_group_broadcast/_reduce/_scan не гарантирует прямые данные, обмен, и эти суб-групповые функции регистра-регистр менее гибкими.

+0

@huseyin Tugrul buyukisik Да мне нужно открыть частный регистр другого потока. Например, если у меня есть небольшой массив в локальной памяти с 32-64 элементами, и я хочу их обобщить. Тогда самый быстрый способ - использовать потоки 32-64, но без слишком большого доступа к локальной памяти. – Alex

+0

Если массив большой, команды work_group_-reduce-scan могут помочь –

+0

Я не совсем уверен, но описанные здесь операции 'swizzle' [1] напоминают о nvidia shuffle. Может ли кто-нибудь более осведомленный комментарий по этому поводу? [1]: http://gpuopen.com/amd-gcn-assembly-cross-lane-operations/ – mSSM

ответ

1

Существует

gentype work_group_reduce<op> (gentype x) 

для версии> = 2,0

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

Возможно, некоторые поставщики регистрируют способ, а некоторые используют локальную память. Я полагаю, что Nvidia делает с регистром. Но старый основной Amd gpu имеет пропускную способность локальной памяти 3,7 ТБ/с, которая по-прежнему является хорошей суммой. (изменить: его не 22 ТБ/с). Для ядер 2k это означает почти 1.5 байт за цикл на ядро ​​или намного быстрее на строку кеша.

Для% 100 регистра (если не разливы к глобальной памяти) версии, вы можете уменьшить количество потоков и делать векторизованное сокращение в самих потоках без общения с другими людьми, если числом элементов являются только 8 или 16. Такими, как

v.s= v.s4567 
v.s01 += v.s23 
v.s0 += v.s1 

, который должен быть похож на __m128i _mm_shuffle_epi8, а его версия суммы при компиляции на CPU и нескалярных реализациях будет использовать один и тот же SIMD на графическом процессоре для выполнения этих 3 операций.

Также использование этих типов векторов имеет тенденцию использовать эффективные транзакции памяти даже для глобальных и локальных, а не только для регистров.

SIMD работает только на одном волновом фронте за раз, но волновой фронт может обрабатываться несколькими SIMD, поэтому эта векторная операция не означает, что используется целый волновой фронт. Или даже целый волновой фронт может вычислять 1-й элемент всех векторов в цикле. Но для процессора наиболее логичным вариантом является работа SIMD-вычислений по очереди (avx, sse) вместо параллельного вычисления их одними и теми же индексированными элементами.


Если основная рабочая группа не соответствует требованиям Ones, есть ребенок ядра на нерест и использовать динамические ядра ширины для такого рода операций. Детское ядро ​​работает в другой группе под названием sub-group одновременно. Это делается в очереди на стороне устройства и требует, чтобы версия OpenCl была как минимум 2.0.

Посмотрите на «стороне устройства Епдиеие» в http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf

AMD APP SDK поддерживает Подгруппа

+0

Спасибо! Можете ли вы добавить к ответу, что теперь AMD APP SDK поддерживает подгруппу, похожую на WaveFronts? И есть 'sub_group_all (предикат)' и 'sub_group_any (предикат)', который похож на CUDA-'__all (предикат) 'и CUDA-'__any (предикат)'. Но нет функций, подобных CUDA-'__ballot (предикат) 'и CUDA-'__shfl (value, thread)'. Страница-160: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf И я приму ответ. – Alex

+0

На самом деле это функция opencl, а не только amd. Если это устройство 2.0, оно должно поддерживать или позволять ему запрашивать его, как я знаю. Я добавил к концу ответа. да, это больше похоже на ботовую CUDA. «Если очереди устройств вне очереди являются обязательными, и они поддерживаются любыми устройствами с поддержкой OpenCL 2.0». говорится здесь: https://community.amd.com/thread/170319 –

 Смежные вопросы

  • Нет связанных вопросов^_^