我从 Metalkit 开始,我有一个非常简单的内核作为测试用例。
kernel void compute(device float* outData [[ buffer(0) ]])
{
outData[0] = 234.5;
outData[3] = 345.6;
}
此“计算”数据存储在MTLBuffer
.
var buffer : MTLBuffer?
...
buffer = device.makeBuffer(length: MemoryLayout<Float>.size * 5, options: [])
...
commandBuffer.waitUntilCompleted()
此时内核已将一些测试数据写入MTLBuffer
. 问题是我应该如何从我的主程序访问这些数据?
我unsafeMutableRawPointer
从buffer.contents()
. 如何获得可以在其他任何地方使用的快速值数组(显示在屏幕上,写入文件,...)?
这些片段在这个非常简单的应用程序中工作,但我不确定它们是否正确:
let raw = buffer.contents()
let b = raw.bindMemory(to: Float.self, capacity: 5)
print(b.advanced(by: 3).pointee)
let a = raw.assumingMemoryBound(to: Float.self)
print(a.advanced(by: 3).pointee)
let bufferPointer = UnsafeBufferPointer(start: b, count: 5)
let values = Array(bufferPointer)
print(values)
let value = raw.load(fromByteOffset: MemoryLayout<Float>.size * 3, as: Float.self)
print(value)
既bindMemory
和assumingMemoryBound
工作。虽然assumingMemoryBound
假设底层字节已经输入并且bindMemory
没有。我认为其中一个应该工作,但不能同时工作。应该是哪一个,为什么?