我是金属新手。我想使用金属计算来做一些数学运算,所以我创建了一个内核函数(着色器?),比方说
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?
你已经在这么做了。具有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)
至于编码器,您可以使用setBuffer或setBytes在您的MTLComputeCommandEncoder但基本上,最简单的方法是
id<MTLComputeCommandEncoder> encoder = ...
// ...
int flag = SomeFlag | SomeOtherFlag
[encoder setBytes:&flag length:sizeof(flag) atIndex:3];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1228 次 |
| 最近记录: |