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

Vic*_*ang 4 metal

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

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

Run Code Online (Sandbox Code Playgroud)

是否有将标量值编码为flag参数的想法MTLComputeCommandEncoder

Ego*_*rov 8

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

Juse 将绑定设置为deviceor constant(因为它是一个我认为constant更合适的标志)地址空间引用并用[[ buffer(n) ]]属性装饰 if 以提高可读性(以及其他缓冲区绑定),因此您的新函数签名将如下所示

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]])
Run Code Online (Sandbox Code Playgroud)

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

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