diff --git a/metal/paddle-mobile/paddle-mobile/API/Net.swift b/metal/paddle-mobile/paddle-mobile/API/Net.swift index c0300e45cac703913ea9e0c38753a93f7942d669..fadc6fb60c0c9e68c275df7c784ff4b82831450b 100644 --- a/metal/paddle-mobile/paddle-mobile/API/Net.swift +++ b/metal/paddle-mobile/paddle-mobile/API/Net.swift @@ -89,7 +89,7 @@ import Foundation } } - open func updateProgram(program: Program) { + open func updateProgram(program: Program) throws { } } diff --git a/metal/paddle-mobile/paddle-mobile/API/Runner.swift b/metal/paddle-mobile/paddle-mobile/API/Runner.swift index a0c7ec68647b2e15b43b5e6ccd18d620cfed89dc..b60f6dbcecd882ee1926252b948f59ec4e99de9a 100644 --- a/metal/paddle-mobile/paddle-mobile/API/Runner.swift +++ b/metal/paddle-mobile/paddle-mobile/API/Runner.swift @@ -103,7 +103,7 @@ import Foundation executor = try Executor.init(inDevice: inDevice, inQueue: inQueue, inProgram: program!, initContext: initContext) } - net.updateProgram(program: program!) + try net.updateProgram(program: program!) } catch let error { print(error) return false @@ -181,14 +181,20 @@ import Foundation /// 更新输入维度, 针对可变长输入模型 /// /// - Parameter inDim: 输入维度 - @objc public func updateInputDim(inDim: Dim) { + @objc public func updateInputDim(inDim: Dim) -> Bool { if net.inputDim != inDim { guard let inProgram = program else { fatalError(" need load first ") } net.inputDim = inDim - net.updateProgram(program: inProgram) + do { + try net.updateProgram(program: inProgram) + } catch let error { + print(error) + return false + } } + return true } public func scaleTexture(input: MTLTexture , complete: @escaping (MTLTexture) -> Void) { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Common/Types.swift b/metal/paddle-mobile/paddle-mobile/Src/Common/Types.swift index 2267d173ef17545f412274c0cf82dc14ec268e5c..bac3f3ed916847ecd6b1645c4f77c7119631bb03 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Common/Types.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Common/Types.swift @@ -22,6 +22,8 @@ public protocol SummableMultipliable: Equatable { } public protocol PrecisionProtocol: SummableMultipliable{ + // init(inFloat: Float32) + // init(inFloat16: Float16) init(_ inP: P) static var bitSize: UInt { get } static func initializeValue() -> Self @@ -48,12 +50,27 @@ extension Float16: PrecisionProtocol { default: fatalError() } + // + // fatalError() + // if P.bitSize == Float32.bitSize { + // self = Float16(inFloat: inP as! Float32) + // } else if P.bitSize == Float16.bitSize { + // self = inP as! Float16 + // } else { + // fatalError() + // } } public static var bitSize: UInt { return 16 } + // public init(inFloat16: Float16) { + // self = inFloat16 + // } + // public init(inFloat: Float32) { + // self = Int16(inFloat) + // } } extension Float32: PrecisionProtocol { @@ -75,8 +92,23 @@ extension Float32: PrecisionProtocol { default: fatalError() } + // if P.bitSize == Float32.bitSize { + // self = inP as! Float32 + // } else if P.bitSize == Float16.bitSize { + // self = Float32.init(inP as! Float16) + // } else { + // fatalError() + // } } + // public init(inFloat: Float32) { + // self = inFloat + // } + // + // public init(inFloat16: Float16) { + // self = Float32.init(inFloat16) + // } + // public static var bitSize: UInt { return 32 } diff --git a/metal/paddle-mobile/paddle-mobile/Src/Framework/Texture.swift b/metal/paddle-mobile/paddle-mobile/Src/Framework/Texture.swift index 9c60909e60dd9619c64bec2d1db40bad3710a1d8..6b36680288a50a6c847f682f8a609595cef0ffd5 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Framework/Texture.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Framework/Texture.swift @@ -96,14 +96,16 @@ public class Texture: Tensorial { return metalTexture.realNHWC(dim: (n: padToFourDim[0], h: padToFourDim[1], w: padToFourDim[2], c: padToFourDim[3])) } - public func initTexture(device: MTLDevice, inTranspose: [Int] = [0, 1, 2, 3], computePrecision: Precision = .Float16) { + public func initTexture(device: MTLDevice, inTranspose: [Int] = [0, 1, 2, 3], computePrecision: Precision = .Float16) throws { transpose = inTranspose for i in 0..<(4 - tensorDim.cout()) { if i != inTranspose[i] { - fatalError() +// fatalError() + throw PaddleMobileError.loaderError(message: " dims error ") } } + let newDim = transpose.map { padToFourDim[$0] } let newLayout = transpose.map { layout.layoutWithDim[$0] } @@ -128,7 +130,8 @@ public class Texture: Tensorial { tmpTextureDes.height = newDim[2] tmpTextureDes.arrayLength = 1 default: - fatalError("unreachable") +// fatalError("unreachable") + throw PaddleMobileError.loaderError(message: " unreachable ") } if computePrecision == .Float16 { @@ -140,10 +143,13 @@ public class Texture: Tensorial { tmpTextureDes.usage = [.shaderRead, .shaderWrite] tmpTextureDes.storageMode = .shared textureDesc = tmpTextureDes - metalTexture = device.makeTexture(descriptor: tmpTextureDes) ?! " texture nil " + guard let inTexture = device.makeTexture(descriptor: tmpTextureDes) else { + throw PaddleMobileError.loaderError(message: " create texture is nil ") + } + metalTexture = inTexture } - public func updateDims(inTensorDim: Dim, inDim: Dim) { + public func updateDims(inTensorDim: Dim, inDim: Dim) throws { var fourDim: Dim if inDim.cout() == 4 { fourDim = inDim @@ -155,7 +161,8 @@ public class Texture: Tensorial { fourDimNum.append(contentsOf: inDim.dims) fourDim = Dim.init(inDim: fourDimNum) } else { - fatalError(" not support ") +// fatalError(" not support ") + throw PaddleMobileError.loaderError(message: " not support ") } tensorDim = inTensorDim diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Base/Operator.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Base/Operator.swift index d6ba07add3f946e7ba5705d2ac06b80f3ae468ed..ec5ab957c271c2b05d692cd50ce72c126d4318e6 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Base/Operator.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Base/Operator.swift @@ -129,10 +129,10 @@ class Operator : OperatorProtocol where paraInputs = opDesc.paraInputs do { para = try ParamType.init(opDesc:opDesc, inScope: inScope) + kernel = try KernelType.init(device: device, param: para, initContext: initContext) } catch let error { throw error } - kernel = KernelType.init(device: device, param: para, initContext: initContext) } typealias ParamType = ParameterType diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/Base/Kernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/Base/Kernel.swift index f59afaab7304d5614726ccc6ab2b9ee1f11a6fa3..1928bc9f244a9a5f05deb4bd810fee937cdc5da9 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/Base/Kernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/Base/Kernel.swift @@ -28,7 +28,7 @@ public protocol Testable { protocol Computable { associatedtype ParamType: OpParam func compute(commandBuffer: MTLCommandBuffer, param: ParamType) throws - init(device: MTLDevice, param: ParamType, initContext: InitContext) + init(device: MTLDevice, param: ParamType, initContext: InitContext) throws } protocol KernelProtocol { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BatchNormKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BatchNormKernel.swift index ee2b4ad7e52646d4b415bcd6123dd78cdebece26..975ef16287596815b518b87cbfbdba0ed8462c51 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BatchNormKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BatchNormKernel.swift @@ -15,7 +15,7 @@ import Foundation class BatchNormKernel: Kernel, Computable { - required init(device: MTLDevice, param: BatchNormParam

, initContext: InitContext) { + required init(device: MTLDevice, param: BatchNormParam

, initContext: InitContext) throws { let count = param.variance.dim.numel() let varianceP = param.variance.data.pointer let meanP = param.mean.data.pointer @@ -29,7 +29,13 @@ class BatchNormKernel: Kernel, Computable { param.bias.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) param.scale.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) - param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + + do { + try param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + if GlobalConfig.shared.computePrecision == .Float32 { super.init(device: device, inFunctionName: "batchnorm", initContext: initContext) } else if GlobalConfig.shared.computePrecision == .Float16 { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BilinearInterpKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BilinearInterpKernel.swift index 8a217eacb11cdc3732540d576f62b91835221450..d133918203270a7a4dce7e92c6019726d54c67c5 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BilinearInterpKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BilinearInterpKernel.swift @@ -41,8 +41,14 @@ class BilinearInterpKernel: Kernel, Computable{ encoder.endEncoding() } - required init(device: MTLDevice, param: BilinearInterpParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: BilinearInterpParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + if GlobalConfig.shared.computePrecision == .Float32 { super.init(device: device, inFunctionName: "bilinear_interp_float", initContext: initContext) } else if GlobalConfig.shared.computePrecision == .Float16 { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BoxcoderKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BoxcoderKernel.swift index 94ece69eebdcab2faca3d287a770a16439843d4f..646a08f1511ed2bb7b9752896e49431a24568833 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BoxcoderKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/BoxcoderKernel.swift @@ -32,8 +32,13 @@ class BoxcoderKernel: Kernel, Computable{ encoder.endEncoding() } - required init(device: MTLDevice, param: BoxcoderParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: [0, 3, 1, 2], computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: BoxcoderParam

, initContext: InitContext) throws { + do { + try param.output.initTexture(device: device, inTranspose: [0, 3, 1, 2], computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + if GlobalConfig.shared.computePrecision == .Float32 { super.init(device: device, inFunctionName: "boxcoder_float", initContext: initContext) } else if GlobalConfig.shared.computePrecision == .Float16 { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConcatKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConcatKernel.swift index 803b2f593ccd3c8afffe4d6219be5314f950f254..66d9bfd22e1568bf3d77b549b276a66a2d69f347 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConcatKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConcatKernel.swift @@ -52,8 +52,14 @@ class ConcatKernel: Kernel, Computable{ encoder.endEncoding() } - required init(device: MTLDevice, param: ConcatParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: param.transpose, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: ConcatParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, inTranspose: param.transpose, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + let orank = param.output.tensorDim.cout() let num = param.input.count assert(num <= 6) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddAddPreluKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddAddPreluKernel.swift index c89900a84e4df1c2b4873c96f2260a62e20b7d4a..6c019c089ce1105b87dc42961fde729e7134f882 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddAddPreluKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddAddPreluKernel.swift @@ -16,8 +16,14 @@ import Foundation class ConvAddAddPreluKernel: Kernel, Computable { var metalParam: MetalConvParam! - required init(device: MTLDevice, param: ConvAddAddPreluParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: ConvAddAddPreluParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + param.filter.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) param.y.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) param.alpha.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddBatchNormReluKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddBatchNormReluKernel.swift index ca6cae65c8fcac12ed29cd46775edeb2f43a3f8c..09b7d3966b4ee81d4d41df8365d7450905726fa1 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddBatchNormReluKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddBatchNormReluKernel.swift @@ -49,8 +49,14 @@ class ConvAddBatchNormReluKernel: Kernel, Computable, Test var metalParam: MetalConvParam! - required init(device: MTLDevice, param: ConvAddBatchNormReluParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: ConvAddBatchNormReluParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + param.filter.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) param.y.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) param.variance.initBuffer(device: device, precision: .Float32) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddKernel.swift index 2ceabf047983d1faf54171afe22a547000b4777b..936cb5e089141e536a4545ef84e63f1d5cf6ea54 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddKernel.swift @@ -102,9 +102,13 @@ class ConvAddKernel: Kernel, Computable { let identifyingKey: String = getUniqueKey() - required init(device: MTLDevice, param: ConvAddParam

, initContext: InitContext) { + required init(device: MTLDevice, param: ConvAddParam

, initContext: InitContext) throws { - param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + do { + try param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } let offsetY = (Int(param.dilations[1]) * (param.filter.tensorDim[2] - 1) + 1)/2 - Int(param.paddings[1]) let offsetX = (Int(param.dilations[0]) * (param.filter.tensorDim[3] - 1) + 1)/2 - Int(param.paddings[0]) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddPreluKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddPreluKernel.swift index 3535ae1868ecde2ac2794b542dbefdd72b198e2c..4186f10dbe0b8c924c74bd06024ba78b096b8c32 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddPreluKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvAddPreluKernel.swift @@ -16,8 +16,14 @@ import Foundation class ConvAddPreluKernel: Kernel, Computable { var metalParam: MetalConvParam! - required init(device: MTLDevice, param: ConvAddPreluParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: ConvAddPreluParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + param.filter.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) param.y.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) param.alpha.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvBNReluKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvBNReluKernel.swift index 9fa519a7eb80928919048e4d67c09456a87ab86f..7239a3e1a5916d3c82ada707425d62d9bf00a7f8 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvBNReluKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvBNReluKernel.swift @@ -50,9 +50,14 @@ class ConvBNReluKernel: Kernel, Computable, Testable { var metalParam: MetalConvParam! - required init(device: MTLDevice, param: ConvBNReluParam

, initContext: InitContext) { + required init(device: MTLDevice, param: ConvBNReluParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } - param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) param.filter.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) param.variance.initBuffer(device: device, precision: .Float32) param.mean.initBuffer(device: device, precision: .Float32) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvKernel.swift index fff6dd4726b16fd258df8ba1469d4889900a9970..d4d4236605b63bec3bbed878695632194ebe4fea 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvKernel.swift @@ -26,7 +26,7 @@ public struct MetalConvParam { class ConvKernel: Kernel, Computable { var metalParam: MetalConvParam! - required init(device: MTLDevice, param: ConvParam

, initContext: InitContext) { + required init(device: MTLDevice, param: ConvParam

, initContext: InitContext) throws { param.filter.initBuffer(device: device, precision: Precision.Float32) if param.filter.width == 1 && param.filter.height == 1 { super.init(device: device, inFunctionName: "conv_1x1", initContext: initContext) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvTransposeKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvTransposeKernel.swift index 33ee422c3add3ca00f9d88736427873d41b6d702..8d235a2c3c3409a11a437ed437492a09a470537c 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvTransposeKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ConvTransposeKernel.swift @@ -30,8 +30,13 @@ struct MetalConvTransposeParam { class ConvTransposeKernel: Kernel, Computable{ var metalParam: MetalConvTransposeParam! - required init(device: MTLDevice, param: ConvTransposeParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: ConvTransposeParam

, initContext: InitContext) throws { + do { + try param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + param.filter.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision, convertToNHWC: false, withTranspose: true) if GlobalConfig.shared.computePrecision == .Float32 { if param.stride == [2, 2] && param.stride == [2, 2] { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ElementwiseAddKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ElementwiseAddKernel.swift index 8d4bed8674db48f3b73d86b25a6ea787b216c02a..acddad5bb196317b5877febb2c2a50243074b184 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ElementwiseAddKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ElementwiseAddKernel.swift @@ -26,8 +26,13 @@ struct ElementwiseAddMetalParam { class ElementwiseAddKernel: Kernel, Computable { var metalParam: ElementwiseAddMetalParam - required init(device: MTLDevice, param: ElementwiseAddParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: param.inputX.transpose, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: ElementwiseAddParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, inTranspose: param.inputX.transpose, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } metalParam = ElementwiseAddMetalParam.init() diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ElementwiseAddPreluKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ElementwiseAddPreluKernel.swift index 34c45cb06171ee37b292597240ca748e57d78137..5add30cd45e6e028e9784f2bbc0cfc480893cb49 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ElementwiseAddPreluKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ElementwiseAddPreluKernel.swift @@ -17,8 +17,14 @@ import Foundation class ElementwiseAddPreluKernel: Kernel, Computable { var metalParam: ElementwiseAddMetalParam - required init(device: MTLDevice, param: ElementwiseAddPreluParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: param.inputX.transpose, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: ElementwiseAddPreluParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, inTranspose: param.inputX.transpose, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + param.alpha.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) metalParam = ElementwiseAddMetalParam.init() diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/FetchKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/FetchKernel.swift index 8164a98efab614e4241576f27071021c51d282e4..5cfd597de1656ac14cee18bc7d6528082daa1ce6 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/FetchKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/FetchKernel.swift @@ -16,7 +16,7 @@ import Foundation class FetchKernel: Kernel, Computable { - required init(device: MTLDevice, param: FetchParam

, initContext: InitContext) { + required init(device: MTLDevice, param: FetchParam

, initContext: InitContext) throws { param.output.initBuffer(device: device) if GlobalConfig.shared.computePrecision == .Float16 { if param.input.transpose == [0, 2, 3, 1] { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/FlattenKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/FlattenKernel.swift index 7e9f129a015c1859c0fb848815eb2c8f5d4eebc0..da115361bacecdce995e0c49f2e21d221e6d04be 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/FlattenKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/FlattenKernel.swift @@ -26,8 +26,14 @@ class FlattenKernel: Kernel, Computable{ var metalParam: FlattenMetalParam - required init(device: MTLDevice, param: FlattenParam

, initContext: InitContext) { - param.output.initTexture(device: device, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: FlattenParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + var id: [Int32] = [1, 1, 1, 1] for i in 0..: Kernel, Computable{ let pipline1: MTLComputePipelineState - required init(device: MTLDevice, param: MulticlassNMSParam

, initContext: InitContext) { + required init(device: MTLDevice, param: MulticlassNMSParam

, initContext: InitContext) throws { param.middleOutput.initBuffer(device: device) param.bboxOutput.initBuffer(device: device) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PoolKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PoolKernel.swift index 2e7a4c38566ff3bd9da1ea79345cf015cbd17cbe..2f340f733eb683f64103b7d2f47b7da0f011b688 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PoolKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PoolKernel.swift @@ -26,8 +26,13 @@ struct PoolMetalParam { class PoolKernel: Kernel, Computable{ var metalParam: PoolMetalParam - required init(device: MTLDevice, param: PoolParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: PoolParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } var poolType: Int32 switch param.poolType { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PreluKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PreluKernel.swift index 906dc0fcfe650a57e6e9d66d6f17c0bf44e15294..8184d998e7a1eb9f042efcfdbda7341b91e7ded7 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PreluKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PreluKernel.swift @@ -15,9 +15,15 @@ import Foundation class PreluKernel: Kernel, Computable{ - required init(device: MTLDevice, param: PreluParam

, initContext: InitContext) { + required init(device: MTLDevice, param: PreluParam

, initContext: InitContext) throws { param.alpha.initBuffer(device: device, precision: GlobalConfig.shared.computePrecision) - param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + + do { + try param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + if GlobalConfig.shared.computePrecision == .Float32 { if param.mode == "channel" { super.init(device: device, inFunctionName: "prelu_channel", initContext: initContext) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PriorBoxKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PriorBoxKernel.swift index 009062c889a303da31835ffcfa57811ebcd3cb85..cb191446bbe49204757c7e9858bb2f9f14da568c 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PriorBoxKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/PriorBoxKernel.swift @@ -32,15 +32,19 @@ struct PriorBoxMetalParam { class PriorBoxKernel: Kernel, Computable{ var metalParam: PriorBoxMetalParam! - required init(device: MTLDevice, param: PriorBoxParam

, initContext: InitContext) { + required init(device: MTLDevice, param: PriorBoxParam

, initContext: InitContext) throws { let originDim = param.output.tensorDim; param.output.tensorDim = Dim.init(inDim: [1, originDim[0], originDim[1], originDim[2] * originDim[3]]) param.output.padToFourDim = Dim.init(inDim: [1, originDim[0], originDim[1], originDim[2] * originDim[3]]) - param.output.initTexture(device: device, inTranspose: [0, 1, 2, 3], computePrecision: GlobalConfig.shared.computePrecision) - param.outputVariances.initTexture(device: device, inTranspose: [2, 0, 1, 3], computePrecision: GlobalConfig.shared.computePrecision) + do { + try param.output.initTexture(device: device, inTranspose: [0, 1, 2, 3], computePrecision: GlobalConfig.shared.computePrecision) + try param.outputVariances.initTexture(device: device, inTranspose: [2, 0, 1, 3], computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } if GlobalConfig.shared.computePrecision == .Float32 { if param.min_max_aspect_ratios_order { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ReluKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ReluKernel.swift index e4fe6fdf8c056689b7e529f6fa1ccce5a75d146d..0e2f4983cb2a0d3cc86ed00c9d3a5c9f083f0a00 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ReluKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ReluKernel.swift @@ -25,7 +25,7 @@ class ReluKernel: Kernel, Computable{ encoder.endEncoding() } - required init(device: MTLDevice, param: ReluParam

, initContext: InitContext) { + required init(device: MTLDevice, param: ReluParam

, initContext: InitContext) throws { if GlobalConfig.shared.computePrecision == .Float32 { super.init(device: device, inFunctionName: "relu", initContext: initContext) } else if GlobalConfig.shared.computePrecision == .Float16 { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ReshapeKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ReshapeKernel.swift index 0613e4952dacba2b336d017b9010cfa855f41dfb..03cc4cad3c0926eac1a72582ab3f80f81b7cbc56 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ReshapeKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ReshapeKernel.swift @@ -31,8 +31,14 @@ class ReshapeKernel: Kernel, Computable{ var metalParam: ReshapeMetalParam - required init(device: MTLDevice, param: ReshapeParam

, initContext: InitContext) { - param.output.initTexture(device: device, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: ReshapeParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + var id: [Int32] = [1, 1, 1, 1] for i in 0..: Kernel, Computable{ - required init(device: MTLDevice, param: ResizeBilinearParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: ResizeBilinearParam

, initContext: InitContext) throws { + do { + try param.output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + if GlobalConfig.shared.computePrecision == .Float32 { super.init(device: device, inFunctionName: "resize_bilinear", initContext: initContext) } else if GlobalConfig.shared.computePrecision == .Float16 { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ShapeKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ShapeKernel.swift index a4f250a175c85c99437e2ad00d511c90507ba2d6..f547a82cb13af0405e5464b2c9a726bdba58cbfe 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ShapeKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/ShapeKernel.swift @@ -28,8 +28,14 @@ class ShapeKernel: Kernel, Computable{ // encoder.endEncoding() } - required init(device: MTLDevice, param: ShapeParam

, initContext: InitContext) { - param.output.initTexture(device: device, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: ShapeParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + if GlobalConfig.shared.computePrecision == .Float32 { super.init(device: device, inFunctionName: "shape", initContext: initContext) } else if GlobalConfig.shared.computePrecision == .Float16 { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/SoftmaxKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/SoftmaxKernel.swift index bccb37c47d820fe010bb4780885875bb886ae24d..f0d635c0b4a7574df245325800db0af8e2ec9ea1 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/SoftmaxKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/SoftmaxKernel.swift @@ -22,8 +22,14 @@ struct SoftmaxMetalParam { class SoftmaxKernel: Kernel, Computable{ var metalParam: SoftmaxMetalParam - required init(device: MTLDevice, param: SoftmaxParam

, initContext: InitContext) { - param.output.initTexture(device: device, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: SoftmaxParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + metalParam = SoftmaxMetalParam.init( N: Int32(param.input.tensorDim[0]), K: Int32(param.input.tensorDim[1]) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/SplitKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/SplitKernel.swift index eaaffa7bfe8a07df4a1da2ebd5ca10b8d373f1e3..f9e6ff331e7018e1f15a70b695c9a1c8a78dad08 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/SplitKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/SplitKernel.swift @@ -37,13 +37,17 @@ class SplitKernel: Kernel, Computable{ encoder.endEncoding() } - required init(device: MTLDevice, param: SplitParam

, initContext: InitContext) { + required init(device: MTLDevice, param: SplitParam

, initContext: InitContext) throws { // param.output.initTexture(device: device, computePrecision: computePrecision) let num = param.outputList.count let rank = param.input.tensorDim.cout() assert(num >= 2 && num <= 4) for output in param.outputList { - output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + do { + try output.initTexture(device: device, inTranspose: param.input.transpose, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } } smp = SplitMetalParam.init() smp.idim = (Int32(param.input.dim[0]), Int32(param.input.dim[1]), Int32(param.input.dim[2]), Int32(param.input.dim[3])) diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/Texture2DTo2DArrayKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/Texture2DTo2DArrayKernel.swift index 65ea94905e2b23941580fc43e02a0ff04ab993a4..7c4bc56c98daedf8bdbe24808b0a6d3068906304 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/Texture2DTo2DArrayKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/Texture2DTo2DArrayKernel.swift @@ -24,8 +24,14 @@ struct Texture2DTo2DArrayParam { class Texture2DTo2DArrayKernel: Kernel, Computable{ - required init(device: MTLDevice, param: FeedParam

, initContext: InitContext) { - param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: FeedParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, inTranspose: [0, 2, 3, 1], computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + if GlobalConfig.shared.computePrecision == .Float16 { super.init(device: device, inFunctionName: "texture2d_to_2d_array_half", initContext: initContext) } else if GlobalConfig.shared.computePrecision == .Float32 { diff --git a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/TransposeKernel.swift b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/TransposeKernel.swift index a2f87758348ed0b692937e9f7222f19c3550ac97..53a02b76361f1e28293a98441302af230a23e73b 100644 --- a/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/TransposeKernel.swift +++ b/metal/paddle-mobile/paddle-mobile/Src/Operators/Kernels/TransposeKernel.swift @@ -22,8 +22,14 @@ struct TransposeMetalParam { class TransposeKernel: Kernel, Computable { var metalParam: TransposeMetalParam = TransposeMetalParam.init() - required init(device: MTLDevice, param: TransposeParam

, initContext: InitContext) { - param.output.initTexture(device: device, computePrecision: GlobalConfig.shared.computePrecision) + required init(device: MTLDevice, param: TransposeParam

, initContext: InitContext) throws { + + do { + try param.output.initTexture(device: device, computePrecision: GlobalConfig.shared.computePrecision) + } catch let error { + throw error + } + let rank = param.input.tensorDim.cout() var axis: [Int] = [0, 1, 2, 3] for i in 0..