如何将标量参数传递给金属内核函数?

How to pass scalar parameter to a metal kernel function?

我是金属新手。我想使用金属计算来做一些数学运算,所以我创建了一个内核函数(着色器?),比方说

    kernel void foo(device float *data1,
                    device float *data2,
                    device float *result,
                    int flag,
                    uint index [[thread_position_in_grid]])
    {
      if(flag==SOMETHING)
      {
      }...
    }

是否想过将标量值编码为 MTLComputeCommandEncoder 中的 flag 参数?

你已经在做了。具有“任意”数据的 void* 缓冲区与 int.

之间没有太大区别

Juse 使绑定成为 deviceconstant(因为它是一个标志,我认为 constant 更合适)地址 space 引用并装饰如果使用 [[ buffer(n) ]] 属性以获得更好的可读性(以及其他缓冲区绑定),因此您的新函数签名将看起来像

kernel void foo(device float *data1 [[buffer(0)]],
                device float *data2 [[buffer(1)]],
                device float *result [[buffer(2)]],
                device int& flag [[buffer(3)]],
                uint index [[thread_position_in_grid]])

至于编码器,您可以在 MTLComputeCommandEncoder 上使用 setBuffersetBytes,但基本上,最简单的方法是

id<MTLComputeCommandEncoder> encoder = ...
// ...
int flag = SomeFlag | SomeOtherFlag
[encoder setBytes:&flag length:sizeof(flag) atIndex:3];