这是一个简单的金属计算着色器:
kernel void test(uint k [[ thread_position_in_grid ]],
device float* a [[buffer(1)]]){
a[k] = 2;
};
在CPU上我像这样访问数据:
let size = floatArray.count * MemoryLayout.size(ofValue: floatArray[0])
metalBuffer = device.makeBuffer(bytes: floatArray, length: size, options: [])
data = metalBuffer.contents().assumingMemoryBound(to: Float.self)
floatArray
全是零。我发送
encoder.dispatchThreadgroups(MTLSize(width:32, height:1, depth:1),
threadsPerThreadgroup: MTLSize(width:32, height:1, depth:1))
着色器完成后,我打印内容:
print(data[0])
现在data[0]
和data[1]
都会按预期提供2
的值,但其余值不是2
。例如data[2]
约为1.477
。我觉得我一定是犯了一个简单的错误。