Я делаю моделирование твердого тела для iPhone/iPad с использованием Apple Metal. Для этого мне нужно сделать много вызовов функций ядра, и я вижу, что это занимает много времени, например, против CUDA. Я осуществил вызов функции ядра металла, как это описано в руководстве компании 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()
выполнять все функции ядра.
Am i права в моих действиях для выполнения многих функций ядра, или есть какой-то другой способ сделать это быстрее?