#metal
#Металлические
Вопрос:
Я новичок в металле. Я хочу использовать metal compute для выполнения некоторой математики, поэтому я создаю функцию ядра (шейдер?), Скажем
kernel void foo(device float *data1,
device float *data2,
device float *result,
int flag,
uint index [[thread_position_in_grid]])
{
if(flag==SOMETHING)
{
}...
}
Есть идея закодировать скалярное значение в flag
параметр MTLComputeCommandEncoder
?
Ответ №1:
Вы уже это делаете. Нет большой разницы между void*
буфером с «произвольными» данными и int
.
Просто сделайте привязку device
or constant
(поскольку я бы предположил, что это флаг constant
, который более подходит) ссылкой на адресное пространство и украсьте if [[ buffer(n) ]]
атрибутом для лучшей читаемости (и другими привязками буфера также), поэтому ваша новая подпись функции будет выглядеть так
kernel void foo(device float *data1 [[buffer(0)]],
device float *data2 [[buffer(1)]],
device float *result [[buffer(2)]],
device intamp; flag [[buffer(3)]],
uint index [[thread_position_in_grid]])
Что касается кодировщика, вы можете использовать setBuffer
или setBytes
на своем MTLComputeCommandEncoder
, но, по сути, самый простой способ сделать это:
id<MTLComputeCommandEncoder> encoder = ...
// ...
int flag = SomeFlag | SomeOtherFlag
[encoder setBytes:amp;flag length:sizeof(flag) atIndex:3];