【发布时间】:2017-07-11 12:56:02
【问题描述】:
我使用 Apple Metal 为 iPhone/iPad 进行刚体模拟。为此,我需要多次调用内核函数,而且我看到这需要很长时间,例如与 CUDA 相反。 我实现了 Metal 内核函数调用,就像 Apple 教程中描述的那样
let commandQueue = device.newCommandQueue()
var commandBuffers:[MTLCommandBuffer]=[]
var gpuPrograms:[MTLFunction]=[]
var computePipelineFilters:[MTLComputePipelineState]=[]
var computeCommandEncoders:[MTLComputeCommandEncoder]=[]
//here i fill all arrays for my command queue
//and next i execute it
let threadsPerGroup = MTLSize(width:1,height:1,depth:1)
let numThreadgroups = MTLSize(width:threadsAmount, height:1, depth:1)
for computeCommandEncoder in computeCommandEncoders
{
computeCommandEncoder.dispatchThreadgroups(numThreadgroups, threadsPerThreadgroup: threadsPerGroup)
}
for computeCommandEncoder in computeCommandEncoders
{
computeCommandEncoder.endEncoding()
}
for commandBuffer in commandBuffers
{
commandBuffer.enqueue()
}
for commandBuffer in commandBuffers
{
commandBuffer.commit()
}
for commandBuffer in commandBuffers
{
commandBuffer.waitUntilCompleted()
}
我每帧最多做几十个金属内核函数,它工作得太慢了。我用空的内核函数对其进行了测试——它告诉我,问题出在 Swift 执行部分。我的意思是,当我想在 CUDA 中执行内核函数时,我只是像通常的函数一样调用它,它运行得非常快。但是在这里我必须为每帧的每个函数的每次执行做很多动作。可能是我什么都不知道,但我想一次创建所有其他对象,然后制作类似
commandQueue.execute()
执行所有内核函数。
我是否有权执行许多内核函数,或者有其他方法可以更快地执行?
【问题讨论】: