Как передать скалярный параметр функции металлического ядра?

#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];