我有一个循环,可以在托管内存模型中将作业发送到GPU。代码是:
var commandBufferArray : [MTLCommandBuffer] = []
var blitCommandArray : [MTLBlitCommandEncoder] = []
for i_cycle in 0..<n
{
commandBufferArray.append(mc.metalCommandQueue.makeCommandBuffer())
let outputDeviate = [float4](repeating: float4(0.0),count: 1024)
outputDeviateBufferArray.append(mc.createFloat4MetalBufferManaged(outputDeviate))
populateBuffersMetalJob(.....)
blitCommandArray.append(commandBufferArray[i_cycle].makeBlitCommandEncoder())
blitCommandArray[i_cycle].synchronize(resource: outputDeviateBufferArray[i_cycle])
blitCommandArray[i_cycle].endEncoding()
commandBufferArray[i_cycle].addCompletedHandler({ _ in
// do stuff with result
})
commandBufferArray[i_cycle].commit()
}
for i_cycle in 0..<numCycles
{
commandBufferArray[i_cycle].waitUntilCompleted()
}
我在2015 MBP上使用AMD流程。如果n = 1,这很好。一旦n> 1,似乎挂起同步调用,永远不会完成。
对这里出了什么问题的想法?
答案 0 :(得分:2)
handler
代码中包含哪些内容?我怀疑你在那里做了一些陷入困境的事情。也许它试图在你所显示的代码被阻止的主线程上运行某些东西。或者它正在尝试访问您已锁定的资源。这可以防止已完成的处理程序完成,从而阻止命令缓冲区继续运行并让下一个命令缓冲区运行或完成。
如果你对这个过程进行了抽样,它可以提供有关它被卡住的位置以及它等待的内容的提示。您可以使用(1/1) RuntimeException
The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths.
命令行工具或活动监视器&gt;执行此操作。查看&gt;样品处理。
另外,为什么使用多个命令缓冲区?为什么有多个blit命令编码器?您确实意识到可以使用单个命令缓冲区和单个blit命令编码器完成所有这些操作,对吧?