如何将标量参数传递给金属内核函数?
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 使绑定成为 device
或 constant
(因为它是一个标志,我认为 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
上使用 setBuffer
或 setBytes
,但基本上,最简单的方法是
id<MTLComputeCommandEncoder> encoder = ...
// ...
int flag = SomeFlag | SomeOtherFlag
[encoder setBytes:&flag length:sizeof(flag) atIndex:3];
我是金属新手。我想使用金属计算来做一些数学运算,所以我创建了一个内核函数(着色器?),比方说
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 使绑定成为 device
或 constant
(因为它是一个标志,我认为 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
上使用 setBuffer
或 setBytes
,但基本上,最简单的方法是
id<MTLComputeCommandEncoder> encoder = ...
// ...
int flag = SomeFlag | SomeOtherFlag
[encoder setBytes:&flag length:sizeof(flag) atIndex:3];