2016-03-14 17 views
6

Metal gölgelendirme dili kodumu konsol çıktısıyla (Swift'de print gibi) ayıklayabilir miyim?Metal Gölgelendirme Dili - (Konsol) Çıkışı?

Evet ise, nasıl?

Hayır ise, .metal dosyamdan değişken çıktılarının başka yolları var mı? (Belki de .metal dosyasından .Encoder arabelleğini kullanarak .swift dosyasına veri ileterek?)

KomutEncoder aracılığıyla bir Int değişkenine (.swift dosyamda bulunan) bir başvuru göndermeyi denemedim. benim .metal dosyama. .metal dosyasında int değişkenine bir değer atarım, ancak Int'i hızlı dosyamda yazdırırsam, atanan değer orada olmaz.

.swift dosyası:

... 
var myMetalOutput: Int = 0 
... 
let printBuffer = device.newBufferWithBytes(&myMetalOutput, length: sizeof(Int), options: MTLResourceOptions.CPUCacheModeDefaultCache) 
commandEncoder.setBuffer(printBuffer, offset: 0, atIndex: 8) 
... 
commandBuffer.commit() 
drawable.present() 
print("myMetalOutput: \(myMetalOutput)") 
... 

.metal dosyası:

... 
kernel void shader(..., device int &printBuffer [[8]], ...) { 
... 
printBuffer = 123; 
... 
} 

konsol çıkış burada yanlış gidiyor birkaç şey vardır myMetalOutput: 0

cevap

1

İşte durumda biri bir çalışma çözüm ihtiyacı var:

let device = MTLCreateSystemDefaultDevice()! 
let commandQueue = device.newCommandQueue() 
let defaultLibrary = device.newDefaultLibrary()! 
let commandBuffer = commandQueue.commandBuffer() 
let computeCommandEncoder = commandBuffer.computeCommandEncoder() 

let program = defaultLibrary.newFunctionWithName("shader") 

do 
{ 
    let computePipelineFilter = try device.newComputePipelineStateWithFunction(program!) 
    computeCommandEncoder.setComputePipelineState(computePipelineFilter) 
    var resultdata = [Int](count: 1, repeatedValue: 0) 
    let outVectorBuffer = device.newBufferWithBytes(&resultdata, length: sizeofValue(1), options: MTLResourceOptions.CPUCacheModeDefaultCache) 
    computeCommandEncoder.setBuffer(outVectorBuffer, offset: 0, atIndex: 0) 


    let threadsPerGroup = MTLSize(width:1,height:1,depth:1) 
    let numThreadgroups = MTLSize(width:1, height:1, depth:1) 
    computeCommandEncoder.dispatchThreadgroups(numThreadgroups, threadsPerThreadgroup: threadsPerGroup) 


    computeCommandEncoder.endEncoding() 

    commandBuffer.addCompletedHandler {commandBuffer in 
     let data = NSData(bytes: outVectorBuffer.contents(), length: sizeof(NSInteger)) 
     var out: NSInteger = 0 
     data.getBytes(&out, length: sizeof(NSInteger)) 
     print("data: \(out)") 
    } 

    commandBuffer.commit() 

} 
catch 
{ 
    fatalError("newComputePipelineStateWithFunction failed ") 
} 

shader:

kernel void shader(device int &printBuffer [[buffer(0)]], uint id [[ thread_position_in_grid ]]) { 

    printBuffer = 123; 

} 
1

zaman. İlk olarak, newBufferWithBytes(_:length:), sağladığınız verilerin bir kopyasını yapar, bu nedenle, yazılan adres özgün değişkenin adresi değildir. İkincisi, sonucu okumaya çalışmadan önce hesaplama çekirdeğinin tamamlanmasını beklemiyor gibi görünüyorsunuz. İlgili komut arabelleğine (geçerli iş parçacığını engelleyen) waitUntilCompleted() numaralı telefonu arayabilir veya çekirdek çalışmayı bitirdiğinde eşzamansız olarak çağrılacak bir kapatma sağlamak için addCompletedHandler() numaralı telefonu arayabilirsiniz. Bu noktada, arabellekten verileri okuyabilmeniz gerekir.

Komut satırına Metal gölgelendirici içinden baskı yapmak için bir olanak yok, bu nedenle, bir arabellek veya dokuya yazmak, burada en iyi seçeneğinizdir.

+1

Bu cevap tam değildir. Sadece "newBufferWithBytes" ın yanlış olduğunu söylüyorsunuz, ancak bunun yerine ne kullanacağınızı yazmayın. Cevap muhtemelen 'newBufferWithBytesNoCopy''dir, ancak bu hala sorunu çözmez, bu değeri ve' addCompletedHandler 'kullanarak yazdırma için değeri döndürmeye çalışıyorum ve hala 0 yazdırıyor. – Ixx

+0

OP'in bu yanıtı tamamladığı düşünüldü, kabul edilmesinden dolayı. Muhtemelen yeni bir soru açmanız gereken, biraz farklı kullanım durumunuz olabilir. – warrenm

+0

Tam olarak aynı kullanım durumum var, yeni bir soru açmak bir kopya olarak işaretlenecektir, bu yüzden sorunun bu cevapta olduğunu düşünüyorum. – Ixx