2017-02-15 6 views
2

Как известно, AMD-OpenCL поддерживает WAVEFRONT (август 2015): http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_Optimization_Guide2.pdfПоддерживает ли официальный стандарт OpenCL 2.2 поддержку WaveFront?

Процессор AMD Radeon HD 7770 GPU, например, поддерживает более 25000 в полете рабочие-детали и может переключаться на новую волновой фронт (содержащий до 64 рабочих элементов) за один цикл.


Но почему в стандартах OpenCL 1,0/2,0/2,2 нет никакого упоминания о WAVEFRONT?

Ни один из PDF не имеет ни слова WaveFront: https://www.khronos.org/registry/OpenCL/specs/

Также я обнаружил, что:

OpenCL является открытым стандартом. Он по-прежнему не поддерживает эту концепцию . Он даже не поддерживает wavefront/warp.

Вот почему понятие не на самой спецификации OpenCL.

Стандарт OpenCL не имеет понятие "волнового фронта"

enter image description here

Действительно, официальный стандарт OpenCL 2.2 по-прежнему не поддерживает WaveFront?


ЗАКЛЮЧЕНИЕ:

Там нет WaveFront в OpenCL стандарт, но в OpenCL-2.0 есть Подгруппы с SIMD исполнения модели сродни фронты.

6.4.2 Функции Рабочая группа/подгруппа уровня

OpenCL 2.0 вводит расширение подгруппу в Хронос . Подгруппы представляют собой логическую абстракцию аппаратной SIMD-модели выполнения, аналогичную волновым фронтам, искажениям или векторам и разрешать программирование ближе к оборудованию независимо от поставщика. Это расширение включает в себя набор встроенных функций кросс-подгруппы, которые соответствуют набору встроенных функций кросс-группы , указанных выше.

ответ

1

Они должны пошли более динамичного подхода называется sub-group: https://www.khronos.org/registry/OpenCL/specs/opencl-2.2.pdf

Sub-group: Sub-groups are an implementation-dependent grouping of work-items within a 
work-group. The size and number of sub-groups is implementation-defined. 

и

Work-groups are further divided into sub-groups, 
which provide an additional level of control over execution. 

и

The mapping of work-items to 
sub-groups is implementation-defined and may be queried at runtime. 

так, даже если его не называется волнового фронта, его теперь queryab le во время выполнения и

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

даже если вы не можете потерять время.

Поверх них

sub_group_all() and 
sub_group_broadcast() and are described in OpenCL C++ kernel language and IL specifications. 
The use of these sub-group functions implies sequenced-before relationships between statements 
within the execution of a single work-item in order to satisfy data dependencies. 

о том, что какая-то внутри подгруппы связи существует. Потому что теперь OpenCL имеет определение ребенка-ядра: (? Модернизированы)

Device-side enqueue: A mechanism whereby a kernel-instance is enqueued by a kernel-instance 
running on a device without direct involvement by the host program. This produces nested 
parallelism; i.e. additional levels of concurrency are nested inside a running kernel-instance. 
The kernel-instance executing on a device (the parent kernel) enqueues a kernel-instance (the 
child kernel) to a device-side command queue. Child and parent kernels execute asynchronously 
though a parent kernel does not complete until all of its child-kernels have completed. 

В конечном счете, с чем-то вроде

kernel void launcher() 
{ 
    ndrange_t ndrange = ndrange_1D(1); 
    enqueue_kernel(get_default_queue(), CLK_ENQUEUE_FLAGS_WAIT_KERNEL, ndrange, 
    ^{ 
    size_t id = get_global_id(0); 
    } 
    ); 
} 

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


2.0 API функции говоря:

Extreme care should be exercised when writing code that uses 
subgroups if the goal is to write portable OpenCL applications. 

, который напоминает 16-широкий simds AMD, и 32-широкий simds Нвидии в сравнении 95-широких ядер вычислительных воображаемого ПЛИСА. Возможно, псевдоволновый фронт?

+0

Спасибо! Но что это значит и какая проблема может быть: «Чрезмерная забота должна выполняться при написании кода, который использует подгруппы, если цель состоит в том, чтобы писать переносные приложения OpenCL»? Как там сказано: '** Подгруппы - это логическая абстракция аппаратной модели выполнения SIMD **, подобной волновым фронтам': page-100: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media /2013/12/AMD_OpenCL_Programming_User_Guide2.pdf – Alex

+0

Если подгруппы являются логической абстракцией аппаратного SIMD, и если во время выполнения я могу получить ширину подгруппы (SIMD) для текущего устройства, используя 'get_sub_group_size()'/'get_max_sub_group_size()', где может возникнуть проблема? page-160: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf – Alex

+1

get_max_sub_group_size: он говорит: «Это значение будет инвариантным для заданного набора параметров отправки и объект ядра, скомпилированный для данного устройства, поэтому он будет работать –

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