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

Metal API вопросы

Страницы: 1 2 3 Следующая »
#0
12:15, 21 мая 2021

Обсуждаем сие странное творение.
В общем-то к самому апи у меня претензий мало, а вот валидация написано какими-то студентами, да и профайлер сообщает о ложных утечках.

Например [MTLInstanceAccelerationStructureDescriptor descriptor] постоянно течет, как утверждает профайлер, что бы ты не делал. Даже в сэмплах от эпла.

Или такие сюрпризы от валидации

checkAccelerationStructureDescriptor:120: failed assertion `Index buffer offset (16) must be a multiple of the index data type stride (4)'
Сначала думал они неправильно условие написали, потом прочитал в документации:
Specify an offset that is a multiple of the index data type size and a multiple of the platform’s buffer offset alignment.

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

Дальше веселее, на М1 поддерживается MTLGPUFamilyMac2 и MTLGPUFamilyApple7 для которых разные значения Minimum buffer offset alignment - 4 и 256 байт. И какое из них мне нужно?
Есть еще Buffer alignment for copying an existing texture to a buffer - 16 и 256 байт.
Таблица https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf

Дальше проверяю какое смещение нужно для вершинного буфера. В доках пишут

The vertex must be a multiple of the vertex stride and must be a multiple of 4 bytes.

Ставлю stride = 12, offset = 12 и получаю гениальное:
`Index buffer offset (256) must be a multiple of the index data type stride (4)'

Опять же экспериментально выяснил, что stride = 16, offset = 16 работает, а stride = 12, offset = 32 не подходит так как 32 не кратно 12.

Ну и как под это разрабатывать?

#1
12:24, 21 мая 2021

А еще в отличие от ДХ и вулкана, в метале ошибка валидации это как крэш, нельзя сказать "заткнись и продолжай работать", надо либо фиксить ошибку, либо отключать валидацию.

#2
16:54, 21 мая 2021

/A\
ты на Objective C/Swift на Metal пишешь?
Metal хотел бы пощупать.

#3
19:00, 21 мая 2021

Andrey
У меня есть обертка на С++ над ObjC, типа MetalPP, это для прототипирования.
А так в движке есть поддержка метала на ObjC с С++ интерфейсами.

#4
22:44, 21 мая 2021

/A\
> обертка на С++ над ObjC
а Objective-C++ чем не устроил?

#5
12:24, 22 мая 2021

Misanthrope
> а Objective-C++ чем не устроил?
Тем, что там ручное управление ссылками, хитрые авторелиз пулы и прочие нюансы из-за которых все либо крашится, либо течет память. Уж лучше на понятном С++ все писать, чем изучать никому не нужный язык.

#6
14:38, 22 мая 2021

/A\
> из-за которых все либо крашится, либо течет память
ну странно

#7
23:41, 24 мая 2021

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

#8
9:21, 29 мая 2021

А кто-нибудь смотрел размер SIMD группы (threads_per_simdgroup) на разных айфонах?
В MoltenVk начиная с А13 указано 32, а до этого 4, но там это параметр берется в зависимости от ГПУ, а не читается из шейдера.
Или до А13 вообще не поддерживались SIMD и 4 возвращается для quad group?

#9
22:46, 30 мая 2021

/A\
ну вроде так
Determine the SIMD Group Size at Runtime
In a compute shader, the SIMD group size, also called the thread execution width, is the number of threads that run together on the GPU. Metal Shading Language specifies some operations that are specific to SIMD groups, while other operations apply to the larger threadgroups; to implement some shaders efficiently, you need to know the SIMD group size.

The size of a SIMD group varies between different GPUs, particularly Mac GPUs. Don’t assume the size of SIMD groups. At runtime, after you create a compute pipeline state object, read its threadExecutionWidth property to get the SIMD group size for that compute pipeline. To get the SIMD group size in your shader, declare an argument with the threads_per_simdgroup attribute, instead.

https://developer.apple.com/documentation/apple-silicon/porting-y… apple-silicon

#10
11:11, 31 мая 2021

Misanthrope
Все стало еще запутанее.
thread_execution_width - The execution width of the compute unit. (Metal 1.0)
threads_per_simdgroup - The thread execution width of a SIMD-group. (Metal 2.0)
MTLComputePipelineState::threadExecutionWidth - The number of threads that are executed simultaneously by the GPU. (iOS 8.0 = Metal 1.0)

Если threads_per_simdgroup не константа, то толку от SIMD вообще никакого, потому что обычно делаешь данные кратные размеру варпа, а если этот размер зависит от кода, да еще и достать его можно только выполнив код...

#11
16:21, 1 июня 2021

И снова этот удивительный метал:
Все команды там сделаны через пассы (рендер, компью, блит и тд), на М1 я могу замерять время только в начале и конце каждого пасса. И внезапно оказалось, что метал может переставлять пассы и выполнять их параллельно, из-за чего замер времени группы пассов несколько усложнаяется. Нельзя замерить время начала первого пасса и время конца последнего, надо замерять время всех пассов и складывать их, даже в таком случае есть вероятность, что другие пассы будут выполняться параллельно и периодически замедлять, те, что я замеряю.
На вулкане было проще - writetimestamp неявно вставлял барьер и никто не мог переставить команды через барьер.

#12
(Правка: 17:50) 17:50, 15 июня 2021

https://developer.apple.com/videos/play/wwdc2021/10150/
Скоро будет рейтрейсинг из тайл шейдера (внутри рендер пасса)

#13
18:12, 15 июня 2021

/A\
> Скоро будет рейтрейсинг из тайл шейдера (внутри рендер пасса)
это на каких-то эпловских gpu?

#14
18:33, 15 июня 2021

Misanthrope
> это на каких-то эпловских gpu?
Да, А13-14 и М1

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика