Apple Metal blitCommandEncoder在多线程情况下

时间:2017-07-09 20:51:03

标签: metal

我有一个循环,可以在托管内存模型中将作业发送到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,似乎挂起同步调用,永远不会完成。

对这里出了什么问题的想法?

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命令编码器完成所有这些操作,对吧?