2016-12-11 12 views
1

私は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) 

両方bindMemoryassumingMemoryBound作品。 assumingMemoryBoundでは、基になるバイトは既に入力されており、bindMemoryは入力されていないものとします。私はいずれかのどちらかがうまくいくはずだと思うが、両方ではないと思う。それはどんなものでなければならないのですか?

答えて

0

私は以下に示すコードを使用して配列にロードしますが、自分のバージョンが最適かどうかは判断できません。

+0

私はこれを見てからしばらくしていたので、私は(まだ)答えがどうあるべきか分かりません。あなたのバージョンでは、バイト単位でデータをコピーしています。バイトを別のコンテナに入れるためにバイトをコピーすることは私にとっては赤い旗です。本当にコピーをする必要がありますか? – user965972

+1

@ user965972私が知る限りこれが唯一の方法ですが、私は 'UnsafeBufferPointer'を見ていません。私は低レベルではあまり熟練していないが、私は少なくとも一時的な解決策を与えることができると思った。私が正しいとすれば、CPUとGPU間でメモリを共有できるので、MTLBufferからデータを読み込むためのより良い方法があるかもしれません。 – Andreas