Я пытаюсь запустить простое ядро DepthwiseConvolution с Metal Performance Shaders на MacOS и у меня проблемы с ним. Сначала я инициализирую MPSImage
(называемый debugInputImage
) с правильным размером, заполненным некоторым числом, скажем, 1.0
. Затем я создаю свое сверточное ядро:
convolution_depthwise_0 = MPSCNNConvolution(device: device,
weights: datasource_depthwise_0)
Где datasource_depthwise_0
- это экземпляр MPSCNNConvolutionDataSource
со следующим дескриптором:
func descriptor() -> MPSCNNConvolutionDescriptor {
var desc = MPSCNNDepthWiseConvolutionDescriptor(kernelWidth: 3,
kernelHeight: 3,
inputFeatureChannels: 32,
outputFeatureChannels: 32)
return desc
}
Вот как я инициализирую входное изображение:
let imageDescriptor = MPSImageDescriptor(channelFormat: .float16,
width: 256, height: 256, featureChannels: 32)
debugInputImage = MPSImage(device: device,
imageDescriptor: imageDescriptor)
var arrayOfOnes = Array(repeating: Float(1.0),
count: imageDescriptor.width * imageDescriptor.height
* imageDescriptor.featureChannels)
let arrayOfOnes16 = toFloat16(&arrayOfOnes, size: arrayOfOnes.count)
debugInputImage.writeBytes(arrayOfOnes16,
dataLayout: MPSDataLayout.HeightxWidthxFeatureChannels, imageIndex: 0)
Когда я запускаю все это:
let commandBuffer = commandQueue.makeCommandBuffer()!
let outImage = convolution_depthwise_0.encode(commandBuffer: commandBuffer,
sourceImage: debugInputImage)
И получите эту ошибку (в этой строке let outImage = convolution_depthwise_0.encode(...
):
validateComputeFunctionArguments:860: failed assertion `Compute
Function(depthwiseConvolution): missing threadgroupMemory binding
at index 0 for lM[0].'
Для регулярной свертки все хорошо, только для Depthwise я получаю эту проблему.
В чем может быть причина этой ошибки?
Система: MacOS 10.14, XCode 10.1 beta 3
Только MPSCNNDepthWiseConvolutionDescriptor не работает. У меня нет проблем с MPSCNNConvolutionDescriptor. У меня тоже нет проблем на iOS, только Mac OS.