私は 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
ん。どちらか一方が機能するはずですが、両方は機能しないと思います。どちらにする必要がありますか?またその理由は?