From a03c130af48384a2b792423e6b26c0da7d5fb89b Mon Sep 17 00:00:00 2001 From: WayneLiu Date: Mon, 29 Apr 2019 18:44:04 +0800 Subject: [PATCH] initTexture interface modeify to throw an exception (#1587) --- .../paddle-mobile/paddle-mobile/API/Net.swift | 2 +- .../paddle-mobile/API/Runner.swift | 12 +++++-- .../paddle-mobile/Src/Common/Types.swift | 32 +++++++++++++++++++ .../paddle-mobile/Src/Framework/Texture.swift | 19 +++++++---- .../Src/Operators/Base/Operator.swift | 2 +- .../Src/Operators/Kernels/Base/Kernel.swift | 2 +- .../Operators/Kernels/BatchNormKernel.swift | 10 ++++-- .../Kernels/BilinearInterpKernel.swift | 10 ++++-- .../Operators/Kernels/BoxcoderKernel.swift | 9 ++++-- .../Src/Operators/Kernels/ConcatKernel.swift | 10 ++++-- .../Kernels/ConvAddAddPreluKernel.swift | 10 ++++-- .../Kernels/ConvAddBatchNormReluKernel.swift | 10 ++++-- .../Src/Operators/Kernels/ConvAddKernel.swift | 8 +++-- .../Kernels/ConvAddPreluKernel.swift | 10 ++++-- .../Operators/Kernels/ConvBNReluKernel.swift | 9 ++++-- .../Src/Operators/Kernels/ConvKernel.swift | 2 +- .../Kernels/ConvTransposeKernel.swift | 9 ++++-- .../Kernels/ElementwiseAddKernel.swift | 9 ++++-- .../Kernels/ElementwiseAddPreluKernel.swift | 10 ++++-- .../Src/Operators/Kernels/FetchKernel.swift | 2 +- .../Src/Operators/Kernels/FlattenKernel.swift | 10 ++++-- .../Kernels/MulticlassNMSKernel.swift | 2 +- .../Src/Operators/Kernels/PoolKernel.swift | 9 ++++-- .../Src/Operators/Kernels/PreluKernel.swift | 10 ++++-- .../Operators/Kernels/PriorBoxKernel.swift | 10 ++++-- .../Src/Operators/Kernels/ReluKernel.swift | 2 +- .../Src/Operators/Kernels/ReshapeKernel.swift | 10 ++++-- .../Kernels/ResizeBilinearKernel.swift | 9 ++++-- .../Src/Operators/Kernels/ShapeKernel.swift | 10 ++++-- .../Src/Operators/Kernels/SoftmaxKernel.swift | 10 ++++-- .../Src/Operators/Kernels/SplitKernel.swift | 8 +++-- .../Kernels/Texture2DTo2DArrayKernel.swift | 10 ++++-- .../Operators/Kernels/TransposeKernel.swift | 10 ++++-- 33 files changed, 234 insertions(+), 63 deletions(-) diff --git a/metal/paddle-mobile/paddle-mobile/API/Net.swift b/metal/paddle-mobile/paddle-mobile/API/Net.swift index c0300e45ca..fadc6fb60c 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 a0c7ec6864..b60f6dbcec 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 2267d173ef..bac3f3ed91 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 9c60909e60..6b36680288 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 d6ba07add3..ec5ab957c2 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 f59afaab73..1928bc9f24 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 ee2b4ad7e5..975ef16287 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 8a217eacb1..d133918203 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 94ece69eeb..646a08f151 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 803b2f593c..66d9bfd22e 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 c89900a84e..6c019c089c 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 ca6cae65c8..09b7d3966b 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 2ceabf0479..936cb5e089 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 3535ae1868..4186f10dbe 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 9fa519a7eb..7239a3e1a5 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 fff6dd4726..d4d4236605 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 33ee422c3a..8d235a2c3c 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 8d4bed8674..acddad5bb1 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 34c45cb061..5add30cd45 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 8164a98efa..5cfd597de1 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 7e9f129a01..da115361ba 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 2e7a4c3856..2f340f733e 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 906dc0fcfe..8184d998e7 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 009062c889..cb191446bb 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 e4fe6fdf8c..0e2f4983cb 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 0613e4952d..03cc4cad3c 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 a4f250a175..f547a82cb1 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 bccb37c47d..f0d635c0b4 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 eaaffa7bfe..f9e6ff331e 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 65ea94905e..7c4bc56c98 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 a2f8775834..53a02b7636 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..