ios MetalPerformanceShaders 使用总结
MPSCNNConvolution
1.初始化时传人 UnsafePointer<Float> 时要传入w,不能是 &(w[0]).否则w其实传入失败,卷积的结果是nan或inf.
原因可能是 &(w[0])其实只引用了w[0]这一个元素,把w[0]当成整体来看.与C不同。。。
let w:[Float] = xxxx conv = MPSCNNConvolution(device: device, convolutionDescriptor: convDesc, kernelWeights: w, //!!!!! can not assign to &(w[0]) biasTerms: b, flags: MPSCNNConvolutionFlags.none)
2. MPSCNNConvolution的kernel只支持half类型,实测MPSImage的format只能是.unorm8 或.unorm16 .float16,.float32不支持
3. 权重的排列顺序:
weights:[outputChannels][kernelHeight][kernelWidth][inputChannels],bias:[outputChannels]
MPSImage
1.内存排列顺序:
a.slices == 1时
channles >= 3 内存中排列为 [r g b a] [r g b a] [r g b a] ,a通道占位
else a通道不占位
b.slices >1时
最后一个slice不论多少个channels 都是 [r g b a] [r g b a] [r g b a],都占位