Я не могу запустить какой-либо металлический компьютерный шейдер в моем телефоне - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь запустить свою металлическую программу на моем iPhone SE.

Я перепробовал много чисел для размеров потоков ThreadPreadGroup и threadsPerGrid, и все они дали мне эту ошибку: TLValidateFeatureSupport:3539: failed assertion `Dispatch Threads with Non-Uniform Threadgroup Size is only supported on MTLGPUFamilyApple4 and later.'

Вот мой код.

var threadsPerThreadGroup: MTLSize
var threadsPerGrid: MTLSize

computeCommandEncoder.setComputePipelineState(updateShader)

let w = updateShader.threadExecutionWidth

threadsPerThreadGroup = MTLSize(width: w, height: 1, depth: 1)
threadsPerGrid = MTLSize(width: Int(constants.bufferLength), height: 1, depth: 1)

if(frames % 2 == 0) {
    computeCommandEncoder.setBuffer(buffer1, offset: 0, index: 0)
    computeCommandEncoder.setBuffer(buffer2, offset: 0, index: 1)
} else {
    computeCommandEncoder.setBuffer(buffer2, offset: 0, index: 0)
    computeCommandEncoder.setBuffer(buffer1, offset: 0, index: 1)
}

 computeCommandEncoder.setBytes(&constants, length: MemoryLayout<MyConstants>.stride, index: 2)

computeCommandEncoder.dispatchThreads(threadsPerGrid, threadsPerThreadgroup: threadsPerThreadGroup)

frames += 1

Я использую iOS 13.4 и XCode 11.4.

threadExecutionWidth оценивается как 32, а constants.bufferLength равно 512.

1 Ответ

1 голос
/ 29 марта 2020

Используйте [dispatchThreads] только в том случае, если устройство поддерживает неоднородные размеры группы потоков.

Это не так ясно, как могло бы быть. Это означает, что dispatchThreads не работает на графических процессорах, предшествующих A11.

Если вам нужно решение, которое работает на всех устройствах, вы должны рассчитать, сколько групп потоков go в самостоятельно составьте сетку и используйте dispatchThreadgroups .

Если вы хотите, чтобы оба кода были в вашем коде, вы можете обнаружить набор функций устройства во время выполнения .

...