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

4

我对Metal还不熟悉。想用Metal计算进行一些数学运算,所以创建了一个内核函数(着色器?),假设如下:

    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参数?
1个回答

8
你已经在做了。一个带有“任意”数据的 void* 缓冲区和一个 int 之间没有太大的区别。
只需将绑定设置为 deviceconstant(由于这是一个标志,我假设constant 更合适),并使用 [[ 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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接