私はMetalkitを使い始めましたが、私はテストケースとして非常に単純なカーネルを持っていました。Metalkit:迅速なMTLBufferとポインタ3
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
はです。どこでも使える値の素早い配列を得るにはどうしたらいいですか(画面に表示する、ファイルに書き込む...)?
これらのスニペットは、この非常にシンプルなアプリでは動作しますが、私は、彼らが正しいかを確認していない:
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
は入力されていないものとします。私はいずれかのどちらかがうまくいくはずだと思うが、両方ではないと思う。それはどんなものでなければならないのですか?
私はこれを見てからしばらくしていたので、私は(まだ)答えがどうあるべきか分かりません。あなたのバージョンでは、バイト単位でデータをコピーしています。バイトを別のコンテナに入れるためにバイトをコピーすることは私にとっては赤い旗です。本当にコピーをする必要がありますか? – user965972
@ user965972私が知る限りこれが唯一の方法ですが、私は 'UnsafeBufferPointer'を見ていません。私は低レベルではあまり熟練していないが、私は少なくとも一時的な解決策を与えることができると思った。私が正しいとすれば、CPUとGPU間でメモリを共有できるので、MTLBufferからデータを読み込むためのより良い方法があるかもしれません。 – Andreas