Войти
ПрограммированиеФорумГрафика

ShaderModel 6.0

#0
14:46, 12 янв. 2019

Привет всем!

Может ли кто-нибудь объяснить, что нового в 6 шейдерной модели? Я пытаюсь курить msdn, но никак не могу понять, что за Lane и Wave? Это что-то вроде потоков (Thread), только на GPU? Что мы можем на одном ядре несколько запускать? Что это за функции WaveReadLaneAt, WaveActiveBitXor и т.п.? Что обработка разных соседних пикселей может между собой общаться/синхронизироваться, не дожидаясь всех? Или как?

HLSL Shader Model 6.0

Я понимаю, что они добавили какие-то сущности, но я никак не могу понять, что это, как это работает, как это использовать и какие у этого преимущества?


#1
15:17, 12 янв. 2019

Это потоки внутри одного compute unit, у AMD их 64, у nvidia 32.
Ты можешь оптимизировать шейдер так чтоб один бранч выполнялся на определенном количестве потоков, а другая ветвь на остальных. То есть делаешь ручной бранч предикшн. Возможно есть другие сценарии использования, видел несколько презентаций где об этом рассказывали.

#2
(Правка: 15:56) 15:51, 12 янв. 2019

Еще можно расшарить данные внутри одного wave в том числе и в вершинном и фрагментном шейдерах, если поддерживается.
В общем как локальная группа в компьют шейдере, только везде и чуть быстрее.

Тут видео
https://gpuopen.com/optimize-engine-using-compute-4c-prague-2018/

#3
20:26, 12 янв. 2019

Спасибо, хотя бы стал понимать общую суть.

#4
1:21, 13 янв. 2019

Kirwer7245
> что за Lane и Wave? Это что-то вроде потоков (Thread), только на GPU?
Да.
Wave — это пачка Lanes (тредов), которые выполняются одновременно на процессоре. Lane — это один такой тред из Волны.

#5
(Правка: 11:27) 11:07, 13 янв. 2019

/A\
> Это потоки внутри одного compute unit, у AMD их 64, у nvidia 32.
Не в теме SM6.0, просто стало интересно, что значит у AMD 64, а у nVidia - 32? Речь же о warp-е? Если так - то он на данный момент у всех 32 и это хардверная сущность, если же речь о work-group/block/compute-unit, то есть по сути о виртуальной сущности, то мне видится весьма странным жёсткий лок на его размер.
P.S.: шейдеры медленно, но верно идут в сторону возможностей OpenCL/CUDA, что не может не радовать, хотя без открытия прямого доступа ко всем хардверным фичам видеокарты (того же растеризатора) от этого толку мало, т.к. ты вынужден всё равно плясать под чью-то заранее спроектированную дудку, хотя для рядов проектов мог бы спроектировать намного более удачный pipe-line, по этому, на мой взгляд, будущее не за залоченными GPU, а за FPGA.

#6
12:02, 13 янв. 2019

™­•-=MASTER=-•™
> Речь же о warp-е?
Да, просто названий для этого много: warp, wavefront, subgroup, ...
Это все давно уже есть в CUDA, теперь наконец появилось и в других апи.

> Если так - то он на данный момент у всех 32 и это хардверная сущность
http://vulkan.gpuinfo.org/displayreport.php?id=4966
subgroupSize 64, так всегда было.

Насколько я помню в CUDA оптимизации для warp могут применяться автоматически при компиляции, такой вариант мне нравится больше.

#7
(Правка: 14:40) 14:39, 13 янв. 2019

/A\
> Да, просто названий для этого много: warp, wavefront, subgroup, ...
Не уверен на счёт одинаковой семантики слов warp и wavefront, всё таки wavefront это несколько другое, больше виртуальное понятие, в то время как warp - это хардверный юнит и я ещё не встречал видеокарты с размером warp-а больше 32-х, да и нецелесообразно это, т.к. при увеличение размера warp-а уменьшается возможная степень декомпозиции задачи.
Если говорить про NVidia, то достаточно посмотреть на сводную таблицу CUDA Compute Capabilities, она там ближе к низу, ищите по фразе: "Table 14. Technical Specifications per Compute Capability":
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#… -capabilities
и тогда станет ясно, что Warp size во всех поколения равен 32-м, точка. Может конечно AMD пошла другой дорогой, но что-то я сильно сомневаюсь, т.к. карт AMD у меня тоже было не мало и у всех он так же был равен 32-м... Другое дело, что мультипроцессор устроен довольно не просто, там например есть warp schedulers-ы, количество которых как раз различается и много чего ещё...

В общем, если ваш subgroupSize на Вулкане равен 64-м, то вряд ли речь о warp-е или же это какой-то скрытый элемент графического Pipe-Line или же это тупо не хардверный warp, а Work Group/Block (виртуальная сущность, не хардверная), размер которого как раз можно задавать в OpenCL/CUDA, ну это тот, у которого есть ещё local/shared memory на весь блок.

#8
(Правка: 15:11) 15:04, 13 янв. 2019

™­•-=MASTER=-•™
> В общем, если ваш subgroupSize на Вулкане равен 64-м, то вряд ли речь о warp-е
Это именно хардварный warp, у AMD - 64, nvidia - 32, Intel - 32, Adreno - 64

#9
15:25, 13 янв. 2019

/A\
> у AMD - 64
не знаю не знаю... на последней моей AMD Radeon HD 7850 warp был 32

#10
15:36, 13 янв. 2019

™­•-=MASTER=-•™
В openCl Kernel Preferred work group size multiple мог быть 32, а реальный размер варпа раньше нигде не возвращался.
В вулкане четко прописано что subgroupSize это как раз размер хардварного варпа.

#11
15:57, 13 янв. 2019

/A\
> а реальный размер варпа раньше нигде не возвращался.
я уже точно не припомню, может и гоню, но вроде warp на последней моей AMD был 32 и смотрел я его вроде через CodeXL, не помню как параметр назывался, ну а для NVidia есть:
CL_NV_DEVICE_WARP_SIZE
:-)
P.S.: сейчас погуглил и на нескольких форумах рассказывали что у AMD уже давно warp size = 64, а раньше был 32 и 16.

Даже не знаю, на мой взгляд размер варпа в 32 намного лучше, чем 64, т.к. гораздо больше гибкости по размеру grid-а, хотя с другой стороны, всякие шафл инструкции работают только внутри варпа, но часто ли ты их используешь...

ПрограммированиеФорумГрафика