gpt4 book ai didi

ios - Metal 着色语言 - (控制台)输出?

转载 作者:可可西里 更新时间:2023-11-01 03:08:44 34 4
gpt4 key购买 nike

我可以使用控制台输出(如 Swift 中的 print)调试我的 Metal 着色语言代码吗?

如果是,怎么办?

如果没有,是否还有其他方法可以从我的 .metal 文件中输出变量? (也许通过使用 commandEncoder-buffer 将数据从 .metal 文件传递​​到我的 .swift 文件?)

我试图通过 commandEncoder 将对 Int 变量(在我的 .swift 文件中)的引用传递到我的 .metal 文件,但没有成功。在 .metal 文件中,我为 int 变量赋值,但如果我在我的 swift 文件中打印 Int,则赋值不存在。

.swift 文件:

...
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 文件:

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

控制台输出总是myMetalOutput: 0

最佳答案

这是一个可行的解决方案,以备不时之需:

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 ")
}

着色器:

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

printBuffer = 123;

}

关于ios - Metal 着色语言 - (控制台)输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35985353/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com