From 62529acabbafce7730601ed01d5709d7bc0d378a Mon Sep 17 00:00:00 2001 From: Chunseok Lee Date: Mon, 14 Dec 2020 14:43:43 +0900 Subject: [PATCH] Imported Upstream version 1.12.0 --- .clang-format | 8 +- .clang-format.8 | 92 ++ compiler/bcq-tools/generate_bcq_output_arrays | 126 +- compiler/bcq-tools/generate_bcq_output_arrays.py | 130 +- compiler/circle2circle/src/Circle2Circle.cpp | 40 +- compiler/circlechef/tests/CMakeLists.txt | 51 + .../circlechef/tests/shape_signature/test.recipe | 45 + .../circlechef/tests/shape_signature/test.reverse | 0 compiler/common-artifacts/exclude.lst | 54 +- compiler/exo/src/Circle/CircleExporterUtils.h | 2 +- .../src/Dialect/Service/TFLShapeInferenceRule.cpp | 4 +- compiler/exo/src/TFLite/TFLExporterUtils.h | 2 +- compiler/hermes/include/hermes/core/Message.h | 2 +- compiler/luci-interpreter/src/kernels/Conv2D.cpp | 98 +- compiler/luci-interpreter/src/kernels/Conv2D.h | 1 + .../luci-interpreter/src/kernels/Conv2D.test.cpp | 72 ++ .../src/kernels/DepthwiseConv2D.cpp | 103 +- .../luci-interpreter/src/kernels/DepthwiseConv2D.h | 1 + .../src/kernels/DepthwiseConv2D.test.cpp | 73 ++ .../luci-interpreter/src/kernels/TransposeConv.cpp | 104 +- .../luci-interpreter/src/kernels/TransposeConv.h | 1 + .../src/kernels/TransposeConv.test.cpp | 59 + .../luci-interpreter/src/loader/GraphLoader.cpp | 4 + compiler/luci/export/src/CircleExporterImpl.cpp | 7 - compiler/luci/export/src/CircleExporterUtils.cpp | 16 + compiler/luci/export/src/CircleExporterUtils.h | 2 + .../luci/export/src/CircleOperationExporter.cpp | 4 +- compiler/luci/export/src/CircleTensorExporter.cpp | 7 +- compiler/luci/export/src/Optimize.cpp | 2 + compiler/luci/export/src/SerializedData.h | 2 +- .../luci/import/include/luci/Import/CircleReader.h | 2 + compiler/luci/import/src/CircleReader.cpp | 16 + .../luci/import/src/Nodes/CircleFullyConnected.cpp | 7 +- compiler/luci/lang/include/luci/IR/AttrDilation.h | 14 +- compiler/luci/lang/include/luci/IR/AttrFilter.h | 14 +- compiler/luci/lang/include/luci/IR/AttrStride.h | 14 +- .../lang/include/luci/IR/CircleShapeSignature.h | 2 + .../include/luci/IR/Nodes/CircleFullyConnected.h | 17 + .../luci/lang/src/AttrDilation.cpp | 26 +- compiler/luci/lang/src/AttrDilation.test.cpp | 36 + .../luci/lang/src/AttrFilter.cpp | 37 +- compiler/luci/lang/src/AttrFilter.test.cpp | 36 + compiler/luci/lang/src/AttrStride.cpp | 36 + compiler/luci/lang/src/AttrStride.test.cpp | 36 + compiler/luci/lang/src/CircleShapeSignature.cpp | 34 + compiler/luci/pass/include/luci/CircleOptimizer.h | 8 + compiler/luci/pass/include/luci/ModulePass.h | 37 + .../include/luci/Pass/CircleTypeInferencePass.h | 42 + compiler/luci/pass/include/luci/Pass/FuseBCQPass.h | 5 +- .../luci/Pass/MigrateLegacyShapeDtypePass.h | 44 + .../include/luci/Pass/PropagateQuantParamPass.h | 37 + .../luci/Pass/RemoveRedundantTransposePass.h | 37 + .../luci/Pass/ReplaceMulAddWithDepthwiseConvPass.h | 37 + .../pass/include/luci/Pass/ShapeInferencePass.h | 5 +- .../luci/Pass/ShapeSignatureInferencePass.h | 42 + .../luci/Pass/ShuffleWeightTo16x1Float32Pass.h | 37 + .../luci/Pass/SubstitutePackToReshapePass.h | 37 + .../pass/include/luci/Pass/TypeInferencePass.h | 5 +- compiler/luci/pass/src/CircleOptimizer.cpp | 85 +- compiler/luci/pass/src/CircleTypeInferencePass.cpp | 59 + compiler/luci/pass/src/FuseBCQPass.cpp | 291 ++++- .../luci/pass/src/MigrateLegacyShapeDtypePass.cpp | 112 ++ compiler/luci/pass/src/ModulePhase.cpp | 71 ++ compiler/luci/pass/src/ModulePhase.h | 67 ++ compiler/luci/pass/src/ProgressReporter.cpp | 42 + compiler/luci/pass/src/ProgressReporter.h | 26 + compiler/luci/pass/src/PropagateQuantParamPass.cpp | 102 ++ .../luci/pass/src/PropagateQuantParamPass.test.cpp | 118 ++ compiler/luci/pass/src/QuantizeWithMinMaxPass.cpp | 149 ++- .../luci/pass/src/RemoveRedundantTranspose.cpp | 127 ++ .../pass/src/RemoveRedundantTranspose.test.cpp | 156 +++ .../src/ReplaceMulAddWithDepthwiseConvPass.cpp | 223 ++++ .../ReplaceMulAddWithDepthwiseConvPass.test.cpp | 142 +++ compiler/luci/pass/src/ShapeInferencePass.cpp | 13 + .../luci/pass/src/ShapeSignatureInferencePass.cpp | 63 + .../pass/src/ShuffleWeightTo16x1Float32Pass.cpp | 139 +++ .../src/ShuffleWeightTo16x1Float32Pass.test.cpp | 118 ++ .../luci/pass/src/SubstitutePackToReshapePass.cpp | 107 ++ .../pass/src/SubstitutePackToReshapePass.test.cpp | 124 ++ compiler/luci/pass/src/TypeInferencePass.cpp | 13 + .../include/luci/Service/CircleShapeInference.h | 153 +++ .../luci/Service/CircleShapeInferenceHelper.h | 36 + ...renceRule.h => CircleShapeSignatureInference.h} | 42 +- .../Service/CircleShapeSignatureInferenceHelper.h | 45 + .../include/luci/Service/CircleTypeInference.h | 153 +++ .../luci/Service/CircleTypeInferenceHelper.h | 34 + .../include/luci/Service/ShapeDescription.h | 3 + compiler/luci/service/src/CircleShapeInference.cpp | 60 + .../service/src/CircleShapeInferenceHelper.cpp | 34 + .../luci/service/src/CircleShapeInferenceRule.cpp | 4 +- ...eRule.cpp => CircleShapeSignatureInference.cpp} | 12 +- .../src/CircleShapeSignatureInferenceHelper.cpp | 160 +++ compiler/luci/service/src/CircleTypeInference.cpp | 46 + .../luci/service/src/CircleTypeInferenceHelper.cpp | 27 + compiler/luci/service/src/Nodes/CircleInput.cpp | 27 + compiler/luci/service/src/Nodes/CircleMean.cpp | 28 + compiler/luci/service/src/Nodes/CircleOutput.cpp | 27 + .../luci/service/src/Nodes/CircleOutputDummy.cpp | 24 + .../luci/service/src/Nodes/CircleOutputExclude.cpp | 27 + .../luci/service/src/Nodes/CircleReduceAny.cpp | 28 + .../luci/service/src/Nodes/CircleReduceMax.cpp | 28 + .../luci/service/src/Nodes/CircleReduceMin.cpp | 28 + .../luci/service/src/Nodes/CircleReduceProd.cpp | 28 + compiler/luci/service/src/Nodes/CircleRelu.cpp | 27 + compiler/luci/service/src/Nodes/CircleRelu6.cpp | 27 + .../luci/service/src/Nodes/CircleReluN1To1.cpp | 27 + compiler/luci/service/src/Nodes/CircleSum.cpp | 28 + compiler/luci/service/src/ShapeDescription.cpp | 13 + compiler/luci/service/src/Validate.cpp | 82 +- compiler/luci/tester/src/ReadTester.cpp | 9 + compiler/luci/tester/src/WriteTester.cpp | 9 + .../moco/support/src/TFShapeInferenceHelper.cpp | 4 +- compiler/nnc/include/Definitions.h.in | 4 +- compiler/one-cmds/how-to-use-one-commands.txt | 1 + compiler/one-cmds/one-codegen | 29 +- compiler/one-cmds/one-import-bcq | 4 +- compiler/one-cmds/one-import-tf | 2 - compiler/one-cmds/one-optimize | 4 + compiler/one-cmds/tests/one-build_001.cfg | 2 +- compiler/one-cmds/tests/one-build_002.cfg | 2 +- compiler/one-cmds/tests/one-build_neg_002.cfg | 2 +- compiler/one-cmds/tests/one-build_neg_003.cfg | 2 +- compiler/one-cmds/tests/one-build_neg_004.cfg | 2 +- compiler/one-cmds/tests/one-import_002.cfg | 2 +- compiler/one-cmds/tests/one-import_003.cfg | 13 + compiler/one-cmds/tests/one-import_003.test | 42 + compiler/one-cmds/tests/one-import_004.cfg | 13 + compiler/one-cmds/tests/one-import_004.test | 42 + compiler/one-cmds/tests/prepare_test_materials.sh | 14 + compiler/oops/include/oops/InternalExn.h | 6 +- .../pota-quantization-value-test/CMakeLists.txt | 28 +- .../channel/uint8/quantization/beta.json | 20 + .../channel/uint8/quantization/gamma.json | 20 + .../channel/uint8/quantization/ifm.json | 4 + .../channel/uint8/quantization/ofm.json | 4 + .../channel/uint8/record_minmax/ifm.json | 4 + .../channel/uint8/record_minmax/ofm.json | 4 + .../layer/uint8/quantization/beta.json | 10 + .../layer/uint8/quantization/gamma.json | 10 + .../layer/uint8/quantization/ifm.json | 4 + .../layer/uint8/quantization/ofm.json | 4 + .../layer/uint8/record_minmax/ifm.json | 4 + .../layer/uint8/record_minmax/ofm.json | 4 + .../channel/int16/quantization/alpha.json | 18 +- .../PRelu_001/channel/int16/quantization/ifm.json | 2 +- .../PRelu_001/channel/int16/quantization/ofm.json | 2 +- .../PRelu_001/channel/int16/record_minmax/ifm.json | 4 +- .../PRelu_001/channel/int16/record_minmax/ofm.json | 4 +- .../channel/uint8/quantization/alpha.json | 21 + .../PRelu_001/channel/uint8/quantization/ifm.json | 4 + .../PRelu_001/channel/uint8/quantization/ofm.json | 4 + .../PRelu_001/channel/uint8/record_minmax/ifm.json | 4 + .../PRelu_001/channel/uint8/record_minmax/ofm.json | 4 + .../gen_h5_explicit_inputs.py | 35 +- compiler/pota-quantization-value-test/test.lst | 3 + .../InstanceNorm_001/channel/uint8/0.txt | 1 + .../InstanceNorm_001/channel/uint8/1.txt | 1 + .../InstanceNorm_001/channel/uint8/2.txt | 1 + .../InstanceNorm_001/channel/uint8/3.txt | 1 + .../InstanceNorm_001/channel/uint8/4.txt | 1 + .../test_inputs/InstanceNorm_001/layer/uint8/0.txt | 1 + .../test_inputs/InstanceNorm_001/layer/uint8/1.txt | 1 + .../test_inputs/InstanceNorm_001/layer/uint8/2.txt | 1 + .../test_inputs/InstanceNorm_001/layer/uint8/3.txt | 1 + .../test_inputs/InstanceNorm_001/layer/uint8/4.txt | 1 + .../test_inputs/PRelu_001/channel/int16/0.txt | 2 +- .../test_inputs/PRelu_001/channel/int16/1.txt | 2 +- .../test_inputs/PRelu_001/channel/int16/2.txt | 2 +- .../test_inputs/PRelu_001/channel/int16/3.txt | 2 +- .../test_inputs/PRelu_001/channel/int16/4.txt | 2 +- .../test_inputs/PRelu_001/channel/uint8/0.txt | 1 + .../test_inputs/PRelu_001/channel/uint8/1.txt | 1 + .../test_inputs/PRelu_001/channel/uint8/2.txt | 1 + .../test_inputs/PRelu_001/channel/uint8/3.txt | 1 + .../test_inputs/PRelu_001/channel/uint8/4.txt | 1 + .../test_record_minmax.sh | 4 +- .../core/src/CustomOp/MaxPoolWithArgMax.cpp | 4 +- compiler/tfldump/src/Dump.cpp | 12 + compiler/tfldump/src/OpPrinter.cpp | 1 + compiler/tfldump/src/Read.cpp | 1 + compiler/tfldump/src/Read.h | 3 + compiler/vconone/CMakeLists.txt | 2 +- compute/.clang-format | 1 + .../arm_compute/core/CL/CLKernelLibraryEx.h | 10 +- .../core/CL/kernels/CLEmbeddingLookupKernel.h | 4 +- .../core/CL/kernels/CLHashtableLookupKernel.h | 4 +- .../arm_compute/core/NEON/kernels/NEOneHotKernel.h | 49 +- .../core/utils/misc/ShapeCalculatorEx.h | 14 +- .../CL/functions/CLDirectTransposeConvLayer.h | 95 +- .../runtime/CL/functions/CLFullyConnectedLayerEx.h | 2 +- .../CL/functions/CLFullyConnectedReshapingLayer.h | 4 +- .../arm_compute/runtime/CL/functions/CLGatherEx.h | 2 +- .../runtime/CL/functions/CLTransposeConvLayer.h | 92 +- .../functions/NEFullyConnectedReshapingLayer.h | 4 +- .../arm_compute/runtime/NEON/functions/NEOneHot.h | 25 +- .../runtime/NEON/functions/NETransposeConvLayer.h | 55 +- .../ARMComputeEx/src/core/CL/CLKernelLibrary.cpp | 182 +-- .../src/core/CL/cl_kernels/arg_min_max_ex.cl | 39 +- .../src/core/CL/cl_kernels/binary_logical_op.cl | 4 +- .../src/core/CL/cl_kernels/embedding_lookup.cl | 12 +- .../src/core/CL/cl_kernels/gemmlowp_ex.cl | 10 +- .../src/core/CL/cl_kernels/hashtable_lookup.cl | 12 +- .../ARMComputeEx/src/core/CL/cl_kernels/helpers.h | 22 +- .../src/core/CL/cl_kernels/helpers_asymm.h | 244 ++-- .../CL/cl_kernels/instance_normalization_ex.cl | 20 +- .../core/CL/cl_kernels/multiply_scale_factor.cl | 4 +- .../ARMComputeEx/src/core/CL/cl_kernels/one_hot.cl | 8 +- .../core/CL/cl_kernels/pixelwise_mul_quantized.cl | 2 +- .../src/core/CL/cl_kernels/quantization_symm8.cl | 10 +- .../src/core/CL/cl_kernels/reduce_operation.cl | 18 +- .../core/CL/kernels/CLArgMinMaxLayerKernelEx.cpp | 39 +- .../core/CL/kernels/CLBinaryLogicalOpKernel.cpp | 34 +- .../src/core/CL/kernels/CLCastBoolKernel.cpp | 2 +- .../core/CL/kernels/CLEmbeddingLookupKernel.cpp | 14 +- .../src/core/CL/kernels/CLGatherExKernel.cpp | 18 +- .../core/CL/kernels/CLHashtableLookupKernel.cpp | 18 +- .../CLInstanceNormalizationLayerKernelEx.cpp | 8 +- .../CL/kernels/CLMultiplyScaleFactorKernel.cpp | 18 +- .../src/core/CL/kernels/CLNegKernel.cpp | 4 +- .../src/core/CL/kernels/CLOneHotKernel.cpp | 20 +- .../CL/kernels/CLQuantizationSymmetricKernel.cpp | 18 +- .../core/CL/kernels/CLReduceOperationKernel.cpp | 2 +- .../core/CL/kernels/CLScaleFactorSymm8Kernel.cpp | 8 +- .../src/core/NEON/NEElementwiseOperationFuncs.cpp | 87 +- .../kernels/NEBinaryLogicalOperationKernel.cpp | 20 +- .../src/core/NEON/kernels/NECastBoolKernel.cpp | 339 +++--- .../core/NEON/kernels/NEEmbeddingLookupKernel.cpp | 27 +- .../src/core/NEON/kernels/NEGatherKernelEx.cpp | 134 ++- .../core/NEON/kernels/NEHashtableLookupKernel.cpp | 48 +- .../NEInstanceNormalizationLayerKernelEx.cpp | 214 ++-- .../NEON/kernels/NEMultiplyScaleFactorKernel.cpp | 48 +- .../src/core/NEON/kernels/NEOneHotKernel.cpp | 70 +- .../NEON/kernels/NEQuantizationSymmetricKernel.cpp | 92 +- .../runtime/CL/functions/CLArgMinMaxLayerEx.cpp | 58 +- .../CL/functions/CLDirectTransposeConvLayer.cpp | 58 +- .../CL/functions/CLFullyConnectedHybridLayer.cpp | 59 +- .../CL/functions/CLFullyConnectedLayerEx.cpp | 86 +- .../functions/CLFullyConnectedReshapingLayer.cpp | 5 +- .../src/runtime/CL/functions/CLReduceOperation.cpp | 8 +- .../src/runtime/CL/functions/CLSplitVEx.cpp | 6 +- .../src/runtime/CL/functions/CLTopKV2.cpp | 16 +- .../runtime/CL/functions/CLTransposeConvLayer.cpp | 14 +- .../NEON/functions/NEFullyConnectedHybridLayer.cpp | 53 +- .../NEON/functions/NEFullyConnectedLayerEx.cpp | 72 +- .../functions/NEFullyConnectedReshapingLayer.cpp | 2 +- .../functions/NEInstanceNormalizationLayerEx.cpp | 10 +- .../runtime/NEON/functions/NEReduceOperation.cpp | 6 +- .../src/runtime/NEON/functions/NEReduceSum.cpp | 8 +- .../NEON/functions/NETransposeConvLayer.cpp | 58 +- compute/cker/include/cker/CpuBackendThreadpool.h | 44 + compute/cker/include/cker/NeonTensorUtils.h | 470 ++++---- compute/cker/include/cker/PortableTensorUtils.h | 2 +- compute/cker/include/cker/Types.h | 19 +- compute/cker/include/cker/Utils.h | 12 +- compute/cker/include/cker/eigen/EigenSupport.h | 8 +- compute/cker/include/cker/eigen/Utils.h | 14 +- .../include/cker/eigen/eigen_convolution_helpers.h | 23 +- .../cker/eigen/eigen_spatial_convolutions-inl.h | 346 +++--- compute/cker/include/cker/operation/AveragePool.h | 16 +- .../cker/include/cker/operation/BatchToSpaceND.h | 4 +- .../include/cker/operation/BinaryArithmeticOps.h | 10 +- compute/cker/include/cker/operation/Common.h | 4 +- compute/cker/include/cker/operation/Comparison.h | 114 +- .../cker/include/cker/operation/Concatenation.h | 2 +- compute/cker/include/cker/operation/DepthToSpace.h | 71 ++ .../cker/include/cker/operation/DepthwiseConv.h | 250 ++-- compute/cker/include/cker/operation/ELU.h | 44 + compute/cker/include/cker/operation/Einsum.h | 22 +- compute/cker/include/cker/operation/Elementwise.h | 22 + compute/cker/include/cker/operation/Fill.h | 23 +- .../cker/include/cker/operation/FullyConnected.h | 6 +- .../cker/operation/FullyConnectedSparse16x1.h | 2 +- .../cker/include/cker/operation/FusedBatchNorm.h | 10 +- compute/cker/include/cker/operation/Helper/BCast.h | 4 +- .../cker/operation/Helper/RandomDistributions.h | 18 +- .../include/cker/operation/Helper/RandomOpCpu.h | 2 +- .../cker/include/cker/operation/Helper/Tensor.h | 30 +- compute/cker/include/cker/operation/InstanceNorm.h | 4 +- compute/cker/include/cker/operation/L2Normalize.h | 2 +- compute/cker/include/cker/operation/LSTM.h | 46 +- compute/cker/include/cker/operation/LeakyReLU.h | 47 + compute/cker/include/cker/operation/LogSoftMax.h | 6 +- compute/cker/include/cker/operation/LogicalAnd.h | 80 ++ .../cker/include/cker/operation/MatrixBandPart.h | 11 +- compute/cker/include/cker/operation/MaxPool.h | 12 +- compute/cker/include/cker/operation/OneHot.h | 2 +- compute/cker/include/cker/operation/Range.h | 4 +- compute/cker/include/cker/operation/Reduce.h | 8 +- compute/cker/include/cker/operation/ReduceMean.h | 41 +- .../cker/include/cker/operation/ResizeBilinear.h | 22 +- compute/cker/include/cker/operation/Select.h | 4 +- compute/cker/include/cker/operation/Slice.h | 12 +- compute/cker/include/cker/operation/SoftMax.h | 20 +- .../cker/include/cker/operation/SpaceToBatchND.h | 6 +- .../cker/operation/StatelessRandomUniform.h | 2 +- compute/cker/include/cker/operation/Tile.h | 2 +- compute/cker/include/cker/operation/Transpose.h | 4 +- .../cker/include/cker/operation/TransposeConv.h | 8 +- .../cker/operation/optimized/BinaryArithmeticOps.h | 125 +- .../cker/include/cker/operation/optimized/Conv.h | 24 +- .../cker/operation/optimized/DepthwiseConvFloat.h | 1250 ++++++++++++++++++++ .../cker/operation/optimized/DepthwiseConvUint8.h | 304 +++-- .../cker/operation/optimized/OptimizedUtils.h | 4 +- .../include/cker/operation/reference/BatchMatMul.h | 5 +- .../cker/operation/reference/BinaryArithmeticOps.h | 39 +- .../cker/include/cker/operation/reference/Conv.h | 6 +- compute/cker/include/cker/ruy/RuySupport.h | 2 +- compute/ruy/CMakeLists.txt | 11 + compute/ruy/include/ruy/NeonTensorUtils.h | 68 ++ compute/ruy/include/ruy/PortableTensorUtils.h | 39 + compute/ruy/include/ruy/RuySupport.h | 88 ++ compute/ruy/include/ruy/Shape.h | 354 ++++++ compute/ruy/include/ruy/TensorUtils.h | 37 + compute/ruy/include/ruy/Types.h | 275 +++++ compute/ruy/include/ruy/Utils.h | 259 ++++ compute/ruy/include/ruy/neon/neon_check.h | 51 + compute/ruy/include/ruy/operation/Conv.h | 205 ++++ compute/ruy/include/ruy/operation/FullyConnected.h | 80 ++ compute/test/cker/Range.cc | 4 +- docs/conf.py | 2 +- docs/howto/how-to-add-a-new-operation.md | 2 +- ...ow-to-introduce-a-new-operation-into-runtime.md | 48 +- docs/howto/how-to-use-specific-backend.md | 40 + docs/howto/index.rst | 15 +- docs/release/1.10/index.rst | 13 + docs/release/1.11/index.rst | 13 + docs/release/1.11/release-note-1.11.1.md | 7 - docs/release/1.12/index.rst | 13 + docs/release/1.12/release-note-1.12.0.md | 28 + docs/release/1.5/index.rst | 13 + docs/release/1.6/index.rst | 13 + docs/release/1.7/index.rst | 13 + docs/release/1.7/release-note-1.7.0.md | 46 + docs/release/1.8/index.rst | 13 + docs/release/1.9/index.rst | 14 + docs/release/index.rst | 8 + docs/runtime/index.rst | 7 +- docs/runtime/supported-operations-backend.md | 19 +- infra/cmake/packages/Fp16SourceConfig.cmake | 21 + infra/cmake/packages/FxdivSourceConfig.cmake | 21 + infra/cmake/packages/PsimdSourceConfig.cmake | 21 + infra/cmake/packages/PthreadpoolSourceConfig.cmake | 21 + infra/cmake/packages/XnnpackSourceConfig.cmake | 21 + infra/command/format | 48 +- infra/docker/bionic/Dockerfile | 16 +- infra/docker/focal/Dockerfile | 4 +- infra/docker/xenial/Dockerfile | 3 +- infra/nnfw/cmake/CfgOptionFlags.cmake | 19 +- .../cmake/options/options_aarch64-android.cmake | 7 +- .../nnfw/cmake/options/options_x86_64-darwin.cmake | 1 + .../nnfw/cmake/options/options_x86_64-linux.cmake | 1 + .../nnfw/cmake/options/options_x86_64-tizen.cmake | 2 + infra/nnfw/cmake/packages/CpuInfoConfig.cmake | 2 + infra/nnfw/cmake/packages/Fp16Config.cmake | 30 + infra/nnfw/cmake/packages/FxdivConfig.cmake | 29 + infra/nnfw/cmake/packages/PsimdConfig.cmake | 26 + infra/nnfw/cmake/packages/PthreadpoolConfig.cmake | 35 + infra/nnfw/cmake/packages/XnnpackConfig.cmake | 38 + infra/nnfw/command/build | 2 +- infra/scripts/build_android_runtime_release.sh | 3 +- .../scripts/docker_build_cross_aarch64_runtime.sh | 2 + infra/scripts/docker_build_cross_arm_runtime.sh | 2 + .../docker_build_cross_arm_runtime_release.sh | 2 + infra/scripts/docker_build_cross_coverage.sh | 2 + infra/scripts/docker_build_nncc.sh | 2 + infra/scripts/docker_build_test_x64.sh | 2 + infra/scripts/docker_build_tizen_cross.sh | 2 + infra/scripts/docker_collect_nnpkg_resources.sh | 2 + infra/scripts/docker_coverage_report.sh | 2 + infra/scripts/test_ubuntu_runtime_mixed.sh | 1 + .../examples/one_op_in_tflite/metadata/MANIFEST | 3 +- .../examples/one_op_in_tflite/metadata/config.cfg | 1 + nnpackage/spec/10_packaging_and_manifest.md | 27 +- packaging/FP16.tar.gz | Bin 0 -> 71362 bytes packaging/FXDIV.tar.gz | Bin 0 -> 8914 bytes packaging/PSIMD.tar.gz | Bin 0 -> 6853 bytes packaging/PTHREADPOOL.tar.gz | Bin 0 -> 46910 bytes packaging/XNNPACK.tar.gz | Bin 0 -> 2241657 bytes packaging/nnfw.spec | 12 +- res/CircleRecipes/InstanceNorm_001/test.recipe | 47 + res/CircleRecipes/InstanceNorm_001/test.reverse | 0 .../Mean_U8_dynamic_000/test.recipe | 31 + .../Mean_U8_dynamic_000/test.reverse | 0 .../Mean_dynamic_000/test.recipe | 29 + .../Mean_dynamic_000/test.reverse | 0 .../Mean_dynamic_001/test.recipe | 29 + .../Mean_dynamic_001/test.reverse | 0 .../ReLU6_dynamic_000/test.recipe | 19 + .../ReLU6_dynamic_000/test.reverse | 0 .../ReLUN1To1_dynamic_000/test.recipe | 19 + .../ReLUN1To1_dynamic_000/test.reverse | 0 .../ReLU_dynamic_000/test.recipe | 19 + .../ReLU_dynamic_000/test.reverse | 0 .../ReduceAny_dynamic_000/test.recipe | 31 + .../ReduceAny_dynamic_000/test.reverse | 0 .../ReduceAny_dynamic_001/test.recipe | 32 + .../ReduceAny_dynamic_001/test.reverse | 0 .../ReduceAny_dynamic_002/test.recipe | 31 + .../ReduceAny_dynamic_002/test.reverse | 0 .../ReduceAny_dynamic_003/test.recipe | 31 + .../ReduceAny_dynamic_003/test.reverse | 0 .../ReduceMax_dynamic_000/test.recipe | 29 + .../ReduceMax_dynamic_000/test.reverse | 0 .../ReduceMin_dynamic_000/test.recipe | 29 + .../ReduceMin_dynamic_000/test.reverse | 0 .../ReduceProd_dynamic_000/test.recipe | 31 + .../ReduceProd_dynamic_000/test.reverse | 0 .../ReduceProd_dynamic_001/test.recipe | 32 + .../ReduceProd_dynamic_001/test.reverse | 0 .../ReduceProd_dynamic_002/test.recipe | 31 + .../ReduceProd_dynamic_002/test.reverse | 0 .../ReduceProd_dynamic_003/test.recipe | 31 + .../ReduceProd_dynamic_003/test.reverse | 0 .../Sum_dynamic_000/test.recipe | 29 + .../Sum_dynamic_000/test.reverse | 0 .../Sum_dynamic_001/test.recipe | 29 + runtime/contrib/.clang-format | 1 + .../TFLiteSharp/TFLiteNative/include/tflite_log.h | 11 +- .../TFLiteNative/include/tflite_nativewrapper.h | 3 +- runtime/contrib/android/api/Prebuilt.mk | 8 - runtime/contrib/android/api/build.gradle | 2 +- .../api/src/main/native/onert-native-api.cpp | 16 +- .../android/api/src/main/native/onert-native-api.h | 16 +- .../contrib/android_benchmark_app/cpp/ndk_main.cpp | 2 +- runtime/contrib/android_tflite/builtin_ops_jni.cc | 2 +- .../heap_trace/src/cl_create_buffer_stub.cc | 4 +- .../memory_pool_for_symbol_searcher_internals.h | 2 +- runtime/contrib/heap_trace/src/trace.cc | 2 +- runtime/contrib/heap_trace/src/trace.h | 2 +- .../src/cl_release_mem_object_interception_test.cc | 6 +- .../tests/src/malloc_interception_test.cc | 4 +- .../tests/src/realloc_interception_test.cc | 10 +- .../heap_trace/tests/src/symbol_searcher_test.cc | 2 +- runtime/contrib/heap_trace/tests/src/trace_test.cc | 16 +- runtime/contrib/labs/jniacl/src/jniacl_main.cc | 11 +- .../contrib/labs/opencl_test/src/opencl_test.cc | 8 +- runtime/contrib/labs/tflite_examples/src/conv.cpp | 8 +- .../style_transfer_app/src/bitmap_helper.cc | 32 +- .../contrib/style_transfer_app/src/jpeg_helper.cc | 2 +- .../style_transfer_app/src/style_transfer_app.cc | 8 +- .../contrib/tflite_classify/src/ImageClassifier.cc | 6 +- .../tflite_classify/src/InferenceInterface.cc | 2 +- .../contrib/tflite_classify/src/tflite_classify.cc | 5 +- runtime/libs/.clang-format | 1 + runtime/libs/benchmark/src/CsvWriter.cpp | 2 +- runtime/libs/benchmark/src/MemoryPoller.cpp | 2 +- runtime/libs/benchmark/src/Result.cpp | 12 +- runtime/libs/misc/include/misc/feature/Index.h | 2 +- runtime/libs/misc/include/misc/feature/Shape.h | 2 +- runtime/libs/misc/include/misc/kernel/Shape.h | 2 +- runtime/libs/misc/include/misc/tensor/Object.h | 5 +- runtime/libs/misc/include/misc/tensor/Zipper.h | 4 +- runtime/libs/misc/src/tensor/Comparator.cpp | 24 +- runtime/libs/nnapi/include/NeuralNetworksShim.h | 8 +- runtime/libs/nnapi/include/NeuralNetworksTypes.h | 45 +- runtime/libs/rua/dyn/src/DynamicBinder.cpp | 12 +- runtime/libs/tflite/include/tflite/Diff.h | 2 +- .../libs/tflite/include/tflite/RandomTestRunner.h | 2 +- runtime/libs/tflite/include/tflite/TensorLogger.h | 5 +- runtime/libs/tflite/src/Diff.cpp | 22 +- runtime/libs/tflite/src/RandomTestRunner.cpp | 100 +- runtime/onert/api/.clang-format | 1 + runtime/onert/api/include/nnfw.h | 12 +- runtime/onert/api/include/nnfw_internal.h | 9 + runtime/onert/api/include/nnfw_version.h | 2 +- runtime/onert/api/src/CustomKernel.cc | 2 +- runtime/onert/api/src/nnfw_api.cc | 8 +- runtime/onert/api/src/nnfw_api_internal.cc | 158 ++- runtime/onert/api/src/nnfw_api_internal.h | 8 +- runtime/onert/backend/CMakeLists.txt | 2 + runtime/onert/backend/acl_cl/Backend.h | 12 +- runtime/onert/backend/acl_cl/BackendContext.cc | 302 +++++ runtime/onert/backend/acl_cl/BackendContext.h | 70 ++ .../onert/backend/acl_cl/ConstantInitializer.cc | 2 +- runtime/onert/backend/acl_cl/ConstantInitializer.h | 6 +- runtime/onert/backend/acl_cl/KernelGenerator.cc | 82 +- runtime/onert/backend/acl_cl/KernelGenerator.h | 59 +- runtime/onert/backend/acl_cl/Optimizer.h | 7 +- runtime/onert/backend/acl_cl/acl_cl.cc | 15 +- .../backend/acl_common/AclConstantInitializer.cc | 2 +- .../backend/acl_common/AclConstantInitializer.h | 4 +- .../onert/backend/acl_common/AclTensorBuilder.h | 29 +- runtime/onert/backend/acl_common/Convert.cc | 18 +- runtime/onert/backend/acl_neon/Backend.h | 12 +- runtime/onert/backend/acl_neon/BackendContext.cc | 302 +++++ runtime/onert/backend/acl_neon/BackendContext.h | 71 ++ .../onert/backend/acl_neon/ConstantInitializer.h | 6 +- runtime/onert/backend/acl_neon/KernelGenerator.cc | 79 +- runtime/onert/backend/acl_neon/KernelGenerator.h | 25 +- runtime/onert/backend/acl_neon/Optimizer.h | 7 +- runtime/onert/backend/acl_neon/acl_neon.cc | 15 +- runtime/onert/backend/cpu/Backend.h | 2 - runtime/onert/backend/cpu/BackendContext.cc | 147 +++ runtime/onert/backend/cpu/BackendContext.h | 35 +- runtime/onert/backend/cpu/ConstantInitializer.h | 38 +- runtime/onert/backend/cpu/ExternalContext.h | 3 +- runtime/onert/backend/cpu/KernelGenerator.cc | 72 +- runtime/onert/backend/cpu/KernelGenerator.h | 76 +- runtime/onert/backend/cpu/StaticTensorManager.cc | 107 -- runtime/onert/backend/cpu/StaticTensorManager.h | 33 +- runtime/onert/backend/cpu/Tensor.h | 87 +- runtime/onert/backend/cpu/TensorBuilder.h | 19 +- runtime/onert/backend/cpu/cpu.cc | 15 +- runtime/onert/backend/cpu/ops/ArgMinMaxLayer.cc | 6 + runtime/onert/backend/cpu/ops/BatchMatMulLayer.cc | 2 +- runtime/onert/backend/cpu/ops/ConcatLayer.cc | 34 +- runtime/onert/backend/cpu/ops/ConvolutionLayer.cc | 2 - runtime/onert/backend/cpu/ops/DepthToSpaceLayer.cc | 78 ++ runtime/onert/backend/cpu/ops/DepthToSpaceLayer.h | 54 + .../backend/cpu/ops/DepthwiseConvolutionLayer.cc | 14 +- .../backend/cpu/ops/DepthwiseConvolutionLayer.h | 5 +- .../backend/cpu/ops/ElementwiseActivationLayer.cc | 30 + .../backend/cpu/ops/ElementwiseActivationLayer.h | 4 +- .../backend/cpu/ops/ElementwiseBinaryLayer.cc | 30 + .../onert/backend/cpu/ops/ElementwiseUnaryLayer.cc | 32 + .../onert/backend/cpu/ops/ElementwiseUnaryLayer.h | 2 + runtime/onert/backend/cpu/ops/ExpandDimsLayer.cc | 7 +- runtime/onert/backend/cpu/ops/ExpandDimsLayer.h | 4 +- runtime/onert/backend/cpu/ops/FillLayer.cc | 22 +- runtime/onert/backend/cpu/ops/FillLayer.h | 4 +- runtime/onert/backend/cpu/ops/MeanLayer.cc | 25 +- runtime/onert/backend/ruy/Backend.h | 68 ++ runtime/onert/backend/ruy/BackendContext.cc | 147 +++ runtime/onert/backend/ruy/BackendContext.h | 78 ++ runtime/onert/backend/ruy/CMakeLists.txt | 22 + .../onert/backend/{cpu/Tensor.cc => ruy/Config.cc} | 10 +- runtime/onert/backend/ruy/Config.h | 48 + runtime/onert/backend/ruy/ConstantInitializer.h | 35 + runtime/onert/backend/ruy/ExternalContext.h | 60 + runtime/onert/backend/ruy/KernelGenerator.cc | 171 +++ runtime/onert/backend/ruy/KernelGenerator.h | 64 + runtime/onert/backend/ruy/StaticTensorManager.h | 35 + runtime/onert/backend/ruy/Tensor.h | 37 + runtime/onert/backend/ruy/TensorBuilder.cc | 90 ++ runtime/onert/backend/ruy/TensorBuilder.h | 73 ++ runtime/onert/backend/ruy/ops/ConvolutionLayer.cc | 153 +++ runtime/onert/backend/ruy/ops/ConvolutionLayer.h | 90 ++ .../onert/backend/ruy/ops/FullyConnectedLayer.cc | 103 ++ .../onert/backend/ruy/ops/FullyConnectedLayer.h | 69 ++ runtime/onert/backend/ruy/ops/OperationUtils.cc | 47 + runtime/onert/backend/ruy/ops/OperationUtils.h | 123 ++ runtime/onert/backend/ruy/ruy.cc | 24 + runtime/onert/backend/xnnpack/Backend.h | 68 ++ runtime/onert/backend/xnnpack/BackendContext.cc | 147 +++ runtime/onert/backend/xnnpack/BackendContext.h | 85 ++ runtime/onert/backend/xnnpack/CMakeLists.txt | 26 + .../IOptimizer.h => backend/xnnpack/Config.cc} | 41 +- runtime/onert/backend/xnnpack/Config.h | 51 + .../onert/backend/xnnpack/ConstantInitializer.h | 35 + .../xnnpack/ExternalContext.cc} | 18 +- runtime/onert/backend/xnnpack/ExternalContext.h | 46 + runtime/onert/backend/xnnpack/KernelGenerator.cc | 197 +++ runtime/onert/backend/xnnpack/KernelGenerator.h | 65 + .../onert/backend/xnnpack/StaticTensorManager.h | 35 + runtime/onert/backend/xnnpack/Tensor.h | 37 + runtime/onert/backend/xnnpack/TensorBuilder.cc | 90 ++ runtime/onert/backend/xnnpack/TensorBuilder.h | 73 ++ .../onert/backend/xnnpack/ops/ConvolutionLayer.cc | 149 +++ .../onert/backend/xnnpack/ops/ConvolutionLayer.h | 77 ++ .../xnnpack/ops/DepthwiseConvolutionLayer.cc | 150 +++ .../xnnpack/ops/DepthwiseConvolutionLayer.h | 77 ++ .../backend/xnnpack/ops/FullyConnectedLayer.cc | 138 +++ .../backend/xnnpack/ops/FullyConnectedLayer.h | 61 + runtime/onert/backend/xnnpack/ops/Layer.h | 81 ++ runtime/onert/backend/xnnpack/ops/OperationUtils.h | 75 ++ runtime/onert/backend/xnnpack/xnnpack.cc | 33 + .../onert/core/include/backend/BackendContext.h | 41 +- .../onert/core/include/backend/ITensorBuilder.h | 108 -- .../onert/core/include/backend/ITensorRegister.h | 97 -- .../backend/cpu_common/BackendContextHelpers.h | 193 +++ .../backend/cpu_common/ConstantInitializer.h | 58 + .../ConstantInitializerBase.h} | 24 +- .../KernelGeneratorBase.h} | 15 +- .../backend/cpu_common/StaticTensorManager.h | 13 +- .../onert/core/include/backend/cpu_common/Tensor.h | 86 ++ .../onert/core/include/compiler/BackendManager.h | 2 +- runtime/onert/core/include/compiler/Compiler.h | 7 +- runtime/onert/core/include/compiler/LoweredGraph.h | 3 +- .../core/include/compiler/StaticShapeInferer.h | 2 +- .../onert/core/include/exec/DynamicShapeInferer.h | 2 +- runtime/onert/core/include/exec/IExecutor.h | 43 +- runtime/onert/core/include/ir/DataType.h | 1 + runtime/onert/core/include/ir/Operations.Include.h | 92 +- runtime/onert/core/include/ir/Operations.lst | 92 +- runtime/onert/core/include/ir/Subgraphs.h | 2 +- .../include/ir/operation/{ArgMax.h => ArgMinMax.h} | 15 +- .../core/include/ir/operation/ElementwiseUnary.h | 8 +- runtime/onert/core/include/ir/operation/Fill.h | 2 +- runtime/onert/core/include/util/Config.lst | 3 +- runtime/onert/core/include/util/ConfigSource.h | 1 + runtime/onert/core/include/util/ShapeInference.h | 4 +- runtime/onert/core/include/util/TracingCtx.h | 94 ++ runtime/onert/core/include/util/logging.h | 7 + runtime/onert/core/src/backend/BackendContext.cc | 21 - .../onert/core/src/backend/controlflow/Backend.h | 2 - .../core/src/backend/controlflow/BackendContext.cc | 142 +++ .../core/src/backend/controlflow/BackendContext.h | 36 +- .../src/backend/controlflow/ConstantInitializer.h | 21 +- .../core/src/backend/controlflow/ExternalContext.h | 3 +- .../onert/core/src/backend/controlflow/IOTensor.cc | 52 + .../onert/core/src/backend/controlflow/IOTensor.h | 94 ++ .../src/backend/controlflow/KernelGenerator.cc | 38 +- .../core/src/backend/controlflow/KernelGenerator.h | 12 +- .../onert/core/src/backend/controlflow/Tensor.h | 1 + .../core/src/backend/controlflow/TensorBuilder.cc | 12 +- .../core/src/backend/controlflow/TensorBuilder.h | 19 +- .../core/src/backend/controlflow/TensorRegistry.h | 33 +- .../core/src/backend/controlflow/kernel/IfLayer.cc | 81 +- .../core/src/backend/controlflow/kernel/IfLayer.h | 16 +- .../src/backend/controlflow/kernel/PermuteLayer.h | 1 - .../src/backend/controlflow/kernel/WhileLayer.cc | 188 +-- .../src/backend/controlflow/kernel/WhileLayer.h | 18 +- .../backend/cpu_common/BackendContextHelpers.cc | 17 + .../src/backend/cpu_common}/ConstantInitializer.cc | 46 +- .../ConstantInitializerBase.cc} | 27 +- .../src/backend/cpu_common/StaticTensorManager.cc | 44 +- .../onert/core/src/backend/cpu_common/Tensor.cc | 17 + runtime/onert/core/src/compiler/BackendManager.cc | 96 +- runtime/onert/core/src/compiler/Compiler.cc | 62 +- runtime/onert/core/src/compiler/ExecutorFactory.cc | 370 ++---- runtime/onert/core/src/compiler/ExecutorFactory.h | 3 - runtime/onert/core/src/compiler/Linear.cc | 187 --- runtime/onert/core/src/compiler/Linear.h | 3 - runtime/onert/core/src/compiler/LoweredGraph.cc | 71 +- runtime/onert/core/src/compiler/ManualScheduler.cc | 9 +- runtime/onert/core/src/compiler/ShapeValidator.cc | 22 +- runtime/onert/core/src/compiler/ShapeValidator.h | 2 +- .../onert/core/src/compiler/StaticShapeInferer.cc | 43 +- runtime/onert/core/src/compiler/TensorBuilders.h | 78 -- .../src/compiler/pass/PermutationInsertionPass.cc | 12 +- runtime/onert/core/src/exec/DataflowExecutor.cc | 17 +- runtime/onert/core/src/exec/DataflowExecutor.h | 6 +- runtime/onert/core/src/exec/DynamicShapeInferer.cc | 41 +- runtime/onert/core/src/exec/ExecTime.h | 2 +- runtime/onert/core/src/exec/ExecutionObservee.cc | 19 +- runtime/onert/core/src/exec/ExecutionObservee.h | 9 +- runtime/onert/core/src/exec/ExecutionObservers.cc | 111 +- runtime/onert/core/src/exec/ExecutionObservers.h | 44 +- runtime/onert/core/src/exec/ExecutorBase.cc | 113 +- runtime/onert/core/src/exec/ExecutorBase.h | 54 +- runtime/onert/core/src/exec/IPermuteFunction.h | 3 +- runtime/onert/core/src/exec/JSONExecTime.cc | 2 +- runtime/onert/core/src/exec/JSONExecTime.h | 12 +- runtime/onert/core/src/exec/LinearExecutor.cc | 10 +- runtime/onert/core/src/exec/LinearExecutor.h | 7 +- runtime/onert/core/src/exec/ParallelExecutor.cc | 21 +- runtime/onert/core/src/exec/ParallelExecutor.h | 6 +- runtime/onert/core/src/interp/InterpExecutor.h | 9 + .../core/src/interp/operations/DepthwiseConv2D.cc | 2 +- runtime/onert/core/src/ir/DataType.cc | 1 + runtime/onert/core/src/ir/OperationDumper.cc | 19 +- runtime/onert/core/src/ir/OperationDumper.h | 3 +- runtime/onert/core/src/ir/OperationValidator.cc | 136 ++- runtime/onert/core/src/ir/OperationValidator.h | 5 + .../src/ir/operation/{ArgMax.cc => ArgMinMax.cc} | 11 +- .../core/src/ir/operation/ElementwiseUnary.cc | 2 +- runtime/onert/core/src/util/ConfigSource.cc | 11 + runtime/onert/core/src/util/EventCollector.cc | 12 +- runtime/onert/core/src/util/EventCollector.h | 20 + .../onert/core/src/util/EventCollectorGlobal.cc | 94 -- runtime/onert/core/src/util/EventCollectorGlobal.h | 155 --- runtime/onert/core/src/util/EventRecorder.h | 5 +- runtime/onert/core/src/util/EventWriter.cc | 151 +-- runtime/onert/core/src/util/EventWriter.h | 100 +- runtime/onert/core/src/util/ShapeInference.cc | 14 +- runtime/onert/core/src/util/TracingCtx.cc | 29 + runtime/onert/frontend/.clang-format | 1 + .../frontend/base_loader/include/base_loader.h | 185 +-- runtime/onert/frontend/circle/src/circle_loader.cc | 2 +- .../include/circle_schema_generated.h | 820 +++++++------ .../nnapi/wrapper/ANeuralNetworksCompilation.cc | 4 +- .../nnapi/wrapper/ANeuralNetworksCompilation.h | 9 + .../frontend/nnapi/wrapper/ANeuralNetworksEvent.cc | 2 +- .../nnapi/wrapper/ANeuralNetworksExecution.cc | 12 +- .../nnapi/wrapper/ANeuralNetworksExecution.h | 2 +- .../frontend/nnapi/wrapper/ANeuralNetworksModel.cc | 10 +- .../onert/frontend/nnapi/wrapper/NNAPIConvert.cc | 7 + .../frontend/nnapi/wrapper/OperationFactory.cc | 136 ++- .../frontend/nnapi/wrapper/OperationFactory.h | 2 +- .../frontend/tflite/src/tflite_schema_generated.h | 652 +++++----- runtime/onert/sample/.clang-format | 1 + runtime/onert/test/.clang-format | 1 + .../core/compiler/{Scheduler.cc => HEScheduler.cc} | 43 +- runtime/onert/test/core/exec/ExecInstance.cc | 18 +- runtime/onert/test/core/exec/ExecTime.test.cc | 8 +- runtime/onert/test/core/interp/ExecManager.cc | 23 +- runtime/onert/test/graph/MockNode.h | 2 +- runtime/onert/test/graph/operand/UseDef.cc | 6 +- runtime/onert/test/util/ShapeInference.cc | 24 +- tests/.clang-format | 1 + tests/custom_op/FillFrom/FillFrom_runner.cc | 4 +- tests/nnapi/CMakeLists.txt | 11 + .../nnapi/nnapi_gtest.skip.aarch64-android.acl_cl | 305 +++++ .../nnapi_gtest.skip.aarch64-android.acl_neon | 376 ++++++ tests/nnapi/nnapi_gtest.skip.aarch64-android.cpu | 231 ++++ tests/nnapi/nnapi_gtest.skip.aarch64-linux.cpu | 13 - tests/nnapi/nnapi_gtest.skip.armv7l-linux.cpu | 13 - tests/nnapi/nnapi_gtest.skip.noarch.interp | 6 + tests/nnapi/nnapi_gtest.skip.x86_64-linux.cpu | 13 - tests/nnapi/specs/{skip => }/V1_2/argmin_1.mod.py | 0 tests/nnapi/specs/{skip => }/V1_2/argmin_2.mod.py | 0 tests/nnapi/specs/{skip => }/V1_2/argmin_3.mod.py | 0 tests/nnapi/src/TestGenerated.cpp | 5 +- tests/nnapi/src/TestValidation.cpp | 6 + tests/nnfw_api/CMakeLists.txt | 5 + tests/nnfw_api/src/CircleGen.cc | 88 +- tests/nnfw_api/src/CircleGen.h | 21 +- tests/nnfw_api/src/GenModelTest.h | 25 +- tests/nnfw_api/src/ModelTestDynamicTensor.cc | 1 + tests/nnfw_api/src/NNPackages.cc | 19 +- tests/nnfw_api/src/RegressionTests.cc | 12 +- tests/nnfw_api/src/ValidationTestAddModelLoaded.cc | 2 +- .../src/ValidationTestAddSessionPrepared.cc | 2 +- .../nnfw_api/src/ValidationTestMultipleSessions.cc | 88 ++ tests/nnfw_api/src/ValidationTestSessionCreated.cc | 20 +- tests/nnfw_api/src/ValidationTestSingleSession.cc | 2 +- tests/nnfw_api/src/fixtures.h | 76 +- tests/nnfw_api/src/main.cc | 2 +- tests/nnfw_api/src/one_op_tests/AddN.cc | 19 +- tests/nnfw_api/src/one_op_tests/ArgMax.cc | 115 -- tests/nnfw_api/src/one_op_tests/ArgMinMax.cc | 243 ++++ tests/nnfw_api/src/one_op_tests/Cast.cc | 12 +- tests/nnfw_api/src/one_op_tests/Concat.cc | 101 +- tests/nnfw_api/src/one_op_tests/Conv2D.cc | 152 +++ tests/nnfw_api/src/one_op_tests/DepthToSpace.cc | 88 ++ tests/nnfw_api/src/one_op_tests/DepthwiseConv2D.cc | 97 +- tests/nnfw_api/src/one_op_tests/Elu.cc | 48 + tests/nnfw_api/src/one_op_tests/Equal.cc | 6 +- tests/nnfw_api/src/one_op_tests/ExpandDims.cc | 97 ++ tests/nnfw_api/src/one_op_tests/Fill.cc | 87 +- tests/nnfw_api/src/one_op_tests/FullyConnected.cc | 32 +- tests/nnfw_api/src/one_op_tests/L2Normalization.cc | 6 +- tests/nnfw_api/src/one_op_tests/LeakyRelu.cc | 6 +- tests/nnfw_api/src/one_op_tests/LogSoftmax.cc | 4 +- tests/nnfw_api/src/one_op_tests/Mean.cc | 64 + tests/nnfw_api/src/one_op_tests/OneHot.cc | 28 +- tests/nnfw_api/src/one_op_tests/Pad.cc | 2 +- tests/nnfw_api/src/one_op_tests/PadV2.cc | 10 +- tests/nnfw_api/src/one_op_tests/Rank.cc | 10 +- tests/nnfw_api/src/one_op_tests/ResizeBilinear.cc | 4 +- .../src/one_op_tests/ResizeNearestNeighbor.cc | 4 +- tests/nnfw_api/src/one_op_tests/Reverse.cc | 4 +- tests/nnfw_api/src/one_op_tests/Shape.cc | 12 +- tests/nnfw_api/src/one_op_tests/Split.cc | 10 +- tests/nnfw_api/src/one_op_tests/Sqrt.cc | 53 + tests/nnfw_api/src/one_op_tests/Square.cc | 53 + tests/nnfw_api/src/one_op_tests/Tile.cc | 28 +- tests/nnfw_api/src/one_op_tests/Transpose.cc | 39 +- tests/scripts/benchmark_nnapi.sh | 2 +- tests/scripts/test_scheduler_with_profiling.sh | 2 +- .../test_scheduler_with_profiling_android.sh | 2 +- tests/tools/nnpackage_run/src/allocation.h | 1 + tests/tools/nnpackage_run/src/h5formatter.cc | 12 +- tests/tools/nnpackage_run/src/nnfw_util.cc | 12 +- tests/tools/nnpackage_run/src/nnpackage_run.cc | 52 +- tests/tools/nnpackage_run/src/randomgen.cc | 2 +- tests/tools/tflite_loader/CMakeLists.txt | 2 +- tests/tools/tflite_loader/src/tflite_loader.cc | 380 +++--- tests/tools/tflite_run/src/bin_image.cc | 2 +- tests/tools/tflite_run/src/tensor_loader.cc | 2 +- tests/tools/tflite_run/src/tflite_run.cc | 77 +- .../tflite_vanilla_run/src/tflite_vanilla_run.cc | 79 +- tools/.clang-format | 1 + tools/cross/install_rootfs.sh | 2 +- tools/kbenchmark/kernels/acl_cl/Convolution.cpp | 11 +- tools/kbenchmark/kernels/acl_cl/TransposeConv.cpp | 11 +- tools/kbenchmark/kernels/acl_neon/Convolution.cpp | 11 +- .../kbenchmark/kernels/acl_neon/TransposeConv.cpp | 11 +- tools/kernel_report/kernel_report.py | 10 +- tools/nnapi_quickcheck/CMakeLists.txt | 82 -- tools/nnapi_quickcheck/inc/env.h | 60 - tools/nnapi_quickcheck/lib/env.cpp | 50 - tools/nnapi_quickcheck/tests/add_1.cpp | 159 --- tools/nnapi_quickcheck/tests/add_1.lst | 13 - tools/nnapi_quickcheck/tests/add_2.cpp | 177 --- tools/nnapi_quickcheck/tests/add_2.lst | 13 - tools/nnapi_quickcheck/tests/add_3.cpp | 137 --- tools/nnapi_quickcheck/tests/add_3.lst | 6 - tools/nnapi_quickcheck/tests/add_4.cpp | 159 --- tools/nnapi_quickcheck/tests/add_4.lst | 13 - tools/nnapi_quickcheck/tests/add_5.cpp | 152 --- tools/nnapi_quickcheck/tests/add_5.lst | 10 - tools/nnapi_quickcheck/tests/add_6.cpp | 144 --- tools/nnapi_quickcheck/tests/add_6.lst | 8 - tools/nnapi_quickcheck/tests/add_7.cpp | 152 --- tools/nnapi_quickcheck/tests/add_7.lst | 11 - tools/nnapi_quickcheck/tests/add_8.cpp | 190 --- tools/nnapi_quickcheck/tests/add_8.lst | 13 - tools/nnapi_quickcheck/tests/add_9.cpp | 187 --- tools/nnapi_quickcheck/tests/add_9.lst | 13 - tools/nnapi_quickcheck/tests/add_quan_1.cpp | 162 --- tools/nnapi_quickcheck/tests/add_quan_1.lst | 13 - tools/nnapi_quickcheck/tests/avg_pool_1.cpp | 150 --- tools/nnapi_quickcheck/tests/avg_pool_1.lst | 10 - tools/nnapi_quickcheck/tests/avg_pool_quan_1.cpp | 149 --- tools/nnapi_quickcheck/tests/avg_pool_quan_1.lst | 10 - tools/nnapi_quickcheck/tests/cast_1.cpp | 136 --- tools/nnapi_quickcheck/tests/cast_1.lst | 8 - tools/nnapi_quickcheck/tests/cast_2.cpp | 134 --- tools/nnapi_quickcheck/tests/cast_2.lst | 8 - tools/nnapi_quickcheck/tests/cast_q_to_f_1.cpp | 136 --- tools/nnapi_quickcheck/tests/cast_q_to_f_1.lst | 8 - tools/nnapi_quickcheck/tests/concat_1.cpp | 161 --- tools/nnapi_quickcheck/tests/concat_1.lst | 8 - tools/nnapi_quickcheck/tests/concat_quan_1.cpp | 163 --- tools/nnapi_quickcheck/tests/concat_quan_1.lst | 8 - tools/nnapi_quickcheck/tests/conv_1.cpp | 207 ---- tools/nnapi_quickcheck/tests/conv_1.lst | 14 - tools/nnapi_quickcheck/tests/conv_quan_1.cpp | 211 ---- tools/nnapi_quickcheck/tests/conv_quan_1.lst | 14 - tools/nnapi_quickcheck/tests/dconv_1.cpp | 205 ---- tools/nnapi_quickcheck/tests/dconv_1.lst | 16 - tools/nnapi_quickcheck/tests/dconv_quan_1.cpp | 209 ---- tools/nnapi_quickcheck/tests/dconv_quan_1.lst | 16 - tools/nnapi_quickcheck/tests/dequantize_1.cpp | 136 --- tools/nnapi_quickcheck/tests/dequantize_1.lst | 8 - tools/nnapi_quickcheck/tests/div_1.cpp | 159 --- tools/nnapi_quickcheck/tests/div_1.lst | 13 - tools/nnapi_quickcheck/tests/div_2.cpp | 152 --- tools/nnapi_quickcheck/tests/div_2.lst | 10 - tools/nnapi_quickcheck/tests/fully_connected_1.cpp | 187 --- tools/nnapi_quickcheck/tests/fully_connected_1.lst | 9 - .../tests/fully_connected_quan_1.cpp | 189 --- .../tests/fully_connected_quan_1.lst | 9 - tools/nnapi_quickcheck/tests/gather_1.cpp | 132 --- tools/nnapi_quickcheck/tests/gather_1.lst | 6 - tools/nnapi_quickcheck/tests/gather_2.cpp | 136 --- tools/nnapi_quickcheck/tests/gather_2.lst | 7 - tools/nnapi_quickcheck/tests/logistic_quan_1.cpp | 140 --- tools/nnapi_quickcheck/tests/logistic_quan_1.lst | 8 - tools/nnapi_quickcheck/tests/max_pool_1.cpp | 156 --- tools/nnapi_quickcheck/tests/max_pool_1.lst | 17 - tools/nnapi_quickcheck/tests/max_pool_quan_1.cpp | 158 --- tools/nnapi_quickcheck/tests/max_pool_quan_1.lst | 17 - tools/nnapi_quickcheck/tests/mul_1.cpp | 152 --- tools/nnapi_quickcheck/tests/mul_1.lst | 10 - tools/nnapi_quickcheck/tests/mul_2.cpp | 150 --- tools/nnapi_quickcheck/tests/mul_2.lst | 9 - tools/nnapi_quickcheck/tests/mul_quan_1.cpp | 152 --- tools/nnapi_quickcheck/tests/mul_quan_1.lst | 10 - tools/nnapi_quickcheck/tests/relu1_1.cpp | 121 -- tools/nnapi_quickcheck/tests/relu1_1.lst | 6 - tools/nnapi_quickcheck/tests/relu6_1.cpp | 125 -- tools/nnapi_quickcheck/tests/relu6_1.lst | 6 - tools/nnapi_quickcheck/tests/relu6_quan_1.cpp | 123 -- tools/nnapi_quickcheck/tests/relu6_quan_1.lst | 6 - tools/nnapi_quickcheck/tests/relu_1.cpp | 125 -- tools/nnapi_quickcheck/tests/relu_1.lst | 6 - tools/nnapi_quickcheck/tests/relu_2.cpp | 128 -- tools/nnapi_quickcheck/tests/relu_2.lst | 7 - tools/nnapi_quickcheck/tests/relu_3.cpp | 131 -- tools/nnapi_quickcheck/tests/relu_3.lst | 8 - tools/nnapi_quickcheck/tests/relu_quan_1.cpp | 123 -- tools/nnapi_quickcheck/tests/relu_quan_1.lst | 6 - tools/nnapi_quickcheck/tests/reshape_1.cpp | 141 --- tools/nnapi_quickcheck/tests/reshape_1.lst | 7 - tools/nnapi_quickcheck/tests/reshape_quan_1.cpp | 143 --- tools/nnapi_quickcheck/tests/reshape_quan_1.lst | 7 - tools/nnapi_quickcheck/tests/resize_bilinear_1.cpp | 141 --- tools/nnapi_quickcheck/tests/resize_bilinear_1.lst | 10 - tools/nnapi_quickcheck/tests/softmax_1.cpp | 120 -- tools/nnapi_quickcheck/tests/softmax_1.lst | 6 - tools/nnapi_quickcheck/tests/softmax_2.cpp | 139 --- tools/nnapi_quickcheck/tests/softmax_2.lst | 11 - tools/nnapi_quickcheck/tests/softmax_quan_1.cpp | 122 -- tools/nnapi_quickcheck/tests/softmax_quan_1.lst | 6 - tools/nnapi_quickcheck/tests/split_1.cpp | 153 --- tools/nnapi_quickcheck/tests/split_1.lst | 10 - tools/nnapi_quickcheck/tests/split_2.cpp | 153 --- tools/nnapi_quickcheck/tests/split_2.lst | 10 - tools/nnapi_quickcheck/tests/split_3.cpp | 147 --- tools/nnapi_quickcheck/tests/split_3.lst | 8 - tools/nnapi_quickcheck/tests/split_4.cpp | 147 --- tools/nnapi_quickcheck/tests/split_4.lst | 8 - tools/nnapi_quickcheck/tests/sub_1.cpp | 159 --- tools/nnapi_quickcheck/tests/sub_1.lst | 13 - tools/nnapi_quickcheck/tests/sub_2.cpp | 152 --- tools/nnapi_quickcheck/tests/sub_2.lst | 10 - tools/nnapi_quickcheck/tests/sub_3.cpp | 144 --- tools/nnapi_quickcheck/tests/sub_3.lst | 8 - tools/nnapi_quickcheck/tests/sub_4.cpp | 152 --- tools/nnapi_quickcheck/tests/sub_4.lst | 11 - tools/nnapi_quickcheck/tests/sub_5.cpp | 188 --- tools/nnapi_quickcheck/tests/sub_5.lst | 13 - tools/nnapi_quickcheck/tests/sub_6.cpp | 188 --- tools/nnapi_quickcheck/tests/sub_6.lst | 13 - tools/nnapi_quickcheck/tests/tanh_1.cpp | 134 --- tools/nnapi_quickcheck/tests/tanh_1.lst | 8 - tools/nnapi_quickcheck/tests/topk_v2_1.cpp | 138 --- tools/nnapi_quickcheck/tests/topk_v2_1.lst | 6 - tools/nnpackage_tool/model2nnpkg/model2nnpkg.sh | 16 +- tools/tflite_accuracy/src/tflite_accuracy.cc | 45 +- tools/tflitefile_tool/model_parser.py | 2 +- 893 files changed, 23412 insertions(+), 17336 deletions(-) create mode 100644 .clang-format.8 create mode 100644 compiler/circlechef/tests/shape_signature/test.recipe create mode 100644 compiler/circlechef/tests/shape_signature/test.reverse rename tools/nnapi_quickcheck/inc/memory.h => compiler/luci/lang/src/AttrDilation.cpp (64%) create mode 100644 compiler/luci/lang/src/AttrDilation.test.cpp rename tools/nnapi_quickcheck/lib/env.test.cpp => compiler/luci/lang/src/AttrFilter.cpp (55%) create mode 100644 compiler/luci/lang/src/AttrFilter.test.cpp create mode 100644 compiler/luci/lang/src/AttrStride.cpp create mode 100644 compiler/luci/lang/src/AttrStride.test.cpp create mode 100644 compiler/luci/lang/src/CircleShapeSignature.cpp create mode 100644 compiler/luci/pass/include/luci/ModulePass.h create mode 100644 compiler/luci/pass/include/luci/Pass/CircleTypeInferencePass.h create mode 100644 compiler/luci/pass/include/luci/Pass/MigrateLegacyShapeDtypePass.h create mode 100644 compiler/luci/pass/include/luci/Pass/PropagateQuantParamPass.h create mode 100644 compiler/luci/pass/include/luci/Pass/RemoveRedundantTransposePass.h create mode 100644 compiler/luci/pass/include/luci/Pass/ReplaceMulAddWithDepthwiseConvPass.h create mode 100644 compiler/luci/pass/include/luci/Pass/ShapeSignatureInferencePass.h create mode 100644 compiler/luci/pass/include/luci/Pass/ShuffleWeightTo16x1Float32Pass.h create mode 100644 compiler/luci/pass/include/luci/Pass/SubstitutePackToReshapePass.h create mode 100644 compiler/luci/pass/src/CircleTypeInferencePass.cpp create mode 100644 compiler/luci/pass/src/MigrateLegacyShapeDtypePass.cpp create mode 100644 compiler/luci/pass/src/ModulePhase.cpp create mode 100644 compiler/luci/pass/src/ModulePhase.h create mode 100644 compiler/luci/pass/src/PropagateQuantParamPass.cpp create mode 100644 compiler/luci/pass/src/PropagateQuantParamPass.test.cpp create mode 100644 compiler/luci/pass/src/RemoveRedundantTranspose.cpp create mode 100644 compiler/luci/pass/src/RemoveRedundantTranspose.test.cpp create mode 100644 compiler/luci/pass/src/ReplaceMulAddWithDepthwiseConvPass.cpp create mode 100644 compiler/luci/pass/src/ReplaceMulAddWithDepthwiseConvPass.test.cpp create mode 100644 compiler/luci/pass/src/ShapeSignatureInferencePass.cpp create mode 100644 compiler/luci/pass/src/ShuffleWeightTo16x1Float32Pass.cpp create mode 100644 compiler/luci/pass/src/ShuffleWeightTo16x1Float32Pass.test.cpp create mode 100644 compiler/luci/pass/src/SubstitutePackToReshapePass.cpp create mode 100644 compiler/luci/pass/src/SubstitutePackToReshapePass.test.cpp create mode 100644 compiler/luci/service/include/luci/Service/CircleShapeInferenceHelper.h rename compiler/luci/service/include/luci/Service/{CircleShapeSignatureInferenceRule.h => CircleShapeSignatureInference.h} (87%) create mode 100644 compiler/luci/service/include/luci/Service/CircleShapeSignatureInferenceHelper.h create mode 100644 compiler/luci/service/include/luci/Service/CircleTypeInferenceHelper.h create mode 100644 compiler/luci/service/src/CircleShapeInferenceHelper.cpp rename compiler/luci/service/src/{CircleShapeSignatureInferenceRule.cpp => CircleShapeSignatureInference.cpp} (83%) create mode 100644 compiler/luci/service/src/CircleShapeSignatureInferenceHelper.cpp create mode 100644 compiler/luci/service/src/CircleTypeInferenceHelper.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleInput.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleMean.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleOutput.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleOutputDummy.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleOutputExclude.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleReduceAny.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleReduceMax.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleReduceMin.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleReduceProd.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleRelu.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleRelu6.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleReluN1To1.cpp create mode 100644 compiler/luci/service/src/Nodes/CircleSum.cpp create mode 100644 compiler/one-cmds/tests/one-import_003.cfg create mode 100644 compiler/one-cmds/tests/one-import_003.test create mode 100644 compiler/one-cmds/tests/one-import_004.cfg create mode 100644 compiler/one-cmds/tests/one-import_004.test create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/beta.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/gamma.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/ifm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/ofm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/record_minmax/ifm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/record_minmax/ofm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/beta.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/gamma.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/ifm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/ofm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/record_minmax/ifm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/record_minmax/ofm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/alpha.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/ifm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/ofm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/record_minmax/ifm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/record_minmax/ofm.json create mode 100644 compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/0.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/1.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/2.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/3.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/4.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/0.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/1.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/2.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/3.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/4.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/0.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/1.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/2.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/3.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/4.txt create mode 120000 compute/.clang-format create mode 100644 compute/cker/include/cker/CpuBackendThreadpool.h create mode 100644 compute/cker/include/cker/operation/DepthToSpace.h create mode 100644 compute/cker/include/cker/operation/ELU.h create mode 100644 compute/cker/include/cker/operation/LeakyReLU.h create mode 100644 compute/cker/include/cker/operation/LogicalAnd.h create mode 100644 compute/cker/include/cker/operation/optimized/DepthwiseConvFloat.h create mode 100644 compute/ruy/CMakeLists.txt create mode 100644 compute/ruy/include/ruy/NeonTensorUtils.h create mode 100644 compute/ruy/include/ruy/PortableTensorUtils.h create mode 100644 compute/ruy/include/ruy/RuySupport.h create mode 100644 compute/ruy/include/ruy/Shape.h create mode 100644 compute/ruy/include/ruy/TensorUtils.h create mode 100644 compute/ruy/include/ruy/Types.h create mode 100644 compute/ruy/include/ruy/Utils.h create mode 100644 compute/ruy/include/ruy/neon/neon_check.h create mode 100644 compute/ruy/include/ruy/operation/Conv.h create mode 100644 compute/ruy/include/ruy/operation/FullyConnected.h create mode 100644 docs/howto/how-to-use-specific-backend.md create mode 100644 docs/release/1.10/index.rst create mode 100644 docs/release/1.11/index.rst delete mode 100644 docs/release/1.11/release-note-1.11.1.md create mode 100644 docs/release/1.12/index.rst create mode 100644 docs/release/1.12/release-note-1.12.0.md create mode 100644 docs/release/1.5/index.rst create mode 100644 docs/release/1.6/index.rst create mode 100644 docs/release/1.7/index.rst create mode 100644 docs/release/1.7/release-note-1.7.0.md create mode 100644 docs/release/1.8/index.rst create mode 100644 docs/release/1.9/index.rst create mode 100644 infra/cmake/packages/Fp16SourceConfig.cmake create mode 100644 infra/cmake/packages/FxdivSourceConfig.cmake create mode 100644 infra/cmake/packages/PsimdSourceConfig.cmake create mode 100644 infra/cmake/packages/PthreadpoolSourceConfig.cmake create mode 100644 infra/cmake/packages/XnnpackSourceConfig.cmake create mode 100644 infra/nnfw/cmake/packages/Fp16Config.cmake create mode 100644 infra/nnfw/cmake/packages/FxdivConfig.cmake create mode 100644 infra/nnfw/cmake/packages/PsimdConfig.cmake create mode 100644 infra/nnfw/cmake/packages/PthreadpoolConfig.cmake create mode 100644 infra/nnfw/cmake/packages/XnnpackConfig.cmake create mode 100644 nnpackage/examples/one_op_in_tflite/metadata/config.cfg create mode 100644 packaging/FP16.tar.gz create mode 100644 packaging/FXDIV.tar.gz create mode 100644 packaging/PSIMD.tar.gz create mode 100644 packaging/PTHREADPOOL.tar.gz create mode 100644 packaging/XNNPACK.tar.gz create mode 100644 res/CircleRecipes/InstanceNorm_001/test.recipe create mode 100644 res/CircleRecipes/InstanceNorm_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Mean_U8_dynamic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Mean_U8_dynamic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Mean_dynamic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Mean_dynamic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Mean_dynamic_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Mean_dynamic_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReLU6_dynamic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReLU6_dynamic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReLUN1To1_dynamic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReLUN1To1_dynamic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReLU_dynamic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReLU_dynamic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_dynamic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_dynamic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_dynamic_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_dynamic_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_dynamic_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_dynamic_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_dynamic_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_dynamic_003/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceMax_dynamic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceMax_dynamic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceMin_dynamic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceMin_dynamic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_dynamic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_dynamic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_dynamic_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_dynamic_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_dynamic_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_dynamic_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_dynamic_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_dynamic_003/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Sum_dynamic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Sum_dynamic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Sum_dynamic_001/test.recipe create mode 120000 runtime/contrib/.clang-format create mode 120000 runtime/libs/.clang-format create mode 120000 runtime/onert/api/.clang-format create mode 100644 runtime/onert/backend/acl_cl/BackendContext.cc create mode 100644 runtime/onert/backend/acl_cl/BackendContext.h create mode 100644 runtime/onert/backend/acl_neon/BackendContext.cc create mode 100644 runtime/onert/backend/acl_neon/BackendContext.h create mode 100644 runtime/onert/backend/cpu/BackendContext.cc delete mode 100644 runtime/onert/backend/cpu/StaticTensorManager.cc create mode 100644 runtime/onert/backend/cpu/ops/DepthToSpaceLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/DepthToSpaceLayer.h create mode 100644 runtime/onert/backend/ruy/Backend.h create mode 100644 runtime/onert/backend/ruy/BackendContext.cc create mode 100644 runtime/onert/backend/ruy/BackendContext.h create mode 100644 runtime/onert/backend/ruy/CMakeLists.txt rename runtime/onert/backend/{cpu/Tensor.cc => ruy/Config.cc} (79%) create mode 100644 runtime/onert/backend/ruy/Config.h create mode 100644 runtime/onert/backend/ruy/ConstantInitializer.h create mode 100644 runtime/onert/backend/ruy/ExternalContext.h create mode 100644 runtime/onert/backend/ruy/KernelGenerator.cc create mode 100644 runtime/onert/backend/ruy/KernelGenerator.h create mode 100644 runtime/onert/backend/ruy/StaticTensorManager.h create mode 100644 runtime/onert/backend/ruy/Tensor.h create mode 100644 runtime/onert/backend/ruy/TensorBuilder.cc create mode 100644 runtime/onert/backend/ruy/TensorBuilder.h create mode 100644 runtime/onert/backend/ruy/ops/ConvolutionLayer.cc create mode 100644 runtime/onert/backend/ruy/ops/ConvolutionLayer.h create mode 100644 runtime/onert/backend/ruy/ops/FullyConnectedLayer.cc create mode 100644 runtime/onert/backend/ruy/ops/FullyConnectedLayer.h create mode 100644 runtime/onert/backend/ruy/ops/OperationUtils.cc create mode 100644 runtime/onert/backend/ruy/ops/OperationUtils.h create mode 100644 runtime/onert/backend/ruy/ruy.cc create mode 100644 runtime/onert/backend/xnnpack/Backend.h create mode 100644 runtime/onert/backend/xnnpack/BackendContext.cc create mode 100644 runtime/onert/backend/xnnpack/BackendContext.h create mode 100644 runtime/onert/backend/xnnpack/CMakeLists.txt rename runtime/onert/{core/include/backend/IOptimizer.h => backend/xnnpack/Config.cc} (62%) create mode 100644 runtime/onert/backend/xnnpack/Config.h create mode 100644 runtime/onert/backend/xnnpack/ConstantInitializer.h rename runtime/onert/{core/include/backend/IExternalContext.h => backend/xnnpack/ExternalContext.cc} (74%) create mode 100644 runtime/onert/backend/xnnpack/ExternalContext.h create mode 100644 runtime/onert/backend/xnnpack/KernelGenerator.cc create mode 100644 runtime/onert/backend/xnnpack/KernelGenerator.h create mode 100644 runtime/onert/backend/xnnpack/StaticTensorManager.h create mode 100644 runtime/onert/backend/xnnpack/Tensor.h create mode 100644 runtime/onert/backend/xnnpack/TensorBuilder.cc create mode 100644 runtime/onert/backend/xnnpack/TensorBuilder.h create mode 100644 runtime/onert/backend/xnnpack/ops/ConvolutionLayer.cc create mode 100644 runtime/onert/backend/xnnpack/ops/ConvolutionLayer.h create mode 100644 runtime/onert/backend/xnnpack/ops/DepthwiseConvolutionLayer.cc create mode 100644 runtime/onert/backend/xnnpack/ops/DepthwiseConvolutionLayer.h create mode 100644 runtime/onert/backend/xnnpack/ops/FullyConnectedLayer.cc create mode 100644 runtime/onert/backend/xnnpack/ops/FullyConnectedLayer.h create mode 100644 runtime/onert/backend/xnnpack/ops/Layer.h create mode 100644 runtime/onert/backend/xnnpack/ops/OperationUtils.h create mode 100644 runtime/onert/backend/xnnpack/xnnpack.cc delete mode 100644 runtime/onert/core/include/backend/ITensorBuilder.h delete mode 100644 runtime/onert/core/include/backend/ITensorRegister.h create mode 100644 runtime/onert/core/include/backend/cpu_common/BackendContextHelpers.h create mode 100644 runtime/onert/core/include/backend/cpu_common/ConstantInitializer.h rename runtime/onert/core/include/backend/{IConstantInitializer.h => cpu_common/ConstantInitializerBase.h} (90%) rename runtime/onert/core/include/backend/{IKernelGenerator.h => cpu_common/KernelGeneratorBase.h} (83%) rename runtime/onert/core/include/ir/operation/{ArgMax.h => ArgMinMax.h} (73%) create mode 100644 runtime/onert/core/include/util/TracingCtx.h create mode 100644 runtime/onert/core/src/backend/controlflow/BackendContext.cc create mode 100644 runtime/onert/core/src/backend/controlflow/IOTensor.cc create mode 100644 runtime/onert/core/src/backend/controlflow/IOTensor.h create mode 100644 runtime/onert/core/src/backend/cpu_common/BackendContextHelpers.cc rename runtime/onert/{backend/cpu => core/src/backend/cpu_common}/ConstantInitializer.cc (51%) rename runtime/onert/core/src/backend/{IConstantInitializer.cc => cpu_common/ConstantInitializerBase.cc} (86%) delete mode 100644 runtime/onert/core/src/compiler/TensorBuilders.h rename runtime/onert/core/src/ir/operation/{ArgMax.cc => ArgMinMax.cc} (78%) delete mode 100644 runtime/onert/core/src/util/EventCollectorGlobal.cc delete mode 100644 runtime/onert/core/src/util/EventCollectorGlobal.h create mode 100644 runtime/onert/core/src/util/TracingCtx.cc create mode 120000 runtime/onert/frontend/.clang-format create mode 120000 runtime/onert/sample/.clang-format create mode 120000 runtime/onert/test/.clang-format rename runtime/onert/test/core/compiler/{Scheduler.cc => HEScheduler.cc} (95%) create mode 120000 tests/.clang-format create mode 100644 tests/nnapi/nnapi_gtest.skip.aarch64-android.acl_cl create mode 100644 tests/nnapi/nnapi_gtest.skip.aarch64-android.acl_neon create mode 100644 tests/nnapi/nnapi_gtest.skip.aarch64-android.cpu rename tests/nnapi/specs/{skip => }/V1_2/argmin_1.mod.py (100%) rename tests/nnapi/specs/{skip => }/V1_2/argmin_2.mod.py (100%) rename tests/nnapi/specs/{skip => }/V1_2/argmin_3.mod.py (100%) create mode 100644 tests/nnfw_api/src/ValidationTestMultipleSessions.cc delete mode 100644 tests/nnfw_api/src/one_op_tests/ArgMax.cc create mode 100644 tests/nnfw_api/src/one_op_tests/ArgMinMax.cc create mode 100644 tests/nnfw_api/src/one_op_tests/Conv2D.cc create mode 100644 tests/nnfw_api/src/one_op_tests/DepthToSpace.cc create mode 100644 tests/nnfw_api/src/one_op_tests/Elu.cc create mode 100644 tests/nnfw_api/src/one_op_tests/ExpandDims.cc create mode 100644 tests/nnfw_api/src/one_op_tests/Mean.cc create mode 100644 tests/nnfw_api/src/one_op_tests/Sqrt.cc create mode 100644 tests/nnfw_api/src/one_op_tests/Square.cc create mode 120000 tools/.clang-format delete mode 100644 tools/nnapi_quickcheck/CMakeLists.txt delete mode 100644 tools/nnapi_quickcheck/inc/env.h delete mode 100644 tools/nnapi_quickcheck/lib/env.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/add_2.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_2.lst delete mode 100644 tools/nnapi_quickcheck/tests/add_3.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_3.lst delete mode 100644 tools/nnapi_quickcheck/tests/add_4.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_4.lst delete mode 100644 tools/nnapi_quickcheck/tests/add_5.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_5.lst delete mode 100644 tools/nnapi_quickcheck/tests/add_6.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_6.lst delete mode 100644 tools/nnapi_quickcheck/tests/add_7.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_7.lst delete mode 100644 tools/nnapi_quickcheck/tests/add_8.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_8.lst delete mode 100644 tools/nnapi_quickcheck/tests/add_9.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_9.lst delete mode 100644 tools/nnapi_quickcheck/tests/add_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/add_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/avg_pool_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/avg_pool_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/avg_pool_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/avg_pool_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/cast_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/cast_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/cast_2.cpp delete mode 100644 tools/nnapi_quickcheck/tests/cast_2.lst delete mode 100644 tools/nnapi_quickcheck/tests/cast_q_to_f_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/cast_q_to_f_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/concat_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/concat_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/concat_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/concat_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/conv_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/conv_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/conv_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/conv_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/dconv_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/dconv_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/dconv_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/dconv_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/dequantize_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/dequantize_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/div_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/div_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/div_2.cpp delete mode 100644 tools/nnapi_quickcheck/tests/div_2.lst delete mode 100644 tools/nnapi_quickcheck/tests/fully_connected_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/fully_connected_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/fully_connected_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/fully_connected_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/gather_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/gather_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/gather_2.cpp delete mode 100644 tools/nnapi_quickcheck/tests/gather_2.lst delete mode 100644 tools/nnapi_quickcheck/tests/logistic_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/logistic_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/max_pool_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/max_pool_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/max_pool_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/max_pool_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/mul_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/mul_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/mul_2.cpp delete mode 100644 tools/nnapi_quickcheck/tests/mul_2.lst delete mode 100644 tools/nnapi_quickcheck/tests/mul_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/mul_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/relu1_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/relu1_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/relu6_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/relu6_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/relu6_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/relu6_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/relu_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/relu_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/relu_2.cpp delete mode 100644 tools/nnapi_quickcheck/tests/relu_2.lst delete mode 100644 tools/nnapi_quickcheck/tests/relu_3.cpp delete mode 100644 tools/nnapi_quickcheck/tests/relu_3.lst delete mode 100644 tools/nnapi_quickcheck/tests/relu_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/relu_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/reshape_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/reshape_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/reshape_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/reshape_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/resize_bilinear_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/resize_bilinear_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/softmax_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/softmax_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/softmax_2.cpp delete mode 100644 tools/nnapi_quickcheck/tests/softmax_2.lst delete mode 100644 tools/nnapi_quickcheck/tests/softmax_quan_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/softmax_quan_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/split_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/split_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/split_2.cpp delete mode 100644 tools/nnapi_quickcheck/tests/split_2.lst delete mode 100644 tools/nnapi_quickcheck/tests/split_3.cpp delete mode 100644 tools/nnapi_quickcheck/tests/split_3.lst delete mode 100644 tools/nnapi_quickcheck/tests/split_4.cpp delete mode 100644 tools/nnapi_quickcheck/tests/split_4.lst delete mode 100644 tools/nnapi_quickcheck/tests/sub_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/sub_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/sub_2.cpp delete mode 100644 tools/nnapi_quickcheck/tests/sub_2.lst delete mode 100644 tools/nnapi_quickcheck/tests/sub_3.cpp delete mode 100644 tools/nnapi_quickcheck/tests/sub_3.lst delete mode 100644 tools/nnapi_quickcheck/tests/sub_4.cpp delete mode 100644 tools/nnapi_quickcheck/tests/sub_4.lst delete mode 100644 tools/nnapi_quickcheck/tests/sub_5.cpp delete mode 100644 tools/nnapi_quickcheck/tests/sub_5.lst delete mode 100644 tools/nnapi_quickcheck/tests/sub_6.cpp delete mode 100644 tools/nnapi_quickcheck/tests/sub_6.lst delete mode 100644 tools/nnapi_quickcheck/tests/tanh_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/tanh_1.lst delete mode 100644 tools/nnapi_quickcheck/tests/topk_v2_1.cpp delete mode 100644 tools/nnapi_quickcheck/tests/topk_v2_1.lst diff --git a/.clang-format b/.clang-format index 7dcf11c..5699ccf 100644 --- a/.clang-format +++ b/.clang-format @@ -23,16 +23,16 @@ BinPackParameters: true BraceWrapping: AfterClass: true AfterControlStatement: true - AfterEnum: false + AfterEnum: true AfterFunction: true - AfterNamespace: false + AfterNamespace: true AfterObjCDeclaration: false AfterStruct: true - AfterUnion: true + AfterUnion: false BeforeCatch: true BeforeElse: true IndentBraces: false -BreakBeforeBraces: Allman +BreakBeforeBraces: Custom BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: false BreakAfterJavaFieldAnnotations: false diff --git a/.clang-format.8 b/.clang-format.8 new file mode 100644 index 0000000..d2db976 --- /dev/null +++ b/.clang-format.8 @@ -0,0 +1,92 @@ +Language: Cpp +BasedOnStyle: Google +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignEscapedNewlinesLeft: true +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: true + AfterControlStatement: true + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: false + AfterStruct: true + AfterUnion: false + AfterExternBlock: false + BeforeCatch: true + BeforeElse: true + IndentBraces: false +BreakBeforeBraces: Custom +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 100 +CommentPragmas: '^ IWYU pragma:' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 2 +ContinuationIndentWidth: 2 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +IndentCaseLabels: true +IndentWidth: 2 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +ReflowComments: true +SortIncludes: false +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 2 +UseTab: Never diff --git a/compiler/bcq-tools/generate_bcq_output_arrays b/compiler/bcq-tools/generate_bcq_output_arrays index b71a374..8544bbd 100644 --- a/compiler/bcq-tools/generate_bcq_output_arrays +++ b/compiler/bcq-tools/generate_bcq_output_arrays @@ -112,128 +112,22 @@ def print_bcqinfo_output_arrays_v1(flags): if infoname == "bcqinfo_dequant_weight": has_dequant_weight = True - # Ideal situation is that the user nodes of BCQ applicable constant nodes - # are BCQ applicable operations such as MatMul, GatherV2, etc. - # However, operations which do not change original values such as - # Ideneity or Transpose can exist between them. In view of TensorFlow Lite, - # real user nodes of BCQ applicable constant nodes must be found first. - # This work is done by BFS search with queue. - - prefix_node_dict = {} # key : prefix / value : list of candidates - matmul_node_prefix_dict = {} # key : Name of MatMul node / value : prefix - - queue_prefix = list(prefix_set) - queue_nodename = [queue_prefix[idx] + ":0" for idx in range(len(queue_prefix))] - - while len(queue_prefix) > 0: - prefix = queue_prefix.pop(0) - nodename = queue_nodename.pop(0) - if prefix not in prefix_node_dict.keys(): - prefix_node_dict[prefix] = [] - - # Usually, output name of op is like "outputname:0" - # -2 is for removing ":0" - for op in ops: - if op.type == "MatMul" and (op.inputs[0].name == nodename - or op.inputs[1].name == nodename): - prefix_node_dict[prefix].append(op.outputs[0].name[:-2]) - matmul_node_prefix_dict[op.outputs[0].name[:-2]] = prefix - elif op.type == "Einsum" and (op.inputs[0].name == nodename - or op.inputs[1].name == nodename): - prefix_node_dict[prefix].append(op.outputs[0].name[:-2]) - elif op.type == "GatherV2" and op.inputs[0].name == nodename: - prefix_node_dict[prefix].append(op.outputs[0].name[:-2]) - elif len(op.outputs) == 1: - for i in range(len(op.inputs)): - if op.inputs[i].name == nodename: - queue_prefix.append(prefix) - queue_nodename.append(op.outputs[0].name) - break - - # When TensorFlow model is converted to TensorFlow Lite model, - # more than one operation can be fused as one. - # For example, MatMul + BiasAdd + ReLU in TensorFlow can be fused as - # one FullyConnected in TensorFlow Lite. - # It means that even real user nodes of BCQ applicable constant nodes - # in TensorFlow are found, they may be real user nodes in TensorFlow Lite. - # Therefore additional candidates of real user nodes should be found either. - # Finding additional candidates is done by BFS search with queue. - - fuseop_prefix_dict = {} # key : Candidate operation / Value : prefix - - # These ops can be candidate. However other candidates may exists after these ops. - mark_type = ["Add", "AddV2", "BiasAdd", "Reshape", "Transpose"] - - # These ops can be candidate. And no more candidates will be found after these ops. - mark_and_stop_type = ["Relu", "Relu6", "Tanh"] - - # These ops cannot be candidates but other candidates may exists after these ops. - # NOTE : Some of following ops may be removed from the list but not sure for now. - pass_type = [ - "BatchToSpaceND", "Cast", "DepthToSpace", "ExpandDims", "ResizeBilinear", - "ResizeNearestNeighbor", "ScatterNd", "SpaceToBatchND", "SpaceToDepth", "Squeeze", - "Identity", "Pack", "Unpack", "Stack" - ] - - queue_prefix = list(matmul_node_prefix_dict.values()) - queue_nodename = [matmul + ":0" for matmul in matmul_node_prefix_dict.keys()] - - visited_nodes = set(queue_nodename) - while len(queue_prefix) > 0: - prefix = queue_prefix.pop(0) - nodename = queue_nodename.pop(0) - - # Usually, output name of op is like "outputname:0" - # -2 is for removing ":0" - for op in ops: - for i in range(len(op.inputs)): - if nodename == op.inputs[i].name: - if op.type in mark_type: - if op.outputs[0].name[:-2] not in fuseop_prefix_dict.keys(): - fuseop_prefix_dict[op.outputs[0].name[:-2]] = set() - fuseop_prefix_dict[op.outputs[0].name[:-2]].add(prefix) - if op.outputs[0].name not in visited_nodes: - queue_prefix.append(prefix) - queue_nodename.append(op.outputs[0].name) - visited_nodes.add(op.outputs[0].name) - elif op.type in mark_and_stop_type: - if op.outputs[0].name[:-2] not in fuseop_prefix_dict.keys(): - fuseop_prefix_dict[op.outputs[0].name[:-2]] = set() - fuseop_prefix_dict[op.outputs[0].name[:-2]].add(prefix) - elif op.type in pass_type and op.outputs[0].name not in visited_nodes: - queue_prefix.append(prefix) - queue_nodename.append(op.outputs[0].name) - visited_nodes.add(op.outputs[0].name) - # Write the name of metadata node with open(flags.metadata_path, 'w') as f_metadata: f_metadata.write("one_compiler/bcqinfo_one_metadata,") - # Write all pairs of candidate operations and related BCQ information nodes. + # Write all pairs of a constant node and related BCQ information nodes. with open(flags.output_arrays_path, 'w') as f_arrays: for prefix in prefix_set: - for fusable_op in prefix_node_dict[prefix]: - f_arrays.write("," + prefix + "/bcqinfo_do_w_x") - f_arrays.write("," + prefix + "/bcqinfo_alpha") - f_arrays.write("," + prefix + "/bcqinfo_packed_binary_code") - f_arrays.write("," + prefix + "/bcqinfo_number_of_clusters") - f_arrays.write("," + prefix + "/bcqinfo_size_of_clusters") - f_arrays.write("," + prefix + "/bcqinfo_qbits_of_clusters") - f_arrays.write("," + fusable_op) - if has_dequant_weight: - f_arrays.write("," + prefix + "/bcqinfo_dequant_weight") - for fuseop in fuseop_prefix_dict.keys(): - if len(fuseop_prefix_dict[fuseop]) == 1: - prefix = fuseop_prefix_dict[fuseop].pop() - f_arrays.write("," + prefix + "/bcqinfo_do_w_x") - f_arrays.write("," + prefix + "/bcqinfo_alpha") - f_arrays.write("," + prefix + "/bcqinfo_packed_binary_code") - f_arrays.write("," + prefix + "/bcqinfo_number_of_clusters") - f_arrays.write("," + prefix + "/bcqinfo_size_of_clusters") - f_arrays.write("," + prefix + "/bcqinfo_qbits_of_clusters") - f_arrays.write("," + fuseop) - if has_dequant_weight: - f_arrays.write("," + prefix + "/bcqinfo_dequant_weight") + f_arrays.write("," + prefix + "/bcqinfo_do_w_x") + f_arrays.write("," + prefix + "/bcqinfo_alpha") + f_arrays.write("," + prefix + "/bcqinfo_packed_binary_code") + f_arrays.write("," + prefix + "/bcqinfo_number_of_clusters") + f_arrays.write("," + prefix + "/bcqinfo_size_of_clusters") + f_arrays.write("," + prefix + "/bcqinfo_qbits_of_clusters") + f_arrays.write("," + prefix) + if has_dequant_weight: + f_arrays.write("," + prefix + "/bcqinfo_dequant_weight") def print_bcq_output_arrays(flags): diff --git a/compiler/bcq-tools/generate_bcq_output_arrays.py b/compiler/bcq-tools/generate_bcq_output_arrays.py index 0cc1318..5d9fbe6 100644 --- a/compiler/bcq-tools/generate_bcq_output_arrays.py +++ b/compiler/bcq-tools/generate_bcq_output_arrays.py @@ -81,129 +81,23 @@ def get_bcqinfo_output_arrays_v1(input_path, output_arrays): if infoname == "bcqinfo_dequant_weight": has_dequant_weight = True - # Ideal situation is that the user nodes of BCQ applicable constant nodes - # are BCQ applicable operations such as MatMul, GatherV2, etc. - # However, operations which do not change original values such as - # Ideneity or Transpose can exist between them. In view of TensorFlow Lite, - # real user nodes of BCQ applicable constant nodes must be found first. - # This work is done by BFS search with queue. - - prefix_node_dict = {} # key : prefix / value : list of candidates - matmul_node_prefix_dict = {} # key : Name of MatMul node / value : prefix - - queue_prefix = list(prefix_set) - queue_nodename = [queue_prefix[idx] + ":0" for idx in range(len(queue_prefix))] - - while len(queue_prefix) > 0: - prefix = queue_prefix.pop(0) - nodename = queue_nodename.pop(0) - if prefix not in prefix_node_dict.keys(): - prefix_node_dict[prefix] = [] - - # Usually, output name of op is like "outputname:0" - # -2 is for removing ":0" - for op in ops: - if op.type == "MatMul" and (op.inputs[0].name == nodename - or op.inputs[1].name == nodename): - prefix_node_dict[prefix].append(op.outputs[0].name[:-2]) - matmul_node_prefix_dict[op.outputs[0].name[:-2]] = prefix - elif op.type == "Einsum" and (op.inputs[0].name == nodename - or op.inputs[1].name == nodename): - prefix_node_dict[prefix].append(op.outputs[0].name[:-2]) - elif op.type == "GatherV2" and op.inputs[0].name == nodename: - prefix_node_dict[prefix].append(op.outputs[0].name[:-2]) - elif len(op.outputs) == 1: - for i in range(len(op.inputs)): - if op.inputs[i].name == nodename: - queue_prefix.append(prefix) - queue_nodename.append(op.outputs[0].name) - break - - # When TensorFlow model is converted to TensorFlow Lite model, - # more than one operation can be fused as one. - # For example, MatMul + BiasAdd + ReLU in TensorFlow can be fused as - # one FullyConnected in TensorFlow Lite. - # It means that even real user nodes of BCQ applicable constant nodes - # in TensorFlow are found, they may be real user nodes in TensorFlow Lite. - # Therefore additional candidates of real user nodes should be found either. - # Finding additional candidates is done by BFS search with queue. - - fuseop_prefix_dict = {} # key : Candidate operation / Value : prefix - - # These ops can be candidate. However other candidates may exists after these ops. - mark_type = ["Add", "AddV2", "BiasAdd", "Reshape", "Transpose"] - - # These ops can be candidate. And no more candidates will be found after these ops. - mark_and_stop_type = ["Relu", "Relu6", "Tanh"] - - # These ops cannot be candidates but other candidates may exists after these ops. - # NOTE : Some of following ops may be removed from the list but not sure for now. - pass_type = [ - "BatchToSpaceND", "Cast", "DepthToSpace", "ExpandDims", "ResizeBilinear", - "ResizeNearestNeighbor", "ScatterNd", "SpaceToBatchND", "SpaceToDepth", "Squeeze", - "Identity", "Pack", "Unpack", "Stack" - ] - - queue_prefix = list(matmul_node_prefix_dict.values()) - queue_nodename = [matmul + ":0" for matmul in matmul_node_prefix_dict.keys()] - - visited_nodes = set(queue_nodename) - while len(queue_prefix) > 0: - prefix = queue_prefix.pop(0) - nodename = queue_nodename.pop(0) - - # Usually, output name of op is like "outputname:0" - # -2 is for removing ":0" - for op in ops: - for i in range(len(op.inputs)): - if nodename == op.inputs[i].name: - if op.type in mark_type: - if op.outputs[0].name[:-2] not in fuseop_prefix_dict.keys(): - fuseop_prefix_dict[op.outputs[0].name[:-2]] = set() - fuseop_prefix_dict[op.outputs[0].name[:-2]].add(prefix) - if op.outputs[0].name not in visited_nodes: - queue_prefix.append(prefix) - queue_nodename.append(op.outputs[0].name) - visited_nodes.add(op.outputs[0].name) - elif op.type in mark_and_stop_type: - if op.outputs[0].name[:-2] not in fuseop_prefix_dict.keys(): - fuseop_prefix_dict[op.outputs[0].name[:-2]] = set() - fuseop_prefix_dict[op.outputs[0].name[:-2]].add(prefix) - elif op.type in pass_type and op.outputs[0].name not in visited_nodes: - queue_prefix.append(prefix) - queue_nodename.append(op.outputs[0].name) - visited_nodes.add(op.outputs[0].name) - # the name of metadata node ret_output_arrays = ['one_compiler/bcqinfo_one_metadata'] # given node from user - ret_output_arrays.append(output_arrays) + ret_output_arrays += output_arrays.split(',') - # all pairs of candidate operations and related BCQ information nodes + # all pairs of a constant node and related BCQ information nodes. for prefix in prefix_set: - for fusable_op in prefix_node_dict[prefix]: - ret_output_arrays.append(prefix + '/bcqinfo_do_w_x') - ret_output_arrays.append(prefix + '/bcqinfo_alpha') - ret_output_arrays.append(prefix + '/bcqinfo_packed_binary_code') - ret_output_arrays.append(prefix + '/bcqinfo_number_of_clusters') - ret_output_arrays.append(prefix + '/bcqinfo_size_of_clusters') - ret_output_arrays.append(prefix + '/bcqinfo_qbits_of_clusters') - ret_output_arrays.append(fusable_op) - if has_dequant_weight: - ret_output_arrays.append(prefix + '/bcqinfo_dequant_weight') - for fuseop in fuseop_prefix_dict.keys(): - if len(fuseop_prefix_dict[fuseop]) == 1: - prefix = fuseop_prefix_dict[fuseop].pop() - ret_output_arrays.append(prefix + '/bcqinfo_do_w_x') - ret_output_arrays.append(prefix + '/bcqinfo_alpha') - ret_output_arrays.append(prefix + '/bcqinfo_packed_binary_code') - ret_output_arrays.append(prefix + '/bcqinfo_number_of_clusters') - ret_output_arrays.append(prefix + '/bcqinfo_size_of_clusters') - ret_output_arrays.append(prefix + '/bcqinfo_qbits_of_clusters') - ret_output_arrays.append(fuseop) - if has_dequant_weight: - ret_output_arrays.append(prefix + '/bcqinfo_dequant_weight') + ret_output_arrays.append(prefix + '/bcqinfo_do_w_x') + ret_output_arrays.append(prefix + '/bcqinfo_alpha') + ret_output_arrays.append(prefix + '/bcqinfo_packed_binary_code') + ret_output_arrays.append(prefix + '/bcqinfo_number_of_clusters') + ret_output_arrays.append(prefix + '/bcqinfo_size_of_clusters') + ret_output_arrays.append(prefix + '/bcqinfo_qbits_of_clusters') + ret_output_arrays.append(prefix) + if has_dequant_weight: + ret_output_arrays.append(prefix + '/bcqinfo_dequant_weight') return ret_output_arrays @@ -216,7 +110,7 @@ def get_bcq_output_arrays(input_path, output_arrays): if model_version == 1: return get_bcqinfo_output_arrays_v1(input_path, output_arrays) elif model_version == -1: - return None + return output_arrays.split(',') else: err_msg = "BCQ version of the model(v{}) ".format(model_version) err_msg += "is higher than " diff --git a/compiler/circle2circle/src/Circle2Circle.cpp b/compiler/circle2circle/src/Circle2Circle.cpp index 20e3ea9..cde5de8 100644 --- a/compiler/circle2circle/src/Circle2Circle.cpp +++ b/compiler/circle2circle/src/Circle2Circle.cpp @@ -110,6 +110,18 @@ int entry(int argc, char **argv) .default_value(false) .help("This will fuse BatchNorm operators of pre-activations to Convolution operator"); + arser.add_argument("--remove_redundant_transpose") + .nargs(0) + .required(false) + .default_value(false) + .help("This will fuse or remove subsequent Transpose operators"); + + arser.add_argument("--replace_cw_mul_add_with_depthwise_conv") + .nargs(0) + .required(false) + .default_value(false) + .help("This will replace channel-wise mul/add with DepthwiseConv2D operator"); + arser.add_argument("--resolve_customop_add") .nargs(0) .required(false) @@ -128,6 +140,19 @@ int entry(int argc, char **argv) .default_value(false) .help("This will convert Custom(Matmul) to Matmul operator"); + arser.add_argument("--shuffle_weight_to_16x1float32") + .nargs(0) + .required(false) + .default_value(false) + .help("This will convert weight format of FullyConnected to SHUFFLED16x1FLOAT32. Note that " + "it only converts weights whose row is a multiple of 16"); + + arser.add_argument("--substitute_pack_to_reshape") + .nargs(0) + .required(false) + .default_value(false) + .help("This will convert single input Pack to Reshape"); + arser.add_argument("--mute_warnings") .nargs(0) .required(false) @@ -196,6 +221,8 @@ int entry(int argc, char **argv) options->enable(Algorithms::ResolveCustomOpAdd); options->enable(Algorithms::ResolveCustomOpBatchMatMul); options->enable(Algorithms::ResolveCustomOpMatMul); + options->enable(Algorithms::RemoveRedundantTranspose); + options->enable(Algorithms::SubstitutePackToReshape); } if (arser.get("--fold_dequantize")) options->enable(Algorithms::FoldDequantize); @@ -213,12 +240,20 @@ int entry(int argc, char **argv) options->enable(Algorithms::MakeBatchNormGammaPositive); if (arser.get("--fuse_preactivation_batchnorm")) options->enable(Algorithms::FusePreActivationBatchNorm); + if (arser.get("--remove_redundant_transpose")) + options->enable(Algorithms::RemoveRedundantTranspose); + if (arser.get("--replace_cw_mul_add_with_depthwise_conv")) + options->enable(Algorithms::ReplaceMulAddWithDepthwiseConv); if (arser.get("--resolve_customop_add")) options->enable(Algorithms::ResolveCustomOpAdd); if (arser.get("--resolve_customop_batchmatmul")) options->enable(Algorithms::ResolveCustomOpBatchMatMul); if (arser.get("--resolve_customop_matmul")) options->enable(Algorithms::ResolveCustomOpMatMul); + if (arser.get("--shuffle_weight_to_16x1float32")) + options->enable(Algorithms::ShuffleWeightTo16x1Float32); + if (arser.get("--substitute_pack_to_reshape")) + options->enable(Algorithms::SubstitutePackToReshape); if (arser.get("--mute_warnings")) settings->set(luci::UserSettings::Key::MuteWarnings, true); @@ -281,11 +316,14 @@ int entry(int argc, char **argv) luci::Importer importer; auto module = importer.importModule(circle_model); + // call luci optimizations for module + optimizer.optimize(module.get()); + for (size_t idx = 0; idx < module->size(); ++idx) { auto graph = module->graph(idx); - // call luci optimizations + // call luci optimizations for graph optimizer.optimize(graph); optimizer.sparsify(graph); diff --git a/compiler/circlechef/tests/CMakeLists.txt b/compiler/circlechef/tests/CMakeLists.txt index 4dc58ad..773ff54 100644 --- a/compiler/circlechef/tests/CMakeLists.txt +++ b/compiler/circlechef/tests/CMakeLists.txt @@ -26,6 +26,32 @@ foreach(RECIPE IN ITEMS ${RECIPES}) list(APPEND TESTFILES ${RECIPE_OUTPUT_FILE}) endforeach(RECIPE) +# Add local files +file(GLOB RECIPES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/test.recipe") + +foreach(RECIPE IN ITEMS ${RECIPES}) + get_filename_component(RECIPE_PREFIX ${RECIPE} DIRECTORY) + + set(RECIPE_SOURCE_FILE "${RECIPE_PREFIX}.recipe") + set(RECIPE_OUTPUT_FILE "${RECIPE_PREFIX}.circle") + + # Copy .recipe + add_custom_command(OUTPUT ${RECIPE_SOURCE_FILE} + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${CMAKE_CURRENT_SOURCE_DIR}/${RECIPE}" ${RECIPE_SOURCE_FILE} + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${RECIPE}" + COMMENT "Generating ${RECIPE_SOURCE_FILE}") + + # Generate .circle + add_custom_command(OUTPUT ${RECIPE_OUTPUT_FILE} + COMMAND circlechef-file ${RECIPE_SOURCE_FILE} ${RECIPE_OUTPUT_FILE} + DEPENDS circlechef-file ${RECIPE_SOURCE_FILE} + COMMENT "Generating ${RECIPE_OUTPUT_FILE}") + + list(APPEND TESTS ${RECIPE_PREFIX}) + list(APPEND TESTFILES ${RECIPE_OUTPUT_FILE}) +endforeach(RECIPE) + #Test circlechef-reverse file(GLOB GEN_CIRCLEFILES RELATIVE ${CIRCLERECIPES_DIR} "${CIRCLERECIPES_DIR}/*/test.reverse") # Note: While in development, circlechef-reverse may not handle the operator. @@ -58,6 +84,31 @@ foreach(CIRCLEFILE IN ITEMS ${GEN_CIRCLEFILES}) list(APPEND TESTFILES ${RECIPE_GEN_OUTPUT_FILE2}) endforeach(CIRCLEFILE) +# Test local circlechef-reverse +file(GLOB GEN_CIRCLEFILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/test.reverse") + +foreach(CIRCLEFILE IN ITEMS ${GEN_CIRCLEFILES}) + get_filename_component(CIRCLE_PREFIX ${CIRCLEFILE} DIRECTORY) + + set(RECIPE_OUTPUT_FILE "${CIRCLE_PREFIX}.circle") + set(RECIPE_GEN_OUTPUT_FILE "${CIRCLE_PREFIX}.gen.recipe") + set(RECIPE_GEN_OUTPUT_FILE2 "${CIRCLE_PREFIX}.gen.circle") + + # Generate .gen.recipe from generated .circle + add_custom_command(OUTPUT ${RECIPE_GEN_OUTPUT_FILE} + COMMAND circlechef-reverse ${RECIPE_OUTPUT_FILE} ${RECIPE_GEN_OUTPUT_FILE} + DEPENDS circlechef-reverse ${RECIPE_OUTPUT_FILE} + COMMENT "Generating ${RECIPE_GEN_OUTPUT_FILE}") + + add_custom_command(OUTPUT ${RECIPE_GEN_OUTPUT_FILE2} + COMMAND circlechef-file ${RECIPE_GEN_OUTPUT_FILE} ${RECIPE_GEN_OUTPUT_FILE2} + DEPENDS circlechef-file ${RECIPE_GEN_OUTPUT_FILE} + COMMENT "Generating ${RECIPE_GEN_OUTPUT_FILE2}") + + list(APPEND TESTS ${CIRCLE_PREFIX}.gen) + list(APPEND TESTFILES ${RECIPE_GEN_OUTPUT_FILE2}) +endforeach(CIRCLEFILE) + # Add a dummy target to create a target-level dependency. # TODO Find a way to create a dependency between circlechef_test and generated testfiles. add_custom_target(circlechef_testfiles ALL DEPENDS ${TESTFILES}) diff --git a/compiler/circlechef/tests/shape_signature/test.recipe b/compiler/circlechef/tests/shape_signature/test.recipe new file mode 100644 index 0000000..37968ab --- /dev/null +++ b/compiler/circlechef/tests/shape_signature/test.recipe @@ -0,0 +1,45 @@ +operand { + name: "ifm" + type: FLOAT32 + shape { dim: 1 dim: 8 dim: 6 dim: 12 } + shape_signature { dim: -1 dim: 8 dim: 6 dim: 12 } +} +operand { + name: "gamma" + type: FLOAT32 + shape { dim: 12 } + filler { + tag: "gaussian" + arg: "0.0" + arg: "1.0" + } +} +operand { + name: "beta" + type: FLOAT32 + shape { dim: 12 } + filler { + tag: "gaussian" + arg: "0.0" + arg: "1.0" + } +} +operand { + name: "ofm" + type: FLOAT32 + shape { dim: 1 dim: 8 dim: 6 dim: 12 } + shape_signature { dim: -1 dim: 8 dim: 6 dim: 12 } +} +operation { + type: "InstanceNorm" + input: "ifm" + input: "gamma" + input: "beta" + output: "ofm" + instance_norm_options { + epsilon: 0.00001 + activation: NONE + } +} +input: "ifm" +output: "ofm" diff --git a/compiler/circlechef/tests/shape_signature/test.reverse b/compiler/circlechef/tests/shape_signature/test.reverse new file mode 100644 index 0000000..e69de29 diff --git a/compiler/common-artifacts/exclude.lst b/compiler/common-artifacts/exclude.lst index b2abfd5..34a4d2c 100644 --- a/compiler/common-artifacts/exclude.lst +++ b/compiler/common-artifacts/exclude.lst @@ -16,10 +16,6 @@ tcgenerate(AddN_000) tcgenerate(Add_001) # runtime doesn't support tcgenerate(Add_U8_000) tcgenerate(All_000) -tcgenerate(ArgMax_U8_000) -tcgenerate(ArgMax_U8_001) -tcgenerate(ArgMax_U8_002) -tcgenerate(ArgMax_U8_003) tcgenerate(ArgMin_000) tcgenerate(ArgMin_001) tcgenerate(ArgMin_002) @@ -35,58 +31,35 @@ tcgenerate(BatchToSpaceND_000) tcgenerate(Cast_000) tcgenerate(Cast_001) tcgenerate(Ceil_000) -tcgenerate(Concatenation_U8_000) tcgenerate(Conv2D_003) # runtime doesn't support dilation -tcgenerate(Conv2D_U8_000) -tcgenerate(Conv2D_U8_001) tcgenerate(Cos_000) tcgenerate(DepthwiseConv2D_001) # runtime doesn't support dilation tcgenerate(DepthwiseConv2D_003) # runtime doesn't support dilation -tcgenerate(DepthwiseConv2D_U8_000) tcgenerate(DepthwiseConv2D_U8_001) # luci-interpreter doesn't support channel-wise quantization yet tcgenerate(Dequantize_000) # runtime and luci-interpreter doesn't support Dequantize op yet -tcgenerate(Div_000) -tcgenerate(Equal_000) -tcgenerate(Exp_000) tcgenerate(ExpandDims_000) tcgenerate(ExpandDims_001) tcgenerate(ExpandDims_002) tcgenerate(ExpandDims_003) tcgenerate(Fill_000) tcgenerate(Fill_001) -tcgenerate(Floor_000) -tcgenerate(FloorDiv_000) -tcgenerate(FloorDiv_001) tcgenerate(FloorMod_000) tcgenerate(FloorMod_001) -tcgenerate(FullyConnected_002) tcgenerate(FullyConnected_U8_000) tcgenerate(Gather_000) tcgenerate(GatherNd_000) tcgenerate(GatherNd_001) -tcgenerate(Greater_000) -tcgenerate(GreaterEqual_000) tcgenerate(If_000) tcgenerate(If_001) tcgenerate(L2Pool2D_U8_000) -tcgenerate(Less_000) -tcgenerate(LessEqual_000) tcgenerate(Log_000) -tcgenerate(LogicalAnd_000) -tcgenerate(LogicalNot_000) -tcgenerate(LogicalOr_000) -tcgenerate(LogSoftmax_000) tcgenerate(MatMul_000) tcgenerate(MatrixBandPart_000) tcgenerate(MatrixDiag_000) tcgenerate(MatrixSetDiag_000) -tcgenerate(Maximum_000) -tcgenerate(MaxPool2D_U8_000) tcgenerate(MaxPoolWithArgMax_000) tcgenerate(MaxPoolWithArgMax_001) tcgenerate(MaxPoolWithArgMax_002) -tcgenerate(Mean_U8_000) -tcgenerate(Minimum_000) tcgenerate(NonMaxSuppressionV4_000) tcgenerate(NonMaxSuppressionV4_001) tcgenerate(NonMaxSuppressionV5_000) @@ -99,36 +72,38 @@ tcgenerate(Net_InstanceNorm_001) tcgenerate(Net_InstanceNorm_002) tcgenerate(Net_InstanceNorm_003) tcgenerate(Net_ZeroDim_001) # luci-interpreter doesn't support zero dim -tcgenerate(NotEqual_000) tcgenerate(OneHot_000) tcgenerate(OneHot_001) tcgenerate(OneHot_002) tcgenerate(OneHot_003) tcgenerate(Pack_000) tcgenerate(Pack_U8_000) -tcgenerate(Pad_U8_000) tcgenerate(PadV2_000) -tcgenerate(Pow_000) tcgenerate(Range_000) tcgenerate(Rank_000) tcgenerate(ReduceAny_000) tcgenerate(ReduceAny_001) tcgenerate(ReduceAny_002) tcgenerate(ReduceAny_003) +tcgenerate(ReduceAny_dynamic_000) +tcgenerate(ReduceAny_dynamic_001) +tcgenerate(ReduceAny_dynamic_002) +tcgenerate(ReduceAny_dynamic_003) tcgenerate(ReduceMax_000) +tcgenerate(ReduceMax_dynamic_000) tcgenerate(ReduceMin_000) +tcgenerate(ReduceMin_dynamic_000) tcgenerate(ReduceProd_000) tcgenerate(ReduceProd_001) tcgenerate(ReduceProd_002) tcgenerate(ReduceProd_003) -tcgenerate(ReLU_000) -tcgenerate(ReLU6_000) +tcgenerate(ReduceProd_dynamic_000) +tcgenerate(ReduceProd_dynamic_001) +tcgenerate(ReduceProd_dynamic_002) +tcgenerate(ReduceProd_dynamic_003) tcgenerate(ReLUN1To1_000) +tcgenerate(ReLUN1To1_dynamic_000) tcgenerate(Reshape_003) # luci-interpreter doesn't support reshape without built-in option -tcgenerate(Reshape_U8_000) -tcgenerate(ResizeBilinear_000) -tcgenerate(ResizeBilinear_U8_000) # luci-interpreter -tcgenerate(ResizeNearestNeighbor_000) tcgenerate(ReverseSequence_000) tcgenerate(ReverseV2_000) tcgenerate(Round_000) @@ -142,7 +117,6 @@ tcgenerate(SelectV2_001) tcgenerate(SelectV2_002) tcgenerate(Shape_000) tcgenerate(Sin_000) -tcgenerate(Softmax_U8_000) tcgenerate(SpaceToBatchND_000) tcgenerate(SpaceToBatchND_001) tcgenerate(SpaceToBatchND_002) @@ -151,11 +125,10 @@ tcgenerate(SparseToDense_000) tcgenerate(SplitV_000) tcgenerate(Square_000) tcgenerate(SquaredDifference_000) -tcgenerate(Sub_000) -tcgenerate(Sub_001) -tcgenerate(Sub_U8_000) tcgenerate(Sum_000) tcgenerate(Sum_001) +tcgenerate(Sum_dynamic_000) +tcgenerate(Sum_dynamic_001) tcgenerate(Tile_000) tcgenerate(Tile_U8_000) tcgenerate(TopKV2_000) @@ -184,3 +157,4 @@ tcgenerate(BCQFullyConnected_001) tcgenerate(BCQGather_000) tcgenerate(CircleBatchMatMul_000) tcgenerate(InstanceNorm_000) +tcgenerate(InstanceNorm_001) diff --git a/compiler/exo/src/Circle/CircleExporterUtils.h b/compiler/exo/src/Circle/CircleExporterUtils.h index fdd162b..78f0cf7 100644 --- a/compiler/exo/src/Circle/CircleExporterUtils.h +++ b/compiler/exo/src/Circle/CircleExporterUtils.h @@ -65,7 +65,7 @@ namespace circle_detail { /** - * @breif Record the information of T/F Lite SubGraph and its mapping to loco + * @brief Record the information of T/F Lite SubGraph and its mapping to loco */ struct SubGraphContext { diff --git a/compiler/exo/src/Dialect/Service/TFLShapeInferenceRule.cpp b/compiler/exo/src/Dialect/Service/TFLShapeInferenceRule.cpp index f4bb103..26cc561 100644 --- a/compiler/exo/src/Dialect/Service/TFLShapeInferenceRule.cpp +++ b/compiler/exo/src/Dialect/Service/TFLShapeInferenceRule.cpp @@ -116,7 +116,7 @@ private: }; /** - * @breif Expand shape x and y to same rank by align right and filling with 1 + * @brief Expand shape x and y to same rank by align right and filling with 1 */ void expand_rank(loco::TensorShape &x, loco::TensorShape &y) { @@ -136,7 +136,7 @@ void expand_rank(loco::TensorShape &x, loco::TensorShape &y) } /** - * @breif Returns shape of expanded dimension of input x and y having same rank + * @brief Returns shape of expanded dimension of input x and y having same rank */ loco::TensorShape expand_dimension(const loco::TensorShape &x, const loco::TensorShape &y) { diff --git a/compiler/exo/src/TFLite/TFLExporterUtils.h b/compiler/exo/src/TFLite/TFLExporterUtils.h index dbd7a52..f2fe607 100644 --- a/compiler/exo/src/TFLite/TFLExporterUtils.h +++ b/compiler/exo/src/TFLite/TFLExporterUtils.h @@ -65,7 +65,7 @@ namespace tflite_detail { /** - * @breif Record the information of T/F Lite SubGraph and its mapping to loco + * @brief Record the information of T/F Lite SubGraph and its mapping to loco */ struct SubGraphContext { diff --git a/compiler/hermes/include/hermes/core/Message.h b/compiler/hermes/include/hermes/core/Message.h index 28cfd79..460163f 100644 --- a/compiler/hermes/include/hermes/core/Message.h +++ b/compiler/hermes/include/hermes/core/Message.h @@ -37,7 +37,7 @@ public: public: /// @brief The number of lines uint32_t lines(void) const { return _lines.size(); } - /// @breif The content of a specific line + /// @brief The content of a specific line const std::string &line(uint32_t n) const { return _lines.at(n); } private: diff --git a/compiler/luci-interpreter/src/kernels/Conv2D.cpp b/compiler/luci-interpreter/src/kernels/Conv2D.cpp index 47e2498..c5069e4 100644 --- a/compiler/luci-interpreter/src/kernels/Conv2D.cpp +++ b/compiler/luci-interpreter/src/kernels/Conv2D.cpp @@ -135,7 +135,17 @@ void Conv2D::execute() const } throw std::runtime_error("Unsupported type."); case DataType::U8: - evalQuantized(); + if (filter()->scales().size() == 1) + { + evalQuantized(); + } + else if (filter()->scales().size() > 1) + { + LUCI_INTERPRETER_CHECK(filter()->shape().num_dims() == 4); + LUCI_INTERPRETER_CHECK(filter()->scales().size() == + static_cast(filter()->shape().dim(0))); + evalQuantizedPerChannel(); + } break; case DataType::S16: evalQuantizedS16(); @@ -219,6 +229,92 @@ void Conv2D::evalQuantized() const getTensorData(_im2col.get()), gemmlowp_context.get()); } +void Conv2D::evalQuantizedPerChannel() const +{ + const auto *input_data = getTensorData(input()); + const auto *filter_data = getTensorData(filter()); + const auto *bias_data = getTensorData(bias()); + auto *output_data = getTensorData(output()); + + const Shape &input_shape = input()->shape(); + const Shape &filter_shape = filter()->shape(); + const Shape &output_shape = output()->shape(); + + const int32_t batches = input_shape.dim(0); + const int32_t input_height = input_shape.dim(1); + const int32_t input_width = input_shape.dim(2); + const int32_t input_depth = input_shape.dim(3); + const int32_t output_depth = filter_shape.dim(0); + const int32_t filter_height = filter_shape.dim(1); + const int32_t filter_width = filter_shape.dim(2); + const int32_t output_height = output_shape.dim(1); + const int32_t output_width = output_shape.dim(2); + + const int32_t stride_height = _params.stride_height; + const int32_t stride_width = _params.stride_width; + const int32_t dilation_height_factor = _params.dilation_height_factor; + const int32_t dilation_width_factor = _params.dilation_width_factor; + + int32_t activation_min{}; + int32_t activation_max{}; + calculateActivationRangeQuantized(_params.activation, output(), &activation_min, &activation_max); + + const std::vector effective_output_scale = + getQuantizedConvolutionMultiplers(input()->scale(), filter()->scales(), output()->scale()); + + const std::vector multipliers_raw = + quantizeMultipliers(effective_output_scale); + BroadcastableWrapper quant_multipliers(multipliers_raw); + + for (int32_t batch = 0; batch < batches; ++batch) + { + for (int32_t out_y = 0; out_y < output_height; ++out_y) + { + for (int32_t out_x = 0; out_x < output_width; ++out_x) + { + for (int32_t out_c = 0; out_c < output_depth; ++out_c) + { + const int32_t in_y_origin = out_y * stride_height - _padding_height; + const int32_t in_x_origin = out_x * stride_width - _padding_width; + int32_t acc = 0; + for (int32_t filter_y = 0; filter_y < filter_height; ++filter_y) + { + for (int32_t filter_x = 0; filter_x < filter_width; ++filter_x) + { + const int32_t in_y = in_y_origin + dilation_height_factor * filter_y; + const int32_t in_x = in_x_origin + dilation_width_factor * filter_x; + if ((in_y >= 0 && in_y < input_height) && (in_x >= 0 && in_x < input_width)) + { + for (int32_t in_c = 0; in_c < input_depth; ++in_c) + { + const uint8_t input_val = + input_data[calcOffset(input_shape, batch, in_y, in_x, in_c)]; + const uint8_t filter_val = + filter_data[calcOffset(filter_shape, out_c, filter_y, filter_x, in_c)]; + acc += static_cast(input_val - input()->zero_point()) * + static_cast(filter_val - filter()->zero_points()[out_c]); + } + } + } + } + if (bias_data) + { + acc += bias_data[out_c]; + } + + int32_t scaled_acc = tflite::MultiplyByQuantizedMultiplier( + acc, quant_multipliers[out_c].multiplier, quant_multipliers[out_c].shift); + + scaled_acc += output()->zero_point(); + scaled_acc = std::max(scaled_acc, activation_min); + scaled_acc = std::min(scaled_acc, activation_max); + output_data[calcOffset(output_shape, batch, out_y, out_x, out_c)] = scaled_acc; + } + } + } + } +} + void Conv2D::evalQuantizedS16() const { const auto *input_data = getTensorData(input()); diff --git a/compiler/luci-interpreter/src/kernels/Conv2D.h b/compiler/luci-interpreter/src/kernels/Conv2D.h index 83ac67d..86f73c2 100644 --- a/compiler/luci-interpreter/src/kernels/Conv2D.h +++ b/compiler/luci-interpreter/src/kernels/Conv2D.h @@ -44,6 +44,7 @@ public: private: void evalFloat() const; void evalQuantized() const; + void evalQuantizedPerChannel() const; void evalQuantizedS16() const; private: diff --git a/compiler/luci-interpreter/src/kernels/Conv2D.test.cpp b/compiler/luci-interpreter/src/kernels/Conv2D.test.cpp index 7aa66a8..35a0c54 100644 --- a/compiler/luci-interpreter/src/kernels/Conv2D.test.cpp +++ b/compiler/luci-interpreter/src/kernels/Conv2D.test.cpp @@ -169,6 +169,78 @@ TEST(Conv2DTest, Uint8) EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); } +TEST(Conv2DTest, Uint8_CWQ) +{ + const int output_channels = 3; + std::vector input_data{ + // First batch + 1, 1, 1, 1, // row = 1 + 2, 2, 2, 2, // row = 2 + // Second batch + 1, 2, 3, 4, // row = 1 + 1, 2, 3, 4, // row = 2 + }; + std::vector filter_data{ + 1, 2, 3, 4, // first 2x2 filter + -1, 1, -1, 1, // second 2x2 filter + -1, -1, 1, 1, // third 2x2 filter + }; + std::vector bias_data{1, 2, 3}; + Shape filter_shape{output_channels, 2, 2, 1}; + + std::pair input_quant_param = quantizationParams(0, 4); + std::pair output_quant_param = quantizationParams(-127, 128); + + std::vector> filter_quant_params; + filter_quant_params.push_back(quantizationParams(0, 4)); + filter_quant_params.push_back(quantizationParams(-1, 1)); + filter_quant_params.push_back(quantizationParams(-1, 1)); + + std::vector filter_scales; + std::vector filter_zerops; + for (auto iter : filter_quant_params) + { + filter_scales.push_back(iter.first); + filter_zerops.push_back(iter.second); + } + + std::vector bias_scales; + for (int i = 0; i < output_channels; ++i) + bias_scales.push_back(filter_quant_params[i].first * input_quant_param.first); + std::vector zerop(output_channels, 0); + + Tensor input_tensor = makeInputTensor({2, 2, 4, 1}, input_quant_param.first, + input_quant_param.second, input_data); + Tensor filter_tensor = + makeInputTensor(filter_shape, filter_scales, filter_zerops, 0, filter_data); + Tensor bias_tensor = + makeInputTensor({output_channels}, bias_scales, zerop, 0, bias_data); + Tensor output_tensor = + makeOutputTensor(DataType::U8, output_quant_param.first, output_quant_param.second); + + Conv2DParams params{}; + params.padding = Padding::VALID; + params.stride_height = 2; + params.stride_width = 2; + params.dilation_height_factor = 1; + params.dilation_width_factor = 1; + params.activation = Activation::NONE; + + Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 18, 2, 5, // first batch, left + 18, 2, 5, // first batch, right + 17, 4, 3, // second batch, left + 37, 4, 3, // second batch, right + }; + std::vector ref_output_shape{2, 1, 2, 3}; + EXPECT_THAT(dequantizeTensorData(output_tensor), FloatArrayNear(ref_output_data)); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + TEST(Conv2DTest, SInt16) { Shape input_shape{1, 4, 3, 2}; diff --git a/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.cpp b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.cpp index 1957f3c..9211331 100644 --- a/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.cpp +++ b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.cpp @@ -111,7 +111,17 @@ void DepthwiseConv2D::execute() const } throw std::runtime_error("Unsupported type."); case DataType::U8: - evalQuantized(); + if (filter()->scales().size() == 1) + { + evalQuantized(); + } + else if (filter()->scales().size() > 1) + { + LUCI_INTERPRETER_CHECK(filter()->shape().num_dims() == 4); + LUCI_INTERPRETER_CHECK(filter()->scales().size() == + static_cast(filter()->shape().dim(3))); + evalQuantizedPerChannel(); + } break; case DataType::S16: evalQuantizedS16(); @@ -144,6 +154,97 @@ void DepthwiseConv2D::evalFloat() const getTensorShape(output()), getTensorData(output())); } +void DepthwiseConv2D::evalQuantizedPerChannel() const +{ + const auto *input_data = getTensorData(input()); + const auto *filter_data = getTensorData(filter()); + const auto *bias_data = getTensorData(bias()); + auto *output_data = getTensorData(output()); + + const Shape &input_shape = input()->shape(); + const Shape &filter_shape = filter()->shape(); + const Shape &output_shape = output()->shape(); + + const int32_t batches = input_shape.dim(0); + const int32_t input_height = input_shape.dim(1); + const int32_t input_width = input_shape.dim(2); + const int32_t input_depth = input_shape.dim(3); + const int32_t filter_height = filter_shape.dim(1); + const int32_t filter_width = filter_shape.dim(2); + const int32_t output_height = output_shape.dim(1); + const int32_t output_width = output_shape.dim(2); + + const int32_t stride_height = _params.stride_height; + const int32_t stride_width = _params.stride_width; + const int32_t dilation_height_factor = _params.dilation_height_factor; + const int32_t dilation_width_factor = _params.dilation_width_factor; + const int32_t depth_multiplier = _params.depth_multiplier; + + int32_t activation_min{}; + int32_t activation_max{}; + calculateActivationRangeQuantized(_params.activation, output(), &activation_min, &activation_max); + + const std::vector effective_output_scales = + getQuantizedConvolutionMultiplers(input()->scale(), filter()->scales(), output()->scale()); + + std::vector quant_multipliers_raw = + quantizeMultipliers(effective_output_scales); + BroadcastableWrapper quant_multipliers(quant_multipliers_raw); + + for (int batch = 0; batch < batches; ++batch) + { + for (int out_y = 0; out_y < output_height; ++out_y) + { + for (int out_x = 0; out_x < output_width; ++out_x) + { + for (int in_channel = 0; in_channel < input_depth; ++in_channel) + { + for (int m = 0; m < depth_multiplier; ++m) + { + const int output_channel = m + in_channel * depth_multiplier; + const int in_x_origin = (out_x * stride_width) - _padding_width; + const int in_y_origin = (out_y * stride_height) - _padding_height; + int32 acc = 0; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) + { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) + { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + const int in_y = in_y_origin + dilation_height_factor * filter_y; + // Zero padding by omitting the areas outside the image. + const bool is_point_inside_image = + (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && (in_y < input_height); + if (is_point_inside_image) + { + int32 input_val = + input_data[calcOffset(input_shape, batch, in_y, in_x, in_channel)]; + int32 filter_val = + filter_data[calcOffset(filter_shape, 0, filter_y, filter_x, output_channel)]; + acc += (filter_val - filter()->zero_points()[output_channel]) * + (input_val - input()->zero_point()); + } + } + } + if (bias_data) + { + acc += bias_data[output_channel]; + } + int32_t output_multiplier = quant_multipliers[output_channel].multiplier; + int output_shift = quant_multipliers[output_channel].shift; + int32_t scaled_acc = + tflite::MultiplyByQuantizedMultiplier(acc, output_multiplier, output_shift); + scaled_acc += output()->zero_point(); + scaled_acc = std::max(scaled_acc, activation_min); + scaled_acc = std::min(scaled_acc, activation_max); + output_data[calcOffset(output_shape, batch, out_y, out_x, output_channel)] = + static_cast(scaled_acc); + } + } + } + } + } +} + void DepthwiseConv2D::evalQuantized() const { const auto input_scale = static_cast(input()->scale()); diff --git a/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.h b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.h index 400bebe..6d700dd 100644 --- a/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.h +++ b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.h @@ -42,6 +42,7 @@ public: private: void evalFloat() const; void evalQuantized() const; + void evalQuantizedPerChannel() const; void evalQuantizedS16() const; private: diff --git a/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.test.cpp b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.test.cpp index 0c76b58..f79e888 100644 --- a/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.test.cpp +++ b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.test.cpp @@ -220,6 +220,79 @@ TEST(DepthwiseConv2DTest, SInt16_CWQ_weights) EXPECT_THAT(dequantizeTensorData(output_tensor), FloatArrayNear(ref_output_data)); } +TEST(DepthwiseConv2DTest, Uint8_CWQ_weights) +{ + const int output_channels = 4; + Shape input_shape{1, 3, 2, 2}; + Shape filter_shape{1, 2, 2, output_channels}; + Shape bias_shape{4}; + std::vector ref_output_shape{1, 2, 1, output_channels}; + + std::vector input_data{ + 1, 2, 7, 8, // + 3, 4, 9, 10, // + 5, 6, 11, 12, // + }; + std::vector filter_data{ + 1, 2, 3, 4, // + -9, 10, -11, 12, // + 5, 6, 7, 8, // + 13, -14, 15, -16, // + }; + std::vector bias_data{1, 2, 3, 4}; + std::vector ref_output_data{ + 71, -34, 99, -20, // + 91, -26, 127, -4, // + }; + + std::pair input_quant_param = quantizationParams(0, 16); + std::pair output_quant_param = quantizationParams(-127, 128); + + std::vector> filter_quant_params; + filter_quant_params.push_back(quantizationParams(-9, 13)); + filter_quant_params.push_back(quantizationParams(-14, 10)); + filter_quant_params.push_back(quantizationParams(-11, 15)); + filter_quant_params.push_back(quantizationParams(-16, 12)); + + std::vector filter_scales; + std::vector filter_zerops; + for (auto iter : filter_quant_params) + { + filter_scales.push_back(iter.first); + filter_zerops.push_back(iter.second); + } + + std::vector bias_scales; + for (int i = 0; i < output_channels; ++i) + bias_scales.push_back(filter_quant_params[i].first * input_quant_param.first); + std::vector zerop(output_channels, 0); + + Tensor input_tensor = makeInputTensor(input_shape, input_quant_param.first, + input_quant_param.second, input_data); + Tensor filter_tensor = + makeInputTensor(filter_shape, filter_scales, filter_zerops, 3, filter_data); + Tensor bias_tensor = makeInputTensor(bias_shape, bias_scales, zerop, 0, bias_data); + Tensor output_tensor = + makeOutputTensor(DataType::U8, output_quant_param.first, output_quant_param.second); + + DepthwiseConv2DParams params{}; + params.padding = Padding::VALID; + params.depth_multiplier = 2; + params.stride_height = 1; + params.stride_width = 1; + params.dilation_height_factor = 1; + params.dilation_width_factor = 1; + params.activation = Activation::NONE; + + DepthwiseConv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); + EXPECT_THAT(dequantizeTensorData(output_tensor), + FloatArrayNear(ref_output_data, output_quant_param.first)); +} + TEST(DepthwiseConv2DTest, InvalidBiasType_NEG) { Shape input_shape{1, 4, 2, 2}; diff --git a/compiler/luci-interpreter/src/kernels/TransposeConv.cpp b/compiler/luci-interpreter/src/kernels/TransposeConv.cpp index b0ee905..491ae51 100644 --- a/compiler/luci-interpreter/src/kernels/TransposeConv.cpp +++ b/compiler/luci-interpreter/src/kernels/TransposeConv.cpp @@ -93,7 +93,17 @@ void TransposeConv::execute() const evalFloat(); break; case DataType::U8: - evalQuantized(); + if (filter()->scales().size() == 1) + { + evalQuantized(); + } + else if (filter()->scales().size() > 1) + { + LUCI_INTERPRETER_CHECK(filter()->shape().num_dims() == 4); + LUCI_INTERPRETER_CHECK(filter()->scales().size() == + static_cast(filter()->shape().dim(0))); + evalQuantizedPerChannel(); + } break; case DataType::S16: evalQuantizedS16(); @@ -147,6 +157,98 @@ void TransposeConv::evalQuantized() const getTensorData(_scratch_tensor.get())); } +void TransposeConv::evalQuantizedPerChannel() const +{ + const auto *input_data = getTensorData(input()); + const auto *filter_data = getTensorData(filter()); + const auto *bias_data = getTensorData(bias()); + auto *output_data = getTensorData(output()); + auto *scratch_data = getTensorData(_scratch_tensor.get()); + + const Shape &input_shape = input()->shape(); + const Shape &filter_shape = filter()->shape(); + const Shape &output_shape = output()->shape(); + + const int32_t batches = input_shape.dim(0); + const int32_t input_height = input_shape.dim(1); + const int32_t input_width = input_shape.dim(2); + const int32_t input_depth = input_shape.dim(3); + const int32_t output_depth = filter_shape.dim(0); + const int32_t filter_height = filter_shape.dim(1); + const int32_t filter_width = filter_shape.dim(2); + const int32_t output_height = output_shape.dim(1); + const int32_t output_width = output_shape.dim(2); + + const int32_t stride_height = _params.stride_height; + const int32_t stride_width = _params.stride_width; + + int32_t activation_min{}; + int32_t activation_max{}; + calculateActivationRangeQuantized(Activation::NONE, output(), &activation_min, &activation_max); + + std::memset(scratch_data, 0, _scratch_tensor->shape().num_elements() * sizeof(int32_t)); + + BroadcastableWrapper output_multipliers(_quant_multipliers); + for (int32_t batch = 0; batch < batches; ++batch) + { + for (int32_t in_y = 0; in_y < input_height; ++in_y) + { + for (int32_t in_x = 0; in_x < input_width; ++in_x) + { + for (int32_t in_c = 0; in_c < input_depth; ++in_c) + { + const int32_t out_y_origin = in_y * stride_height - _padding_height; + const int32_t out_x_origin = in_x * stride_width - _padding_width; + for (int32_t filter_y = 0; filter_y < filter_height; ++filter_y) + { + for (int32_t filter_x = 0; filter_x < filter_width; ++filter_x) + { + const int32_t out_x = out_x_origin + filter_x; + const int32_t out_y = out_y_origin + filter_y; + if ((out_y >= 0 && out_y < output_height) && (out_x >= 0 && out_x < output_width)) + { + for (int32_t out_c = 0; out_c < output_depth; ++out_c) + { + const uint8_t input_val = + input_data[calcOffset(input_shape, batch, in_y, in_x, in_c)]; + const uint8_t filter_val = + filter_data[calcOffset(filter_shape, out_c, filter_y, filter_x, in_c)]; + scratch_data[calcOffset(output_shape, batch, out_y, out_x, out_c)] += + static_cast(input_val - input()->zero_point()) * + static_cast(filter_val - filter()->zero_points()[out_c]); + } + } + } + } + } + } + } + for (int32_t out_y = 0; out_y < output_height; ++out_y) + { + for (int32_t out_x = 0; out_x < output_width; ++out_x) + { + for (int32_t out_c = 0; out_c < output_depth; ++out_c) + { + int32_t acc = scratch_data[calcOffset(output_shape, batch, out_y, out_x, out_c)]; + if (bias_data) + { + acc += bias_data[out_c]; + } + + int32_t scaled_acc = tflite::MultiplyByQuantizedMultiplier( + acc, output_multipliers[out_c].multiplier, output_multipliers[out_c].shift); + + scaled_acc += output()->zero_point(); + scaled_acc = std::max(scaled_acc, activation_min); + scaled_acc = std::min(scaled_acc, activation_max); + + output_data[calcOffset(output_shape, batch, out_y, out_x, out_c)] = scaled_acc; + } + } + } + } +} + void TransposeConv::evalQuantizedS16() const { const auto *input_data = getTensorData(input()); diff --git a/compiler/luci-interpreter/src/kernels/TransposeConv.h b/compiler/luci-interpreter/src/kernels/TransposeConv.h index f51e169..2e0beec 100644 --- a/compiler/luci-interpreter/src/kernels/TransposeConv.h +++ b/compiler/luci-interpreter/src/kernels/TransposeConv.h @@ -47,6 +47,7 @@ public: private: void evalFloat() const; void evalQuantized() const; + void evalQuantizedPerChannel() const; void evalQuantizedS16() const; private: diff --git a/compiler/luci-interpreter/src/kernels/TransposeConv.test.cpp b/compiler/luci-interpreter/src/kernels/TransposeConv.test.cpp index 8564de0..b1309c1 100644 --- a/compiler/luci-interpreter/src/kernels/TransposeConv.test.cpp +++ b/compiler/luci-interpreter/src/kernels/TransposeConv.test.cpp @@ -154,6 +154,65 @@ TEST(TransposeConvTest, UInt8) EXPECT_THAT(dequantizeTensorData(output_tensor), FloatArrayNear(ref_output_data)); } +TEST(TransposeConvTest, UInt8_CWQ) +{ + const int32_t output_channels = 2; + std::vector input_data{1, 2, 3, 4}; + std::vector filter_data{1, 3, 5, 7, 9, 11, 13, 15, 17, 2, 4, 6, 8, 10, 12, 14, 16, 18}; + std::vector bias_data{3, 4}; + std::vector output_shape_data{1, 5, 5, 2}; + std::vector ref_output_data{ + 4, 6, 6, 8, 10, 14, 9, 12, 13, 16, // + 10, 12, 12, 14, 28, 32, 21, 24, 25, 28, // + 19, 24, 27, 32, 65, 76, 45, 52, 57, 64, // + 24, 28, 30, 34, 64, 72, 39, 44, 47, 52, // + 42, 46, 48, 52, 106, 114, 63, 68, 71, 76, // + }; + + // Choose quantization parameters carefully. + auto input_quant = quantizationParams(-8.0, 7.9375); // s = 1 / 16, zp = 128 + auto output_quant = quantizationParams(-64.0, 191.0); // s = 1, zp = 64 + + std::vector> filter_quant_params; + filter_quant_params.push_back(quantizationParams(0, 17)); + filter_quant_params.push_back(quantizationParams(0, 18)); + + std::vector filter_scales; + std::vector filter_zerops; + for (auto iter : filter_quant_params) + { + filter_scales.push_back(iter.first); + filter_zerops.push_back(iter.second); + } + + std::vector bias_scales; + for (int i = 0; i < output_channels; ++i) + bias_scales.push_back(filter_quant_params[i].first * input_quant.first); + std::vector zerop(output_channels, 0); + + Tensor input_tensor = makeInputTensor({1, 2, 2, 1}, input_quant.first, + input_quant.second, input_data); + Tensor filter_tensor = makeInputTensor({output_channels, 3, 3, 1}, filter_scales, + filter_zerops, 0, filter_data); + Tensor bias_tensor = + makeInputTensor({output_channels}, bias_scales, zerop, 0, bias_data); + Tensor output_shape_tensor = makeInputTensor({4}, output_shape_data); + Tensor output_tensor = makeOutputTensor(DataType::U8, output_quant.first, output_quant.second); + + TransposeConvParams params{}; + params.padding = Padding::VALID; + params.stride_height = 2; + params.stride_width = 2; + + TransposeConv kernel(&output_shape_tensor, &filter_tensor, &input_tensor, &bias_tensor, + &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(output_shape_data)); + EXPECT_THAT(dequantizeTensorData(output_tensor), FloatArrayNear(ref_output_data)); +} + TEST(TransposeConvTest, SInt16) { std::vector input_data{1, 2, 3, 4}; diff --git a/compiler/luci-interpreter/src/loader/GraphLoader.cpp b/compiler/luci-interpreter/src/loader/GraphLoader.cpp index c52d99e..09e9235 100644 --- a/compiler/luci-interpreter/src/loader/GraphLoader.cpp +++ b/compiler/luci-interpreter/src/loader/GraphLoader.cpp @@ -57,8 +57,12 @@ const void *getNodeData(const luci::CircleConst *node, size_t *data_size) return getNodeDataImpl(node, data_size); case DataType::FLOAT32: return getNodeDataImpl(node, data_size); + case DataType::S16: + return getNodeDataImpl(node, data_size); case DataType::S32: return getNodeDataImpl(node, data_size); + case DataType::S64: + return getNodeDataImpl(node, data_size); default: throw std::runtime_error("Unsupported type."); } diff --git a/compiler/luci/export/src/CircleExporterImpl.cpp b/compiler/luci/export/src/CircleExporterImpl.cpp index 860cebf..df75427 100644 --- a/compiler/luci/export/src/CircleExporterImpl.cpp +++ b/compiler/luci/export/src/CircleExporterImpl.cpp @@ -16,7 +16,6 @@ #include "CircleExporterImpl.h" #include "Optimize.h" -#include "TypeBridge.h" #include "CircleTensorExporter.h" #include "CircleOperationExporter.h" #include "CircleExporterUtils.h" @@ -150,9 +149,6 @@ void CircleExporterImpl::exportGraph(loco::Graph *graph) // do graph optimization optimize(graph); - // copy shape/dtype inference data to CircleNode - copy_shape_dtype(graph); - _builder.Clear(); SerializedModelData md; @@ -223,9 +219,6 @@ void CircleExporterImpl::exportModule(Module *module) optimize(graph); - // copy shape/dtype inference data to CircleNode - copy_shape_dtype(graph); - SerializedGraphData gd; // set Subgraph name diff --git a/compiler/luci/export/src/CircleExporterUtils.cpp b/compiler/luci/export/src/CircleExporterUtils.cpp index 1fdb40e..3715513 100644 --- a/compiler/luci/export/src/CircleExporterUtils.cpp +++ b/compiler/luci/export/src/CircleExporterUtils.cpp @@ -87,6 +87,22 @@ circle::MirrorPadMode to_circle_mirrorpadmode(luci::MirrorPadMode mode) } } +circle::FullyConnectedOptionsWeightsFormat +to_circle_weightsformat(luci::CircleFullyConnected::WeightsFormat format) +{ + switch (format) + { + case luci::CircleFullyConnected::WeightsFormat::DEFAULT: + return circle::FullyConnectedOptionsWeightsFormat_DEFAULT; + case luci::CircleFullyConnected::WeightsFormat::SHUFFLED4x16INT8: + return circle::FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8; + case luci::CircleFullyConnected::WeightsFormat::SHUFFLED16x1FLOAT32: + return circle::FullyConnectedOptionsWeightsFormat_SHUFFLED16x1FLOAT32; + default: + INTERNAL_EXN_V("trying to convert unsupported luci::WeightsFormat", oops::to_uint32(format)); + } +} + circle::DimensionType to_circle_dimensiontype(luci::DimensionType type) { switch (type) diff --git a/compiler/luci/export/src/CircleExporterUtils.h b/compiler/luci/export/src/CircleExporterUtils.h index 7857213..95310b3 100644 --- a/compiler/luci/export/src/CircleExporterUtils.h +++ b/compiler/luci/export/src/CircleExporterUtils.h @@ -32,6 +32,8 @@ namespace luci circle::ActivationFunctionType to_circle_actfunc(luci::FusedActFunc func); circle::TensorType to_circle_tensortype(loco::DataType type); circle::MirrorPadMode to_circle_mirrorpadmode(luci::MirrorPadMode mode); +circle::FullyConnectedOptionsWeightsFormat +to_circle_weightsformat(luci::CircleFullyConnected::WeightsFormat format); circle::DimensionType to_circle_dimensiontype(luci::DimensionType type); flatbuffers::Offset to_circle_sparse_index_vector(flatbuffers::FlatBufferBuilder &fb, const SparseIndexVector &sparse_idx_vec); diff --git a/compiler/luci/export/src/CircleOperationExporter.cpp b/compiler/luci/export/src/CircleOperationExporter.cpp index c937109..4343cf3 100644 --- a/compiler/luci/export/src/CircleOperationExporter.cpp +++ b/compiler/luci/export/src/CircleOperationExporter.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -930,7 +929,8 @@ void OperationExporter::visit(luci::CircleFullyConnected *node) { export_simple( node, circle::BuiltinOperator_FULLY_CONNECTED, circle::BuiltinOptions_FullyConnectedOptions, - CreateFullyConnectedOptions(_ctx.builder, to_circle_actfunc(node->fusedActivationFunction())) + CreateFullyConnectedOptions(_ctx.builder, to_circle_actfunc(node->fusedActivationFunction()), + to_circle_weightsformat(node->weights_format())) .Union()); } diff --git a/compiler/luci/export/src/CircleTensorExporter.cpp b/compiler/luci/export/src/CircleTensorExporter.cpp index 1429d28..9bdfa00 100644 --- a/compiler/luci/export/src/CircleTensorExporter.cpp +++ b/compiler/luci/export/src/CircleTensorExporter.cpp @@ -111,10 +111,10 @@ void allocateCircleTensorInfo(CircleNode *node, CircleTensorContext &ctx) CircleTensoInfo tensor_info; tensor_info.name(tensor_name); - tensor_info.dtype(to_circle_tensortype(luci::node_dtype(node))); + tensor_info.dtype(to_circle_tensortype(node->dtype())); tensor_info.shape_signature(node->shape_signature()); if (node->shape_status() == ShapeStatus::VALID) - tensor_info.shape(to_shape_description(luci::node_shape(node))); + tensor_info.shape(to_shape_description(node)); tensor_info.shape_status(node->shape_status()); tensor_info.content(dynamic_cast(node)); @@ -243,6 +243,9 @@ flatbuffers::Offset> encodeShape(FlatBufferBuilder &builder, flatbuffers::Offset> encodeShapeSignature(FlatBufferBuilder &builder, const ShapeSignature &shape_signature) { + if (shape_signature.rank() == 0) + return 0; + return builder.CreateVector(shape_signature.as_vector()); } diff --git a/compiler/luci/export/src/Optimize.cpp b/compiler/luci/export/src/Optimize.cpp index 6fa50b5..036a4a2 100644 --- a/compiler/luci/export/src/Optimize.cpp +++ b/compiler/luci/export/src/Optimize.cpp @@ -18,6 +18,7 @@ #include "ProgressReporter.h" #include +#include #include #include @@ -34,6 +35,7 @@ void optimize(loco::Graph *g) // prepare type and shape before optimization phase.emplace_back(std::make_unique()); phase.emplace_back(std::make_unique()); + phase.emplace_back(std::make_unique()); // TODO add more optimization passes (with a knob) } diff --git a/compiler/luci/export/src/SerializedData.h b/compiler/luci/export/src/SerializedData.h index 46b1ac2..c41f50e 100644 --- a/compiler/luci/export/src/SerializedData.h +++ b/compiler/luci/export/src/SerializedData.h @@ -64,7 +64,7 @@ namespace luci { /** - * @breif Record the information of T/F Lite SubGraph and its mapping to loco + * @brief Record the information of T/F Lite SubGraph and its mapping to loco */ struct SubGraphContext { diff --git a/compiler/luci/import/include/luci/Import/CircleReader.h b/compiler/luci/import/include/luci/Import/CircleReader.h index 8636b1d..8e210dd 100644 --- a/compiler/luci/import/include/luci/Import/CircleReader.h +++ b/compiler/luci/import/include/luci/Import/CircleReader.h @@ -46,6 +46,8 @@ loco::DataType luci_datatype(circle::TensorType type); FusedActFunc luci_actfunc(const circle::ActivationFunctionType type); Padding luci_padding(const circle::Padding padding); MirrorPadMode luci_mirrorpad_mode(const circle::MirrorPadMode mode); +luci::CircleFullyConnected::WeightsFormat +luci_weights_format(const circle::FullyConnectedOptionsWeightsFormat weights_format); std::unique_ptr luci_quantparam(const circle::QuantizationParametersT *quantization); diff --git a/compiler/luci/import/src/CircleReader.cpp b/compiler/luci/import/src/CircleReader.cpp index 068de52..b33c920 100644 --- a/compiler/luci/import/src/CircleReader.cpp +++ b/compiler/luci/import/src/CircleReader.cpp @@ -151,6 +151,22 @@ MirrorPadMode luci_mirrorpad_mode(const circle::MirrorPadMode mode) return MirrorPadMode::UNDEFINED; } +luci::CircleFullyConnected::WeightsFormat +luci_weights_format(const circle::FullyConnectedOptionsWeightsFormat weights_format) +{ + switch (weights_format) + { + case circle::FullyConnectedOptionsWeightsFormat_DEFAULT: + return luci::CircleFullyConnected::WeightsFormat::DEFAULT; + case circle::FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8: + return luci::CircleFullyConnected::WeightsFormat::SHUFFLED4x16INT8; + case circle::FullyConnectedOptionsWeightsFormat_SHUFFLED16x1FLOAT32: + return luci::CircleFullyConnected::WeightsFormat::SHUFFLED16x1FLOAT32; + default: + throw std::runtime_error("Invalid FullyConnectedOptionsWeightsFormat"); + } +} + DimensionType luci_dim_type(const circle::DimensionType dim_type) { switch (dim_type) diff --git a/compiler/luci/import/src/Nodes/CircleFullyConnected.cpp b/compiler/luci/import/src/Nodes/CircleFullyConnected.cpp index 65a863b..17293ad 100644 --- a/compiler/luci/import/src/Nodes/CircleFullyConnected.cpp +++ b/compiler/luci/import/src/Nodes/CircleFullyConnected.cpp @@ -53,12 +53,7 @@ CircleNode *CircleFullyConnectedGraphBuilder::build_node(const circle::OperatorT const auto *options = op.builtin_options.AsFullyConnectedOptions(); node->fusedActivationFunction(luci_actfunc(options->fused_activation_function)); - if (options->weights_format != circle::FullyConnectedOptionsWeightsFormat_DEFAULT) - { - throw oops::UserExn( - "Unsupported weights format", - circle::EnumNameFullyConnectedOptionsWeightsFormat(options->weights_format)); - } + node->weights_format(luci_weights_format(options->weights_format)); return node; } diff --git a/compiler/luci/lang/include/luci/IR/AttrDilation.h b/compiler/luci/lang/include/luci/IR/AttrDilation.h index c2b28d7..ed82325 100644 --- a/compiler/luci/lang/include/luci/IR/AttrDilation.h +++ b/compiler/luci/lang/include/luci/IR/AttrDilation.h @@ -27,15 +27,17 @@ class Dilation final public: Dilation() : _w(1), _h(1) {} - int32_t w() const { return _w; } - void w(int32_t w) { _w = w; } + uint32_t w() const { return _w; } + void w(uint32_t w) { _w = w; } + void w(int32_t w); - int32_t h() const { return _h; } - void h(int32_t h) { _h = h; } + uint32_t h() const { return _h; } + void h(uint32_t h) { _h = h; } + void h(int32_t h); private: - int32_t _w; - int32_t _h; + uint32_t _w; + uint32_t _h; }; } // namespace luci diff --git a/compiler/luci/lang/include/luci/IR/AttrFilter.h b/compiler/luci/lang/include/luci/IR/AttrFilter.h index 7909fa5..af9d751 100644 --- a/compiler/luci/lang/include/luci/IR/AttrFilter.h +++ b/compiler/luci/lang/include/luci/IR/AttrFilter.h @@ -27,15 +27,17 @@ class Filter final public: Filter() : _w(1), _h(1) {} - int32_t w() const { return _w; } - void w(int32_t w) { _w = w; } + uint32_t w() const { return _w; } + void w(uint32_t w) { _w = w; } + void w(int32_t w); - int32_t h() const { return _h; } - void h(int32_t h) { _h = h; } + uint32_t h() const { return _h; } + void h(uint32_t h) { _h = h; } + void h(int32_t h); private: - int32_t _w; - int32_t _h; + uint32_t _w; + uint32_t _h; }; } // namespace luci diff --git a/compiler/luci/lang/include/luci/IR/AttrStride.h b/compiler/luci/lang/include/luci/IR/AttrStride.h index 654967d..6be6979 100644 --- a/compiler/luci/lang/include/luci/IR/AttrStride.h +++ b/compiler/luci/lang/include/luci/IR/AttrStride.h @@ -27,15 +27,17 @@ class Stride final public: Stride() : _w(1), _h(1) {} - int32_t w() const { return _w; } - void w(int32_t w) { _w = w; } + uint32_t w() const { return _w; } + void w(uint32_t w) { _w = w; } + void w(int32_t w); - int32_t h() const { return _h; } - void h(int32_t h) { _h = h; } + uint32_t h() const { return _h; } + void h(uint32_t h) { _h = h; } + void h(int32_t h); private: - int32_t _w; - int32_t _h; + uint32_t _w; + uint32_t _h; }; } // namespace luci diff --git a/compiler/luci/lang/include/luci/IR/CircleShapeSignature.h b/compiler/luci/lang/include/luci/IR/CircleShapeSignature.h index 970f1b5..18a2604 100644 --- a/compiler/luci/lang/include/luci/IR/CircleShapeSignature.h +++ b/compiler/luci/lang/include/luci/IR/CircleShapeSignature.h @@ -46,6 +46,8 @@ private: std::vector _shape_signature{}; }; +bool operator==(const ShapeSignature &lhs, const ShapeSignature &rhs); + } // namespace luci #endif // __LUCI_IR_SHAPE_SIGNATURE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleFullyConnected.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleFullyConnected.h index d78f394..952befc 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleFullyConnected.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleFullyConnected.h @@ -35,6 +35,16 @@ class CircleFullyConnected final public LuciNodeMixin { public: + enum class WeightsFormat + { + UNDEFINED, // This is not defined by Circle. This was added to prevent programming error. + + DEFAULT, + SHUFFLED4x16INT8, + SHUFFLED16x1FLOAT32, + }; + +public: loco::Node *input(void) const { return at(0)->node(); } void input(loco::Node *node) { at(0)->node(node); } @@ -43,6 +53,13 @@ public: loco::Node *bias(void) const override { return at(2)->node(); } void bias(loco::Node *node) override { at(2)->node(node); } + +public: + WeightsFormat weights_format(void) const { return _weights_format; } + void weights_format(WeightsFormat weights_format) { _weights_format = weights_format; } + +private: + WeightsFormat _weights_format{WeightsFormat::DEFAULT}; }; } // namespace luci diff --git a/tools/nnapi_quickcheck/inc/memory.h b/compiler/luci/lang/src/AttrDilation.cpp similarity index 64% rename from tools/nnapi_quickcheck/inc/memory.h rename to compiler/luci/lang/src/AttrDilation.cpp index 3f1bca8..a9f4795 100644 --- a/tools/nnapi_quickcheck/inc/memory.h +++ b/compiler/luci/lang/src/AttrDilation.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,21 +14,23 @@ * limitations under the License. */ -#ifndef __MEMORY_H__ -#define __MEMORY_H__ +#include "luci/IR/AttrDilation.h" -#include +#include -template inline T *make_alloc(void) +namespace luci { - auto ptr = malloc(sizeof(T)); - if (ptr == nullptr) - { - throw std::bad_alloc{}; - } +void Dilation::w(int32_t w) +{ + assert(w >= 0); + _w = static_cast(w); +} - return reinterpret_cast(ptr); +void Dilation::h(int32_t h) +{ + assert(h >= 0); + _h = static_cast(h); } -#endif // __MEMORY_H__ +} // namespace luci diff --git a/compiler/luci/lang/src/AttrDilation.test.cpp b/compiler/luci/lang/src/AttrDilation.test.cpp new file mode 100644 index 0000000..3e46589 --- /dev/null +++ b/compiler/luci/lang/src/AttrDilation.test.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/AttrDilation.h" + +#include + +TEST(CircleAttrDilationTest, set) +{ + auto d = luci::Dilation(); + + d.h(10u); + d.w(10u); + + ASSERT_EQ(d.h(), 10u); + ASSERT_EQ(d.w(), 10u); + + d.h(10); // int32_t + d.w(10); + + ASSERT_EQ(d.h(), 10u); + ASSERT_EQ(d.w(), 10u); +} diff --git a/tools/nnapi_quickcheck/lib/env.test.cpp b/compiler/luci/lang/src/AttrFilter.cpp similarity index 55% rename from tools/nnapi_quickcheck/lib/env.test.cpp rename to compiler/luci/lang/src/AttrFilter.cpp index dd9ac8b..9c571e7 100644 --- a/tools/nnapi_quickcheck/lib/env.test.cpp +++ b/compiler/luci/lang/src/AttrFilter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,32 +14,23 @@ * limitations under the License. */ -#include "env.h" +#include "luci/IR/AttrFilter.h" -#include - -#include #include -inline void ensure(int err) { assert(err == 0); } - -int main(int argc, char **argv) +namespace luci { - const std::string key{"TEST"}; - const int num{3}; - - const auto str = std::to_string(num); - - ensure(unsetenv(key.c_str())); - ensure(setenv(key.c_str(), str.c_str(), 0)); - - int value = 0; - - assert(value != num); - IntVar buffer(key, value); - - assert(buffer() == num); +void Filter::w(int32_t w) +{ + assert(w >= 0); + _w = static_cast(w); +} - return 0; +void Filter::h(int32_t h) +{ + assert(h >= 0); + _h = static_cast(h); } + +} // namespace luci diff --git a/compiler/luci/lang/src/AttrFilter.test.cpp b/compiler/luci/lang/src/AttrFilter.test.cpp new file mode 100644 index 0000000..06dbcac --- /dev/null +++ b/compiler/luci/lang/src/AttrFilter.test.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/AttrFilter.h" + +#include + +TEST(CircleAttrFilterTest, set) +{ + auto f = luci::Filter(); + + f.h(10u); + f.w(10u); + + ASSERT_EQ(f.h(), 10u); + ASSERT_EQ(f.w(), 10u); + + f.h(10); // int32_t + f.w(10); + + ASSERT_EQ(f.h(), 10u); + ASSERT_EQ(f.w(), 10u); +} diff --git a/compiler/luci/lang/src/AttrStride.cpp b/compiler/luci/lang/src/AttrStride.cpp new file mode 100644 index 0000000..9720d12 --- /dev/null +++ b/compiler/luci/lang/src/AttrStride.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/AttrStride.h" + +#include + +namespace luci +{ + +void Stride::w(int32_t w) +{ + assert(w >= 0); + _w = static_cast(w); +} + +void Stride::h(int32_t h) +{ + assert(h >= 0); + _h = static_cast(h); +} + +} // namespace luci diff --git a/compiler/luci/lang/src/AttrStride.test.cpp b/compiler/luci/lang/src/AttrStride.test.cpp new file mode 100644 index 0000000..e91365b --- /dev/null +++ b/compiler/luci/lang/src/AttrStride.test.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/AttrStride.h" + +#include + +TEST(CircleAttrStrideTest, set) +{ + auto s = luci::Stride(); + + s.h(10u); + s.w(10u); + + ASSERT_EQ(s.h(), 10u); + ASSERT_EQ(s.w(), 10u); + + s.h(10); // int32_t + s.w(10); + + ASSERT_EQ(s.h(), 10u); + ASSERT_EQ(s.w(), 10u); +} diff --git a/compiler/luci/lang/src/CircleShapeSignature.cpp b/compiler/luci/lang/src/CircleShapeSignature.cpp new file mode 100644 index 0000000..9700002 --- /dev/null +++ b/compiler/luci/lang/src/CircleShapeSignature.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/CircleShapeSignature.h" + +namespace luci +{ + +bool operator==(const ShapeSignature &lhs, const ShapeSignature &rhs) +{ + if (lhs.rank() != rhs.rank()) + return false; + + for (uint32_t i = 0; i < lhs.rank(); ++i) + if (lhs.dim(i) != rhs.dim(i)) + return false; + + return true; +} + +} // namespace luci diff --git a/compiler/luci/pass/include/luci/CircleOptimizer.h b/compiler/luci/pass/include/luci/CircleOptimizer.h index db5bdb5..906760e 100644 --- a/compiler/luci/pass/include/luci/CircleOptimizer.h +++ b/compiler/luci/pass/include/luci/CircleOptimizer.h @@ -19,6 +19,8 @@ #include +#include + #include #include @@ -47,6 +49,10 @@ public: FusePreActivationBatchNorm, MakeBatchNormGammaPositive, FuseActivationFunction, + ShuffleWeightTo16x1Float32, + RemoveRedundantTranspose, + ReplaceMulAddWithDepthwiseConv, + SubstitutePackToReshape, }; enum AlgorithmParameters @@ -77,6 +83,8 @@ public: Options *options(void); public: + void optimize(luci::Module *) const; + void optimize(loco::Graph *) const; void quantize(loco::Graph *) const; diff --git a/compiler/luci/pass/include/luci/ModulePass.h b/compiler/luci/pass/include/luci/ModulePass.h new file mode 100644 index 0000000..1835f6e --- /dev/null +++ b/compiler/luci/pass/include/luci/ModulePass.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MODULE_PASS_H__ +#define __MODULE_PASS_H__ + +#include +#include + +#include + +namespace luci +{ + +class Pass : public logo::Pass +{ +public: + // Run module pass and return false if there was nothing changed + virtual bool run(luci::Module *) = 0; +}; + +} // namespace luci + +#endif // __MODULE_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/CircleTypeInferencePass.h b/compiler/luci/pass/include/luci/Pass/CircleTypeInferencePass.h new file mode 100644 index 0000000..379b44c --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/CircleTypeInferencePass.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_CIRCLE_TYPE_INFERENCE_PASS_H__ +#define __LUCI_CIRCLE_TYPE_INFERENCE_PASS_H__ + +#include + +#include + +namespace luci +{ + +/** + * @brief Pass to infer type of circle nodes + */ +class CircleTypeInferencePass : public luci::Pass +{ +public: + virtual const char *name(void) const { return "luci::CircleTypeInferencePass"; } + +public: + bool run(luci::Module *m); + bool run(loco::Graph *g); +}; + +} // namespace luci + +#endif //__LUCI_CIRCLE_TYPE_INFERENCE_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/FuseBCQPass.h b/compiler/luci/pass/include/luci/Pass/FuseBCQPass.h index 4404a9f..912ad42 100644 --- a/compiler/luci/pass/include/luci/Pass/FuseBCQPass.h +++ b/compiler/luci/pass/include/luci/Pass/FuseBCQPass.h @@ -17,7 +17,7 @@ #ifndef __LUCI_FUSE_BCQ_PASS_H__ #define __LUCI_FUSE_BCQ_PASS_H__ -#include +#include namespace luci { @@ -26,10 +26,11 @@ namespace luci * @brief Class to fuse certain pattern of subgraph into CircleBCQFullyConnected or CircleBCQGather * */ -struct FuseBCQPass final : public logo::Pass +struct FuseBCQPass final : public luci::Pass { const char *name(void) const final { return "luci::FuseBCQPass"; } + bool run(luci::Module *m) final; bool run(loco::Graph *g) final; }; diff --git a/compiler/luci/pass/include/luci/Pass/MigrateLegacyShapeDtypePass.h b/compiler/luci/pass/include/luci/Pass/MigrateLegacyShapeDtypePass.h new file mode 100644 index 0000000..c0ebc4e --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/MigrateLegacyShapeDtypePass.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_MIGRATE_LEGACY_SHAPE_DTYPE_PASS_H__ +#define __LUCI_MIGRATE_LEGACY_SHAPE_DTYPE_PASS_H__ + +#include + +#include + +namespace luci +{ + +/** + * @brief Pass to copy shape/dtype of loco to circle node + * + * CAUTION : This pass will be removed after refactoring is finished + */ +class MigrateLegacyShapeDtypePass : public luci::Pass +{ +public: + virtual const char *name(void) const { return "luci::MigrateLegacyShapeDtypePass"; } + +public: + bool run(luci::Module *m); + bool run(loco::Graph *graph); +}; + +} // namespace luci + +#endif //__LUCI_MIGRATE_LEGACY_SHAPE_DTYPE_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/PropagateQuantParamPass.h b/compiler/luci/pass/include/luci/Pass/PropagateQuantParamPass.h new file mode 100644 index 0000000..7e0c44b --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/PropagateQuantParamPass.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_PROPAGATE_QUANT_PARAM_PASS_H__ +#define __LUCI_PROPAGATE_QUANT_PARAM_PASS_H__ + +#include + +namespace luci +{ + +/** + * @brief Class to propagate quantization parameters of an operator's output to input + */ +struct PropagateQuantParamPass final : public logo::Pass +{ + const char *name(void) const final { return "luci::PropagateQuantParamPass"; } + + bool run(loco::Graph *g) final; +}; + +} // namespace luci + +#endif // __LUCI_PROPAGATE_QUANT_PARAM_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/RemoveRedundantTransposePass.h b/compiler/luci/pass/include/luci/Pass/RemoveRedundantTransposePass.h new file mode 100644 index 0000000..ca20da5 --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/RemoveRedundantTransposePass.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_REMOVE_REDUNDANT_TRANSPOSE_H__ +#define __LUCI_REMOVE_REDUNDANT_TRANSPOSE_H__ + +#include + +namespace luci +{ + +/** + * @brief fuse or remove subsequent Transpose operators + */ +struct RemoveRedundantTransposePass final : public logo::Pass +{ + const char *name(void) const final { return "luci::RemoveRedundantTransposePass"; } + + bool run(loco::Graph *g) final; +}; + +} // namespace luci + +#endif // __LUCI_REMOVE_REDUNDANT_TRANSPOSE_H__ diff --git a/compiler/luci/pass/include/luci/Pass/ReplaceMulAddWithDepthwiseConvPass.h b/compiler/luci/pass/include/luci/Pass/ReplaceMulAddWithDepthwiseConvPass.h new file mode 100644 index 0000000..5dbcc8f --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/ReplaceMulAddWithDepthwiseConvPass.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_REPLACE_MUL_ADD_WITH_DEPTHWISE_CONV_PASS_H__ +#define __LUCI_REPLACE_MUL_ADD_WITH_DEPTHWISE_CONV_PASS_H__ + +#include + +namespace luci +{ + +/** + * @brief Class to replace channel-wise mul/add with CircleDepthwiseConv2D + */ +struct ReplaceMulAddWithDepthwiseConvPass final : public logo::Pass +{ + const char *name(void) const final { return "luci::ReplaceMulAddWithDepthwiseConvPass"; } + + bool run(loco::Graph *g) final; +}; + +} // namespace luci + +#endif // __LUCI_REPLACE_MUL_ADD_WITH_DEPTHWISE_CONV_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/ShapeInferencePass.h b/compiler/luci/pass/include/luci/Pass/ShapeInferencePass.h index 86bb2ab..e21ab4c 100644 --- a/compiler/luci/pass/include/luci/Pass/ShapeInferencePass.h +++ b/compiler/luci/pass/include/luci/Pass/ShapeInferencePass.h @@ -19,7 +19,7 @@ #include -#include +#include namespace luci { @@ -27,12 +27,13 @@ namespace luci /** * @brief Pass to infer shape of nodes */ -class ShapeInferencePass : public logo::Pass +class ShapeInferencePass : public luci::Pass { public: virtual const char *name(void) const { return "luci::ShapeInferencePass"; } public: + bool run(luci::Module *m); bool run(loco::Graph *graph); }; diff --git a/compiler/luci/pass/include/luci/Pass/ShapeSignatureInferencePass.h b/compiler/luci/pass/include/luci/Pass/ShapeSignatureInferencePass.h new file mode 100644 index 0000000..2c6ffcf --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/ShapeSignatureInferencePass.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_SHAPE_SIGNATURE_INFERENCE_PASS_H__ +#define __LUCI_SHAPE_SIGNATURE_INFERENCE_PASS_H__ + +#include + +#include + +namespace luci +{ + +/** + * @brief Pass to infer shape_signature of nodes + */ +class ShapeSignatureInferencePass : public luci::Pass +{ +public: + virtual const char *name(void) const { return "luci::ShapeSignatureInferencePass"; } + +public: + bool run(luci::Module *m); + bool run(loco::Graph *graph); +}; + +} // namespace luci + +#endif //__LUCI_SHAPE_SIGNATURE_INFERENCE_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/ShuffleWeightTo16x1Float32Pass.h b/compiler/luci/pass/include/luci/Pass/ShuffleWeightTo16x1Float32Pass.h new file mode 100644 index 0000000..3d84f51 --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/ShuffleWeightTo16x1Float32Pass.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_SHUFFLE_WEIGHT_TO_16X1_FLOAT32_PASS_H__ +#define __LUCI_SHUFFLE_WEIGHT_TO_16X1_FLOAT32_PASS_H__ + +#include + +namespace luci +{ + +/** + * @brief Class to convert weight format of FullyConnected to SHUFFLED16x1FLOAT32 + */ +struct ShuffleWeightTo16x1Float32Pass final : public logo::Pass +{ + const char *name(void) const final { return "luci::ShuffleWeightTo16x1Float32Pass"; } + + bool run(loco::Graph *g) final; +}; + +} // namespace luci + +#endif // __LUCI_SHUFFLE_WEIGHT_TO_16X1_FLOAT32_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/SubstitutePackToReshapePass.h b/compiler/luci/pass/include/luci/Pass/SubstitutePackToReshapePass.h new file mode 100644 index 0000000..36d13f1 --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/SubstitutePackToReshapePass.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_SUBSTITUTE_PACK_TO_RESHAPE_PASS_H__ +#define __LUCI_SUBSTITUTE_PACK_TO_RESHAPE_PASS_H__ + +#include + +namespace luci +{ + +/** + * @brief Class to Substitute Pack with 1 input to single reshape node. + */ +struct SubstitutePackToReshapePass final : public logo::Pass +{ + const char *name(void) const final { return "luci::SubstitutePackToReshapePass"; } + + bool run(loco::Graph *g) final; +}; + +} // namespace luci + +#endif // __LUCI_SUBSTITUTE_PACK_TO_RESHAPE_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/TypeInferencePass.h b/compiler/luci/pass/include/luci/Pass/TypeInferencePass.h index c607ac6..9d964bd 100644 --- a/compiler/luci/pass/include/luci/Pass/TypeInferencePass.h +++ b/compiler/luci/pass/include/luci/Pass/TypeInferencePass.h @@ -20,7 +20,7 @@ #include -#include +#include namespace luci { @@ -28,12 +28,13 @@ namespace luci /** * @brief Pass to infer type of nodes */ -class TypeInferencePass : public logo::Pass +class TypeInferencePass : public luci::Pass { public: virtual const char *name(void) const { return "luci::TypeInferencePass"; } public: + bool run(luci::Module *m); bool run(loco::Graph *graph); }; diff --git a/compiler/luci/pass/src/CircleOptimizer.cpp b/compiler/luci/pass/src/CircleOptimizer.cpp index 34f6473..cc9fe48 100644 --- a/compiler/luci/pass/src/CircleOptimizer.cpp +++ b/compiler/luci/pass/src/CircleOptimizer.cpp @@ -24,6 +24,9 @@ #include "luci/Pass/FuseInstanceNormPass.h" #include "luci/Pass/FusePreActivationBatchNormPass.h" #include "luci/Pass/MakeBatchNormGammaPositivePass.h" +#include "luci/Pass/PropagateQuantParamPass.h" +#include "luci/Pass/RemoveRedundantTransposePass.h" +#include "luci/Pass/ReplaceMulAddWithDepthwiseConvPass.h" #include "luci/Pass/ResolveCustomOpAddPass.h" #include "luci/Pass/ResolveCustomOpBatchMatMulPass.h" #include "luci/Pass/ResolveCustomOpMatMulPass.h" @@ -31,14 +34,21 @@ #include "luci/Pass/QuantizeWithMinMaxPass.h" #include "luci/Pass/QuantizeDequantizeWeightsPass.h" #include "luci/Pass/SparsifyTensorPass.h" +#include "luci/Pass/ShuffleWeightTo16x1Float32Pass.h" +#include "luci/Pass/SubstitutePackToReshapePass.h" // TODO add more passes #include "luci/Pass/ShapeInferencePass.h" +#include "luci/Pass/ShapeSignatureInferencePass.h" #include "luci/Pass/TypeInferencePass.h" +// Following passes will be removed after refactoring is finished +#include "luci/Pass/MigrateLegacyShapeDtypePass.h" + // logo passes #include +#include "ModulePhase.h" #include "ProgressReporter.h" #include "CircleOptimizerUtils.h" @@ -124,11 +134,44 @@ CircleOptimizer::Options *CircleOptimizer::options(void) return _options.get(); } +void CircleOptimizer::optimize(luci::Module *m) const +{ + luci::Phase phase; + + // Following passes will be deprecated after refactoring is finished. + phase.emplace_back(std::make_unique()); + + // Following passes are needed everytime when other passes create new node or modify some nodes. + phase.emplace_back(std::make_unique()); + phase.emplace_back(std::make_unique()); + phase.emplace_back(std::make_unique()); + + if (_options->query(Options::Algorithm::FuseBCQ)) + { + phase.emplace_back(std::make_unique()); + } + + ModuleProgressReporter prog(m, logo::PhaseStrategy::Restart); + PhaseRunner phase_runner{m}; + phase_runner.attach(&prog); + phase_runner.run(phase); +} + void CircleOptimizer::optimize(loco::Graph *g) const { logo::Phase phase; /* TRANSFORM DECLARATION BEGIN */ + phase.emplace_back(std::make_unique()); + + // Following passes will be deprecated after refactoring is finished. + phase.emplace_back(std::make_unique()); + + // Following passes are needed everytime when other passes create new node or modify some nodes. + phase.emplace_back(std::make_unique()); + phase.emplace_back(std::make_unique()); + phase.emplace_back(std::make_unique()); + if (_options->query(Options::Algorithm::ResolveCustomOpAdd)) { phase.emplace_back(std::make_unique()); @@ -145,10 +188,6 @@ void CircleOptimizer::optimize(loco::Graph *g) const { phase.emplace_back(std::make_unique()); } - if (_options->query(Options::Algorithm::FuseBCQ)) - { - phase.emplace_back(std::make_unique()); - } if (_options->query(Options::Algorithm::FuseBatchNormWithTConv)) { phase.emplace_back(std::make_unique()); @@ -173,15 +212,27 @@ void CircleOptimizer::optimize(loco::Graph *g) const { phase.emplace_back(std::make_unique()); } + if (_options->query(Options::Algorithm::ShuffleWeightTo16x1Float32)) + { + phase.emplace_back(std::make_unique()); + } + if (_options->query(Options::Algorithm::RemoveRedundantTranspose)) + { + phase.emplace_back(std::make_unique()); + } + if (_options->query(Options::Algorithm::ReplaceMulAddWithDepthwiseConv)) + { + phase.emplace_back(std::make_unique()); + } + if (_options->query(Options::Algorithm::SubstitutePackToReshape)) + { + phase.emplace_back(std::make_unique()); + } - // Shape inference is needed for added nodes doing above transformations - phase.emplace_back(std::make_unique()); - phase.emplace_back(std::make_unique()); - phase.emplace_back(std::make_unique()); /* TRANSFORM DECLARATION END */ - ProgressReporter prog(g, logo::PhaseStrategy::Saturate); - logo::PhaseRunner phase_runner{g}; + ProgressReporter prog(g, logo::PhaseStrategy::Restart); + logo::PhaseRunner phase_runner{g}; phase_runner.attach(&prog); phase_runner.run(phase); } @@ -258,6 +309,20 @@ void CircleOptimizer::quantize(loco::Graph *g) const luci::QuantizeWithMinMaxPass quantizer(str_to_dtype(input_dtype), str_to_dtype(output_dtype), str_to_granularity(granularity)); quantizer.run(g); + + // Post-quantization optimizations + logo::Phase phase; + + phase.emplace_back(std::make_unique()); + + phase.emplace_back(std::make_unique()); + phase.emplace_back(std::make_unique()); + phase.emplace_back(std::make_unique()); + + ProgressReporter prog(g, logo::PhaseStrategy::Saturate); + logo::PhaseRunner phase_runner{g}; + phase_runner.attach(&prog); + phase_runner.run(phase); } // Requantize diff --git a/compiler/luci/pass/src/CircleTypeInferencePass.cpp b/compiler/luci/pass/src/CircleTypeInferencePass.cpp new file mode 100644 index 0000000..67bd253 --- /dev/null +++ b/compiler/luci/pass/src/CircleTypeInferencePass.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/CircleTypeInferencePass.h" + +#include + +#include + +namespace luci +{ + +bool CircleTypeInferencePass::run(luci::Module *m) +{ + bool changed = false; + + for (size_t g = 0; g < m->size(); ++g) + { + if (run(m->graph(g))) + changed = true; + } + + return changed; +} + +bool CircleTypeInferencePass::run(loco::Graph *g) +{ + luci::tinf::Rule type_infer_rule; + bool changed = false; + + for (auto node : loco::postorder_traversal(loco::output_nodes(g))) + { + loco::DataType dtype; + auto circle_node = loco::must_cast(node); + + if (type_infer_rule.infer(circle_node, dtype) && circle_node->dtype() != dtype) + { + circle_node->dtype(dtype); + changed = true; + } + } + + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/FuseBCQPass.cpp b/compiler/luci/pass/src/FuseBCQPass.cpp index ebf2877..c0583d8 100644 --- a/compiler/luci/pass/src/FuseBCQPass.cpp +++ b/compiler/luci/pass/src/FuseBCQPass.cpp @@ -25,6 +25,85 @@ namespace { +bool is_fusable_const(luci::CircleConst *before, luci::CircleConst *after, bool do_w_x) +{ + if (after->dtype() != loco::DataType::FLOAT32) + return false; + + if (after->rank() != 2) + return false; + + if (after->size() != before->size()) + return false; + + auto after_dim0 = after->dim(0).value(); + auto after_dim1 = after->dim(1).value(); + + if (before->rank() == 2) + { + if (do_w_x) + { + // Check for [dim0, dim1] --> [dim0, dim1] + if (!(after->dim(0) == before->dim(0) && after->dim(1) == before->dim(1))) + return false; + + for (uint32_t i = 0; i < after->size(); ++i) + if (after->at(i) != before->at(i)) + return false; + } + else + { + // Check for [dim0, dim1] --> [dim1, dim0] + if (!(after->dim(0) == before->dim(1) && after->dim(1) == before->dim(0))) + return false; + + for (uint32_t i = 0; i < after_dim0; ++i) + for (uint32_t j = 0; j < after_dim1; ++j) + if (after->at(i * after_dim1 + j) != + before->at(j * after_dim0 + i)) + return false; + } + + return true; + } + else if (before->rank() == 3) + { + if (do_w_x) + { + // This case is not found yet. + return false; + } + else + { + // When Einsum op is converted to FullyConnected, original rank can be 3. + auto before_dim0 = before->dim(0).value(); + auto before_dim1 = before->dim(1).value(); + auto before_dim2 = before->dim(2).value(); + + // Check if [dim0, dim1, dim2] --> [dim2, dim0 * dim1] or + // [dim0, dim1, dim2] --> [dim1 * dim2, dim0] + if ((after_dim0 == before_dim1 * before_dim2 && after_dim1 == before_dim0) || + (after_dim0 == before_dim2 && after_dim1 == before_dim0 * before_dim1)) + { + for (uint32_t i = 0; i < after_dim0; ++i) + for (uint32_t j = 0; j < after_dim1; ++j) + if (after->at(i * after_dim1 + j) != + before->at(j * after_dim0 + i)) + return false; + } + } + + return true; + } + + return false; +} + +} // namespace + +namespace +{ + // V means the version of BCQ. template class BCQFuser; @@ -38,11 +117,9 @@ public: } public: - bool fuseBCQ(loco::Graph *g) + void register_bcq_info(loco::Graph *g) { - - const auto output_nodes = loco::output_nodes(g); - for (auto node : output_nodes) + for (auto node : loco::output_nodes(g)) { auto output_node = loco::must_cast(node); @@ -61,28 +138,29 @@ public: add_BCQ_info_node(prefix, metadata_type, circle_node); } } + } + bool fuseBCQ(loco::Graph *g) + { if (!is_bcqinfo_valid()) return false; - for (auto f : _fusable_op) + for (auto node : loco::postorder_traversal(loco::output_nodes(g))) { - auto prefix = f.first; - luci::CircleNode *node = f.second; - - if (!is_valid_prefix(prefix)) - continue; - // Fuse Gather to BCQGather if (auto gather = dynamic_cast(node)) { if (auto params = dynamic_cast(gather->params())) { + auto prefix = get_prefix_of_const(params); + if (prefix == -1 || !is_valid_prefix(prefix)) + continue; + auto bcq_gather = g->nodes()->create(); bcq_gather->op_version(1); - bcq_gather->input_scales(_alpha[prefix]); - bcq_gather->input_binary(_packed_binary_code[prefix]); + bcq_gather->input_scales(alpha(g, prefix)); + bcq_gather->input_binary(packed_binary_code(g, prefix)); bcq_gather->indices(gather->indices()); bcq_gather->input_clusters(packed_clusters(g, prefix)); @@ -122,29 +200,20 @@ public: } } - // Einsum is unpacked to FullyConnected, Pack and Reshape - if (auto reshape = dynamic_cast(node)) - { - node = dynamic_cast(reshape->tensor()); - } - if (auto pack = dynamic_cast(node)) - { - if (pack->values_count() == 1 && pack->rank() == 3) - { - node = dynamic_cast(pack->values(0)); - } - } - // Fuse FullyConnected to BCQFullyConnected if (auto fully_connected = dynamic_cast(node)) { if (auto weights = dynamic_cast(fully_connected->weights())) { + auto prefix = get_prefix_of_const(weights); + if (prefix == -1 || !is_valid_prefix(prefix)) + continue; + auto bcq_fc = g->nodes()->create(); bcq_fc->op_version(1); - bcq_fc->weights_scales(_alpha[prefix]); - bcq_fc->weights_binary(_packed_binary_code[prefix]); + bcq_fc->weights_scales(alpha(g, prefix)); + bcq_fc->weights_binary(packed_binary_code(g, prefix)); bcq_fc->bias(fully_connected->bias()); bcq_fc->weights_clusters(packed_clusters(g, prefix)); bcq_fc->fusedActivationFunction(fully_connected->fusedActivationFunction()); @@ -179,43 +248,69 @@ public: } // If x_w formation, we should insert Transpose in front and back of BCQFullyConnected - if (_do_w_x[prefix]->at(0)) - { - bcq_fc->weights_hidden_size(weights->dim(0).value()); - bcq_fc->input(bcq_input); - loco::replace(fully_connected).with(bcq_fc); - } - else - { - bcq_fc->weights_hidden_size(weights->dim(1).value()); + bcq_fc->weights_hidden_size(weights->dim(1).value()); - auto perm = g->nodes()->create(); - perm->dtype(loco::DataType::S32); - perm->size(2); - perm->rank(1); - perm->dim(0) = 2; - perm->at(0) = 1; - perm->at(1) = 0; - perm->shape_status(luci::ShapeStatus::VALID); + auto perm = g->nodes()->create(); + perm->dtype(loco::DataType::S32); + perm->size(2); + perm->rank(1); + perm->dim(0) = 2; + perm->at(0) = 1; + perm->at(1) = 0; + perm->shape_status(luci::ShapeStatus::VALID); - auto input_transpose = g->nodes()->create(); - input_transpose->a(bcq_input); - input_transpose->perm(perm); + auto input_transpose = g->nodes()->create(); + input_transpose->a(bcq_input); + input_transpose->perm(perm); - bcq_fc->input(input_transpose); + bcq_fc->input(input_transpose); - auto output_transpose = g->nodes()->create(); - output_transpose->a(bcq_fc); - output_transpose->perm(perm); + auto output_transpose = g->nodes()->create(); + output_transpose->a(bcq_fc); + output_transpose->perm(perm); - loco::replace(fully_connected).with(output_transpose); - } + loco::replace(fully_connected).with(output_transpose); return true; } - else + else if (auto weights_as_input = + dynamic_cast(fully_connected->input())) { - // TODO Is there any case that input() is constant, instead of weights()? + auto prefix = get_prefix_of_const(weights_as_input); + if (prefix == -1 || !is_valid_prefix(prefix)) + continue; + + assert(_do_w_x[prefix]->at(0) == true); + + auto perm = g->nodes()->create(); + perm->dtype(loco::DataType::S32); + perm->size(2); + perm->rank(1); + perm->dim(0) = 2; + perm->at(0) = 1; + perm->at(1) = 0; + perm->shape_status(luci::ShapeStatus::VALID); + + auto input_transpose = g->nodes()->create(); + input_transpose->a(fully_connected->weights()); + input_transpose->perm(perm); + + auto bcq_fc = g->nodes()->create(); + + assert(dynamic_cast(fully_connected->bias()) != nullptr); + + bcq_fc->op_version(1); + bcq_fc->weights_scales(alpha(g, prefix)); + bcq_fc->weights_binary(packed_binary_code(g, prefix)); + bcq_fc->bias(fully_connected->bias()); + bcq_fc->weights_clusters(packed_clusters(g, prefix)); + bcq_fc->fusedActivationFunction(fully_connected->fusedActivationFunction()); + + bcq_fc->weights_hidden_size(weights_as_input->dim(1).value()); + bcq_fc->input(input_transpose); + loco::replace(fully_connected).with(bcq_fc); + + return true; } } } @@ -268,6 +363,19 @@ private: _dequant_weight[prefix] = const_node; } + int32_t get_prefix_of_const(luci::CircleConst *w_after) + { + for (auto n : _fusable_op) + { + auto prefix = n.first; + auto w_before = loco::must_cast(n.second); + if (is_fusable_const(w_before, w_after, _do_w_x[prefix]->at(0))) + return prefix; + } + + return -1; + } + bool is_bcqinfo_valid() { LOGGER(l); @@ -332,6 +440,16 @@ private: } } + for (auto n : _fusable_op) + { + // fusable_op should be FLOAT32 type + if (n.second->dtype() != loco::DataType::FLOAT32) + { + WARN(l) << "FuseBCQPass : fusable_op has wrong type" << std::endl; + return false; + } + } + // As dequant_weight is not used for fusing, skip validation. return true; @@ -377,12 +495,50 @@ private: return false; } + if (_fusable_op.find(prefix) == _fusable_op.end()) + { + WARN(l) << "fusable_op is not found" << std::endl; + return false; + } + // As dequant_weight is not used for fusing, skip validation. return true; } private: + luci::CircleConst *alpha(loco::Graph *graph, int32_t prefix) + { + auto new_alpha = graph->nodes()->create(); + + new_alpha->dtype(loco::DataType::FLOAT32); + new_alpha->size(_alpha[prefix]->size()); + new_alpha->rank(1); + new_alpha->dim(0) = _alpha[prefix]->dim(0); + for (uint32_t i = 0; i < _alpha[prefix]->size(); ++i) + new_alpha->at(i) = _alpha[prefix]->at(i); + new_alpha->shape_status(luci::ShapeStatus::VALID); + + return new_alpha; + } + + luci::CircleConst *packed_binary_code(loco::Graph *graph, int32_t prefix) + { + auto new_beta = graph->nodes()->create(); + + new_beta->dtype(loco::DataType::S32); + new_beta->size(_packed_binary_code[prefix]->size()); + new_beta->rank(2); + new_beta->dim(0) = _packed_binary_code[prefix]->dim(0); + new_beta->dim(1) = _packed_binary_code[prefix]->dim(1); + for (uint32_t i = 0; i < _packed_binary_code[prefix]->size(); ++i) + new_beta->at(i) = + _packed_binary_code[prefix]->at(i); + new_beta->shape_status(luci::ShapeStatus::VALID); + + return new_beta; + } + luci::CircleConst *packed_clusters(loco::Graph *graph, int32_t prefix) { auto qbits_of_clusters = _qbits_of_clusters[prefix]; @@ -428,15 +584,17 @@ private: namespace luci { -bool FuseBCQPass::run(loco::Graph *g) +bool FuseBCQPass::run(luci::Module *m) { bool changed = false; const int32_t start_magicnum = -2e9 + 27; const int32_t end_magicnum = 2e9 - 27; + loco::Graph *main_graph = m->graph(0); + luci::CircleConst *metadata_node = nullptr; - for (auto node : loco::output_nodes(g)) + for (auto node : loco::output_nodes(main_graph)) { auto output_node = loco::must_cast(node); @@ -474,8 +632,11 @@ bool FuseBCQPass::run(loco::Graph *g) const auto bundle_cnt = metadata_node->at(3); BCQFuser<1> fuser{original_output_cnt, bundle_cnt}; - if (fuser.fuseBCQ(g)) - changed = true; + fuser.register_bcq_info(main_graph); + + for (size_t g = 0; g < m->size(); ++g) + if (fuser.fuseBCQ(m->graph(g))) + changed = true; } else { @@ -486,12 +647,12 @@ bool FuseBCQPass::run(loco::Graph *g) // Remove all of BCQ information nodes iff there is no change if (changed == false) { - for (auto node : loco::output_nodes(g)) + for (auto node : loco::output_nodes(main_graph)) { auto output_node = loco::must_cast(node); if (output_node->index() == 0 || (int)output_node->index() > original_output_cnt) { - auto noOp = g->nodes()->create(); + auto noOp = main_graph->nodes()->create(); noOp->dtype(loco::DataType::FLOAT32); // TODO Remove this setting output_node->from(noOp); changed = true; @@ -503,4 +664,10 @@ bool FuseBCQPass::run(loco::Graph *g) return changed; } +bool FuseBCQPass::run(loco::Graph *) +{ + // Do nothing for graph + return false; +} + } // namespace luci diff --git a/compiler/luci/pass/src/MigrateLegacyShapeDtypePass.cpp b/compiler/luci/pass/src/MigrateLegacyShapeDtypePass.cpp new file mode 100644 index 0000000..beb962a --- /dev/null +++ b/compiler/luci/pass/src/MigrateLegacyShapeDtypePass.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/MigrateLegacyShapeDtypePass.h" + +#include +#include + +#include + +#include + +namespace +{ + +bool has_same_shape(luci::CircleNode *node, loco::TensorShape shape) +{ + if (node->rank() != shape.rank()) + return false; + + for (uint32_t i = 0; i < shape.rank(); ++i) + if (!(node->dim(i) == shape.dim(i))) + return false; + + return true; +} + +} // namespace + +namespace luci +{ + +bool MigrateLegacyShapeDtypePass::run(luci::Module *m) +{ + bool changed = false; + + for (size_t g = 0; g < m->size(); ++g) + { + if (run(m->graph(g))) + changed = true; + } + + return changed; +} + +bool MigrateLegacyShapeDtypePass::run(loco::Graph *g) +{ + bool changed = false; + + for (auto node : loco::all_nodes(g)) + { + auto circle_node = loco::must_cast(node); + if (loco::shape_known(node)) + { + auto loco_shape = loco::shape_get(node).as(); + + assert(circle_node->shape_signature().rank() == 0 || + circle_node->shape_signature().rank() == loco_shape.rank()); + + // When shape of loco is copied to circle node, ShapeSignature should be applied. + loco::TensorShape new_shape; + new_shape.rank(loco_shape.rank()); + for (uint32_t i = 0; i < loco_shape.rank(); ++i) + { + if (circle_node->shape_signature().rank() > 0 && + circle_node->shape_signature().dim(i) == -1) + new_shape.dim(i) = 1; + else + new_shape.dim(i) = loco_shape.dim(i); + } + + if (circle_node->shape_status() == luci::ShapeStatus::UNDEFINED || + !has_same_shape(circle_node, new_shape)) + { + circle_node->rank(new_shape.rank()); + for (uint32_t i = 0; i < new_shape.rank(); ++i) + circle_node->dim(i) = new_shape.dim(i); + + if (circle_node->shape_status() == luci::ShapeStatus::UNDEFINED) + circle_node->shape_status(luci::ShapeStatus::VALID); + + changed = true; + } + } + + if (loco::dtype_known(node)) + { + if (loco::dtype_get(node) != circle_node->dtype()) + { + circle_node->dtype(loco::dtype_get(node)); + changed = true; + } + } + } + + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/ModulePhase.cpp b/compiler/luci/pass/src/ModulePhase.cpp new file mode 100644 index 0000000..46819a0 --- /dev/null +++ b/compiler/luci/pass/src/ModulePhase.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ModulePhase.h" + +namespace luci +{ + +void PhaseRunner::run(const Phase &phase) const +{ + notifyPhaseBegin(); + + for (bool changed = true; changed;) + { + changed = false; + + for (auto &pass : phase) + { + notifyPassBegin(pass.get()); + + bool pass_changed = pass->run(_module); + changed = changed || pass_changed; + + notifyPassEnd(pass.get(), pass_changed); + } + } + + notifyPhaseEnd(); +} + +void PhaseRunner::run(const Phase &phase) const +{ + notifyPhaseBegin(); + + for (bool changed = true; changed;) + { + changed = false; + + for (auto &pass : phase) + { + notifyPassBegin(pass.get()); + + bool pass_changed = pass->run(_module); + changed = changed || pass_changed; + + notifyPassEnd(pass.get(), pass_changed); + + if (changed) + { + break; + } + } + } + + notifyPhaseEnd(); +} + +} // namespace luci diff --git a/compiler/luci/pass/src/ModulePhase.h b/compiler/luci/pass/src/ModulePhase.h new file mode 100644 index 0000000..05966cc --- /dev/null +++ b/compiler/luci/pass/src/ModulePhase.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MODULE_PHASE_H__ +#define __MODULE_PHASE_H__ + +#include + +#include + +#include + +namespace luci +{ + +using Phase = std::vector>; + +template class PhaseRunner; + +template <> +class PhaseRunner final : public logo::PhaseRunnerMixinObservable +{ +public: + PhaseRunner(luci::Module *module) : _module{module} + { + // DO NOTHING + } + +public: + void run(const Phase &) const; + +private: + luci::Module *_module; +}; + +template <> +class PhaseRunner final : public logo::PhaseRunnerMixinObservable +{ +public: + PhaseRunner(luci::Module *module) : _module{module} + { + // DO NOTHING + } + +public: + void run(const Phase &) const; + +private: + luci::Module *_module; +}; + +} // namespace luci + +#endif // __MODULE_PHASE_H__ diff --git a/compiler/luci/pass/src/ProgressReporter.cpp b/compiler/luci/pass/src/ProgressReporter.cpp index dcf47ab..515739d 100644 --- a/compiler/luci/pass/src/ProgressReporter.cpp +++ b/compiler/luci/pass/src/ProgressReporter.cpp @@ -81,4 +81,46 @@ void ProgressReporter::notify(const logo::PhaseEventInfo *) +{ + LOGGER(prime); + + INFO(prime) << "=============================================================="; + INFO(prime) << "ModulePhaseRunner<" << to_str(strategy()) << ">"; + INFO(prime) << "Initial graphs"; + for (size_t g = 0; g < module()->size(); ++g) + { + INFO(prime) << "graphs #" << g; + INFO(prime) << luci::fmt(module()->graph(g)); + } +} + +void ModuleProgressReporter::notify(const logo::PhaseEventInfo *) +{ + LOGGER(prime); + + INFO(prime) << "ModulePhaseRunner<" << to_str(strategy()) << "> - done"; +} + +void ModuleProgressReporter::notify(const logo::PhaseEventInfo *info) +{ + LOGGER(prime); + + INFO(prime) << "--------------------------------------------------------------"; + INFO(prime) << "Before " << logo::pass_name(info->pass()); +} + +void ModuleProgressReporter::notify(const logo::PhaseEventInfo *info) +{ + LOGGER(prime); + + INFO(prime) << "After " << logo::pass_name(info->pass()) + << " (changed: " << to_char(info->changed()) << ")"; + for (size_t g = 0; g < module()->size(); ++g) + { + INFO(prime) << "graphs #" << g; + INFO(prime) << luci::fmt(module()->graph(g)); + } +} + } // namespace luci diff --git a/compiler/luci/pass/src/ProgressReporter.h b/compiler/luci/pass/src/ProgressReporter.h index bd2ba98..cf30da7 100644 --- a/compiler/luci/pass/src/ProgressReporter.h +++ b/compiler/luci/pass/src/ProgressReporter.h @@ -21,6 +21,8 @@ #include +#include + namespace luci { @@ -48,6 +50,30 @@ private: logo::PhaseStrategy _strategy; }; +class ModuleProgressReporter : public logo::PhaseEventListener +{ +public: + ModuleProgressReporter(luci::Module *module, logo::PhaseStrategy strategy) + : _module{module}, _strategy{strategy} + { + // DO NOTHING + } + +public: + void notify(const logo::PhaseEventInfo *) override; + void notify(const logo::PhaseEventInfo *) override; + void notify(const logo::PhaseEventInfo *) override; + void notify(const logo::PhaseEventInfo *) override; + +public: + luci::Module *module(void) const { return _module; } + logo::PhaseStrategy strategy(void) const { return _strategy; } + +private: + luci::Module *_module; + logo::PhaseStrategy _strategy; +}; + } // namespace luci #endif // __LUCI_PROGRESSREPORTER_H__ diff --git a/compiler/luci/pass/src/PropagateQuantParamPass.cpp b/compiler/luci/pass/src/PropagateQuantParamPass.cpp new file mode 100644 index 0000000..af83cd8 --- /dev/null +++ b/compiler/luci/pass/src/PropagateQuantParamPass.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/PropagateQuantParamPass.h" + +#include +#include +#include + +#include + +namespace +{ + +bool copy_qparam(luci::CircleQuantParam *src, luci::CircleQuantParam *dst) +{ + assert(src->scale.size() == dst->scale.size()); + assert(src->zerop.size() == dst->zerop.size()); + + // src and dst have the same qparam + if (std::equal(src->scale.begin(), src->scale.end(), dst->scale.begin()) && + std::equal(src->zerop.begin(), src->zerop.end(), dst->zerop.begin()) && + src->quantized_dimension == dst->quantized_dimension) + return false; + + dst->scale.assign(src->scale.begin(), src->scale.end()); + dst->zerop.assign(src->zerop.begin(), src->zerop.end()); + dst->quantized_dimension = src->quantized_dimension; + return true; +} + +bool copy_qparam(luci::CircleNode *src, luci::CircleNode *dst) +{ + // Skip nodes that do not have quantparams + auto src_qparam = src->quantparam(); + if (not src_qparam) + return false; + + auto dst_qparam = dst->quantparam(); + if (not dst_qparam) + return false; + + return copy_qparam(src_qparam, dst_qparam); +} + +// Visitor to propagate quantization parameters +struct PropagateQuantParam final : public luci::CircleNodeMutableVisitor +{ + PropagateQuantParam() = default; + + bool visit(luci::CircleNode *) { return false; } + + bool visit(luci::CircleReshape *node) + { + auto input = node->tensor(); + if (loco::succs(input).size() != 1) + return false; + + auto input_node = loco::must_cast(input); + return copy_qparam(node, input_node); + } + + // TODO : Add more Ops (e.g., Transpose) +}; + +} // namespace + +namespace luci +{ + +bool PropagateQuantParamPass::run(loco::Graph *g) +{ + bool changed = false; + LOGGER(l); + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + auto circle_node = loco::must_cast(node); + INFO(l) << "PropagateQuantParamPass visit node: " << circle_node->name() << std::endl; + + PropagateQuantParam pqp; + changed = circle_node->accept(&pqp); + if (changed) + break; + } + + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/PropagateQuantParamPass.test.cpp b/compiler/luci/pass/src/PropagateQuantParamPass.test.cpp new file mode 100644 index 0000000..15adbfc --- /dev/null +++ b/compiler/luci/pass/src/PropagateQuantParamPass.test.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/PropagateQuantParamPass.h" + +#include + +#include + +namespace +{ + +void addQuantParam(luci::CircleNode *node, const std::vector &scale, + const std::vector &zp) +{ + assert(node->quantparam() == nullptr); + + auto quantparam = std::make_unique(); + quantparam->scale = scale; + quantparam->zerop = zp; + node->quantparam(std::move(quantparam)); +} + +/** + * Simple graph for test + * + * BEFORE + * + * [Conv] (qparam 1) + * | + * [Reshape] (qparam 2) + * + * AFTER + * + * [Conv] (qparam 2) + * | + * [Reshape] (qparam 2) + * + */ +class SimpleGraph +{ +public: + SimpleGraph() + { + input = g.nodes()->create(); + conv = g.nodes()->create(); + reshape = g.nodes()->create(); + output = g.nodes()->create(); + + auto graph_input = g.inputs()->create(); + input->index(graph_input->index()); + auto graph_output = g.outputs()->create(); + output->index(graph_output->index()); + + addQuantParam(conv, {0.1, 0.2, 0.3}, {0, 10, 20}); + addQuantParam(reshape, {0.2, 0.4, 0.6}, {-10, 0, 10}); + + conv->input(input); + reshape->tensor(conv); + output->from(reshape); + } + +public: + loco::Graph g; + luci::CircleInput *input; + luci::CircleConv2D *conv; + luci::CircleReshape *reshape; + luci::CircleOutput *output; +}; + +} // namespace + +TEST(PropagateQuantParam, simple) +{ + SimpleGraph g; + + luci::PropagateQuantParamPass pass; + while (pass.run(&g.g)) + ; + + EXPECT_FLOAT_EQ(0.2, g.conv->quantparam()->scale[0]); + EXPECT_FLOAT_EQ(0.4, g.conv->quantparam()->scale[1]); + EXPECT_FLOAT_EQ(0.6, g.conv->quantparam()->scale[2]); + EXPECT_EQ(-10, g.conv->quantparam()->zerop[0]); + EXPECT_EQ(0, g.conv->quantparam()->zerop[1]); + EXPECT_EQ(10, g.conv->quantparam()->zerop[2]); +} + +TEST(PropagateQuantParam, wrong_op_NEG) +{ + SimpleGraph g; + g.output->from(g.conv); + g.reshape->drop(); + + luci::PropagateQuantParamPass pass; + while (pass.run(&g.g)) + ; + + EXPECT_FLOAT_EQ(0.1, g.conv->quantparam()->scale[0]); + EXPECT_FLOAT_EQ(0.2, g.conv->quantparam()->scale[1]); + EXPECT_FLOAT_EQ(0.3, g.conv->quantparam()->scale[2]); + EXPECT_EQ(0, g.conv->quantparam()->zerop[0]); + EXPECT_EQ(10, g.conv->quantparam()->zerop[1]); + EXPECT_EQ(20, g.conv->quantparam()->zerop[2]); +} diff --git a/compiler/luci/pass/src/QuantizeWithMinMaxPass.cpp b/compiler/luci/pass/src/QuantizeWithMinMaxPass.cpp index 0ecab00..f6eebe3 100644 --- a/compiler/luci/pass/src/QuantizeWithMinMaxPass.cpp +++ b/compiler/luci/pass/src/QuantizeWithMinMaxPass.cpp @@ -86,6 +86,100 @@ void quant_const_values(luci::CircleConst *const_node, float scaling_factor, flo } } +// Quantize const per channel +// +// The last dimension of const is the same as the dimension of channel +// And the rest of the const dimensions should be 1 +// So, a 'single value' is quantized per channel +// +// Quantization spec (f: fp value, q: quantized value) +// +// uint8 +// Positive f: f = f * (q - 0) [q = 1, scale = f, zp = 0] +// Negative f: f = (-f) * (q - 1) [q = 0, scale = -f, zp = 1] +// +// int16 +// Positive f: f = f * (q - 0) [q = 1, scale = f, zp = 0] +// Negative f: f = (-f) * (q - 0) [q = -1, scale = -f, zp = 0] +void quant_const_per_channel(CircleConst *node, loco::DataType quant_type) +{ + assert(node->dtype() == loco::DataType::FLOAT32); + assert(node->rank() > 0); + + for (uint32_t i = 0; i < node->rank() - 1; i++) + { + // Caller should call this function when the below condition is satisfied + if (node->dim(i).value() != 1) + throw std::runtime_error("Non-channel dimension of const node must be 1"); + } + + uint32_t size = node->size(); + assert(size == node->dim(node->rank() - 1).value()); + + auto quantparam = std::make_unique(); + quantparam->quantized_dimension = node->rank() - 1; + std::vector quantized_data(size); + + for (uint32_t i = 0; i < size; ++i) + { + auto data = node->at(i); + if (quant_type == loco::DataType::U8) + { + if (data >= 0) + { + quantparam->scale.push_back(data); + quantparam->zerop.push_back(0); + quantized_data[i] = 1; + } + else + { + quantparam->scale.push_back(-data); + quantparam->zerop.push_back(1); + quantized_data[i] = 0; + } + } + else if (quant_type == loco::DataType::S16) + { + if (data >= 0) + { + quantparam->scale.push_back(data); + quantized_data[i] = 1; + } + else + { + quantparam->scale.push_back(-data); + quantized_data[i] = -1; + } + quantparam->zerop.push_back(0); + } + } + node->quantparam(std::move(quantparam)); + + switch (quant_type) + { + case loco::DataType::U8: + node->dtype(loco::DataType::U8); + node->size(size); + for (uint32_t i = 0; i < size; ++i) + { + assert(quantized_data[i] == 0 || quantized_data[i] == 1); + node->at(i) = quantized_data[i]; + } + break; + case loco::DataType::S16: + node->dtype(loco::DataType::S16); + node->size(size); + for (uint32_t i = 0; i < size; ++i) + { + assert(quantized_data[i] == -1 || quantized_data[i] == 1); + node->at(i) = quantized_data[i]; + } + break; + default: + throw std::runtime_error("Unsupported data type"); + } +} + void quant_const(CircleConst *node, loco::DataType quant_type) { assert(node->dtype() == loco::DataType::FLOAT32); @@ -612,10 +706,51 @@ struct QuantizeWeights final : public luci::CircleNodeMutableVisitor } }; +void quant_instnorm(luci::CircleInstanceNorm *node, loco::DataType output_type, + QuantizationGranularity granularity) +{ + auto gamma = loco::must_cast(node->gamma()); + auto beta = loco::must_cast(node->beta()); + assert(gamma->dtype() == loco::DataType::FLOAT32); + assert(beta->dtype() == loco::DataType::FLOAT32); + + if (granularity == QuantizationGranularity::LayerWise) + { + quant_const(gamma, output_type); + quant_const(beta, output_type); + } + else if (granularity == QuantizationGranularity::ChannelWise) + { + quant_const_per_channel(gamma, output_type); + quant_const_per_channel(beta, output_type); + } + else + throw std::runtime_error("Quantization granularity must be either 'layer' or 'channel'"); +} + +void quant_prelu(luci::CirclePRelu *node, loco::DataType output_type, + QuantizationGranularity granularity) +{ + auto alpha = loco::must_cast(node->alpha()); + assert(alpha->dtype() == loco::DataType::FLOAT32); + + if (granularity == QuantizationGranularity::LayerWise) + { + quant_const(alpha, output_type); + } + else if (granularity == QuantizationGranularity::ChannelWise) + { + quant_const_per_channel(alpha, output_type); + } + else + throw std::runtime_error("Quantization granularity must be either 'layer' or 'channel'"); +} + /** * @brief Quantize const input tensors using min/max of const values */ -void quantize_const_inputs(luci::CircleNode *node, loco::DataType output_type) +void quantize_const_inputs(luci::CircleNode *node, loco::DataType output_type, + QuantizationGranularity granularity) { auto opcode = node->opcode(); auto arity = node->arity(); @@ -660,20 +795,26 @@ void quantize_const_inputs(luci::CircleNode *node, loco::DataType output_type) quant_const(const_node, output_type); break; + case luci::CircleOpcode::INSTANCE_NORM: + quant_instnorm(loco::must_cast(node), output_type, granularity); + break; + + case luci::CircleOpcode::PRELU: + quant_prelu(loco::must_cast(node), output_type, granularity); + break; + case luci::CircleOpcode::ADD: case luci::CircleOpcode::ADD_N: case luci::CircleOpcode::DIV: case luci::CircleOpcode::EQUAL: case luci::CircleOpcode::GREATER: case luci::CircleOpcode::GREATER_EQUAL: - case luci::CircleOpcode::INSTANCE_NORM: case luci::CircleOpcode::LESS: case luci::CircleOpcode::LESS_EQUAL: case luci::CircleOpcode::MAXIMUM: case luci::CircleOpcode::MINIMUM: case luci::CircleOpcode::MUL: case luci::CircleOpcode::NOT_EQUAL: - case luci::CircleOpcode::PRELU: case luci::CircleOpcode::SUB: // Quantize all const inputs using their values for (uint32_t i = 0; i < arity; i++) @@ -817,7 +958,7 @@ bool QuantizeWithMinMaxPass::run(loco::Graph *g) for (auto node : loco::active_nodes(loco::output_nodes(g))) { auto circle_node = loco::must_cast(node); - quantize_const_inputs(circle_node, _output_dtype); + quantize_const_inputs(circle_node, _output_dtype, _granularity); } // Propagate quantization parameters of concat Op diff --git a/compiler/luci/pass/src/RemoveRedundantTranspose.cpp b/compiler/luci/pass/src/RemoveRedundantTranspose.cpp new file mode 100644 index 0000000..33cb765 --- /dev/null +++ b/compiler/luci/pass/src/RemoveRedundantTranspose.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/RemoveRedundantTransposePass.h" + +#include + +namespace +{ + +/// @brief Return true if first_perm[second_perm[i]] == i +bool check_perm(const luci::CircleConst *first_perm, const luci::CircleConst *second_perm) +{ + assert(first_perm->rank() == 1); + assert(second_perm->rank() == 1); + assert(second_perm->size() == first_perm->size()); + for (int32_t i = 0; i < static_cast(first_perm->size()); i++) + { + if (first_perm->at(second_perm->at(i)) != i) + return false; + } + return true; +} + +bool remove_consecutive_transpose_function(luci::CircleNode *node) +{ + auto target_node = dynamic_cast(node); + if (target_node == nullptr) + return false; + auto pred_node = dynamic_cast(target_node->a()); + if (pred_node == nullptr) + return false; + if (loco::succs(pred_node).size() != 1) + return false; + + auto pred_perm = dynamic_cast(target_node->perm()); + if (pred_perm == nullptr) + return false; + + auto main_perm = dynamic_cast(pred_node->perm()); + if (main_perm == nullptr) + return false; + + auto main_node = loco::must_cast(pred_node->a()); + if (check_perm(pred_perm, main_perm)) + { + replace(node).with(main_node); + } + else + { + auto g = main_perm->graph(); + auto new_const_node = g->nodes()->create(); + + new_const_node->dtype(loco::DataType::S32); + new_const_node->rank(1); + new_const_node->dim(0) = main_perm->dim(0); + new_const_node->size(main_perm->dim(0).value()); + new_const_node->shape_status(luci::ShapeStatus::VALID); + for (uint32_t i = 0; i < main_perm->size(); i++) + { + new_const_node->at(i) = + pred_perm->at(main_perm->at(i)); + } + pred_node->perm(new_const_node); + replace(node).with(pred_node); + } + return true; +} + +} // namespace + +namespace luci +{ +/** + * BEFORE + * | + * [CircleNode] [CircleConst] + * (main_node) (main_perm) + * \ / + * [CircleTranspose] [CircleConst] + * (pred_node) (pred_perm) + * \ / + * [CircleTranspose] + * (target_node) + * | + * + * AFTER + * + * + * | | | + * [CircleNode] [CircleConst] | + * (main_node) (new_const_node) | + * \ / or [CircleNode] + * [CircleTranspose] (main_node) + * (pred_node) | + * | | + * + */ +bool RemoveRedundantTransposePass::run(loco::Graph *g) +{ + bool changed = false; + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + auto circle_node = loco::must_cast(node); + if (remove_consecutive_transpose_function(circle_node)) + { + changed = true; + break; + } + } + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/RemoveRedundantTranspose.test.cpp b/compiler/luci/pass/src/RemoveRedundantTranspose.test.cpp new file mode 100644 index 0000000..db608b6 --- /dev/null +++ b/compiler/luci/pass/src/RemoveRedundantTranspose.test.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "luci/Pass/RemoveRedundantTransposePass.h" + +#include + +#include + +#include + +namespace +{ + +void setValue(luci::CircleConst *node, const std::vector &v) +{ + node->dtype(loco::DataType::S32); + node->size(v.size()); + node->rank(1); + node->dim(0).set(v.size()); + for (int i = 0; i < v.size(); ++i) + { + node->at(i) = v[i]; + } +} + +/** + * Type1 + * BEFORE + * | + * [CircleNode] [CircleConst] + * \ / + * [CircleTranspose] [CircleConst] + * \ / + * [CircleTranspose] + * | + * + * AFTER + * | + * [CircleNode] + * | Remove Both + * + * -------------------------------------------- + * + * Type2 + * BEFORE + * | + * [CircleNode] [CircleConst] + * \ / + * [CircleTranspose] [CircleConst] + * \ / + * [CircleTranspose] + * | + * + * AFTER + * | | + * [CircleNode] [CircleConst] + * \ / + * [CircleTranspose] + * | + * + */ +void create_redundunt_transpose(loco::Graph *g, const std::vector &perm1, + const std::vector &perm2) +{ + assert(g); + + auto input = g->nodes()->create(); + auto graph_input = g->inputs()->create(); + input->index(graph_input->index()); + + // Create perm1 + auto perm1_node = g->nodes()->create(); + setValue(perm1_node, perm1); + + auto transpose1 = g->nodes()->create(); + transpose1->dtype(loco::DataType::FLOAT32); + transpose1->a(input); + transpose1->perm(perm1_node); + + // Create perm2 + auto perm2_node = g->nodes()->create(); + setValue(perm2_node, perm2); + + auto transpose2 = g->nodes()->create(); + transpose2->dtype(loco::DataType::FLOAT32); + transpose2->a(transpose1); + transpose2->perm(perm2_node); + + // Output + auto output = g->nodes()->create(); + output->from(transpose2); + auto graph_output = g->outputs()->create(); + output->index(graph_output->index()); +} + +} // namespace + +TEST(RemoveRedundantTransposePass, remove_consecutive_transpose_function_type1) +{ + auto graph = loco::make_graph(); + create_redundunt_transpose(graph.get(), {1, 0, 2, 3}, {1, 0, 2, 3}); + + luci::RemoveRedundantTransposePass pass; + while (pass.run(graph.get())) + ; + luci::CircleTranspose *transpose_node = nullptr; + for (auto node : loco::active_nodes(loco::output_nodes(graph.get()))) + { + auto trans = dynamic_cast(node); + if (not trans) + continue; + transpose_node = trans; + break; + } + // No transpose node is in graph. + ASSERT_EQ(nullptr, transpose_node); +} + +TEST(RemoveRedundantTransposePass, remove_consecutive_transpose_function_type2) +{ + auto graph = loco::make_graph(); + create_redundunt_transpose(graph.get(), {0, 1, 3, 2}, {1, 0, 2, 3}); + + luci::RemoveRedundantTransposePass pass; + while (pass.run(graph.get())) + ; + luci::CircleTranspose *transpose_node = nullptr; + for (auto node : loco::active_nodes(loco::output_nodes(graph.get()))) + { + auto trans = dynamic_cast(node); + if (not trans) + continue; + transpose_node = trans; + break; + } + // Just one transpose node, with updated perm constant. + ASSERT_NE(nullptr, transpose_node); + auto perm = loco::must_cast(transpose_node->perm()); + ASSERT_EQ(1, perm->at(0)); + ASSERT_EQ(0, perm->at(1)); + ASSERT_EQ(3, perm->at(2)); + ASSERT_EQ(2, perm->at(3)); +} diff --git a/compiler/luci/pass/src/ReplaceMulAddWithDepthwiseConvPass.cpp b/compiler/luci/pass/src/ReplaceMulAddWithDepthwiseConvPass.cpp new file mode 100644 index 0000000..7096c25 --- /dev/null +++ b/compiler/luci/pass/src/ReplaceMulAddWithDepthwiseConvPass.cpp @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/ReplaceMulAddWithDepthwiseConvPass.h" + +#include + +namespace +{ + +luci::CircleConst *create_weights_from_gamma(luci::CircleConst *gamma) +{ + assert(gamma->rank() == 1); + auto channel_size = gamma->dim(0).value(); + + // Channel-wise MUL is the same as DEPTHWISE_CONV2D with filter shape (1,1,1,channel_size) + auto weights = gamma->graph()->nodes()->create(); + weights->dtype(loco::DataType::FLOAT32); + weights->rank(4); + weights->dim(0).set(1); + weights->dim(1).set(1); + weights->dim(2).set(1); + weights->dim(3).set(channel_size); + weights->shape_status(luci::ShapeStatus::VALID); + weights->size(channel_size); + for (uint32_t i = 0; i < channel_size; i++) + { + weights->at(i) = gamma->at(i); + } + + return weights; +} + +luci::CircleConst *create_bias_from_beta(luci::CircleConst *beta) +{ + assert(beta->rank() == 1); + auto channel_size = beta->dim(0).value(); + + // Channel-wise ADD is the same as bias (shape = (channel_size)) of DEPTHWISE_CONV2D + auto bias = beta->graph()->nodes()->create(); + bias->dtype(loco::DataType::FLOAT32); + bias->rank(1); + bias->dim(0).set(channel_size); + bias->size(channel_size); + bias->shape_status(luci::ShapeStatus::VALID); + for (uint32_t i = 0; i < channel_size; i++) + { + bias->at(i) = beta->at(i); + } + + return bias; +} + +bool is_batchnorm_add(const luci::CircleAdd *add, luci::CircleMul *&mul, luci::CircleConst *&beta) +{ + auto x = loco::must_cast(add->x()); + auto y = loco::must_cast(add->y()); + + luci::CircleMul *pred = nullptr; + luci::CircleConst *constant = nullptr; + + if (x->opcode() == luci::CircleOpcode::CIRCLECONST && y->opcode() == luci::CircleOpcode::MUL) + { + pred = loco::must_cast(y); + constant = loco::must_cast(x); + } + else if (x->opcode() == luci::CircleOpcode::MUL && y->opcode() == luci::CircleOpcode::CIRCLECONST) + { + pred = loco::must_cast(x); + constant = loco::must_cast(y); + } + else + { + return false; + } + + if (constant->rank() != 1) + return false; + + auto channel_dim = constant->dim(0); + // Assumption: Layout is channel-last + if (!(channel_dim == add->dim(add->rank() - 1))) + return false; + + mul = pred; + beta = constant; + return true; +} + +// Check if mul is batchnorm mul +bool is_batchnorm_mul(const luci::CircleMul *mul, luci::CircleNode *&pred_node, + luci::CircleConst *&gamma) +{ + auto x = dynamic_cast(mul->x()); + auto y = dynamic_cast(mul->y()); + + luci::CircleNode *pred = nullptr; + luci::CircleConst *constant = nullptr; + + if (x != nullptr && y == nullptr) + { + pred = loco::must_cast(mul->y()); + constant = x; + } + else if (x == nullptr && y != nullptr) + { + pred = loco::must_cast(mul->x()); + constant = y; + } + else + { + return false; + } + + if (constant->rank() != 1) + return false; + + auto channel_dim = constant->dim(0); + if (!(channel_dim == mul->dim(mul->rank() - 1))) + return false; + + pred_node = pred; + gamma = constant; + return true; +} + +/** + * Replace channel-wise Mul/Add with DepthwiseConv2D + * + * BEFORE + * + * [Node] [gamma] + * | / + * [Mul] [beta] + * | / + * [Add] + * + * AFTER + * + * [Node] [weights] [bias] + * \ / / + * [DepthwiseConv2D] + */ +bool replace_mul_add_with_dwconv(luci::CircleAdd *add) +{ + luci::CircleNode *pred_node = nullptr; + luci::CircleMul *mul = nullptr; + luci::CircleConst *beta = nullptr; + luci::CircleConst *gamma = nullptr; + + if (!is_batchnorm_add(add, mul, beta)) + return false; + + if (loco::succs(mul).size() != 1) + return false; + + if (!is_batchnorm_mul(mul, pred_node, gamma)) + return false; + + if (pred_node->rank() != 4) + return false; + + if (pred_node->dtype() != loco::DataType::FLOAT32 || beta->dtype() != loco::DataType::FLOAT32 || + gamma->dtype() != loco::DataType::FLOAT32) + return false; + + auto weights = create_weights_from_gamma(gamma); + auto bias = create_bias_from_beta(beta); + + auto dwconv = add->graph()->nodes()->create(); + dwconv->input(pred_node); + dwconv->filter(weights); + dwconv->bias(bias); + dwconv->padding(luci::Padding::SAME); + dwconv->stride()->w(1); + dwconv->stride()->h(1); + dwconv->depthMultiplier(1); + dwconv->dilation()->w(1); + dwconv->dilation()->h(1); + dwconv->fusedActivationFunction(add->fusedActivationFunction()); + + loco::replace(add).with(dwconv); + return true; +} + +} // namespace + +namespace luci +{ + +bool ReplaceMulAddWithDepthwiseConvPass::run(loco::Graph *g) +{ + bool changed = false; + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + auto add = dynamic_cast(node); + if (not add) + continue; + + if (replace_mul_add_with_dwconv(add)) + { + changed = true; + break; + } + } + + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/ReplaceMulAddWithDepthwiseConvPass.test.cpp b/compiler/luci/pass/src/ReplaceMulAddWithDepthwiseConvPass.test.cpp new file mode 100644 index 0000000..a90182a --- /dev/null +++ b/compiler/luci/pass/src/ReplaceMulAddWithDepthwiseConvPass.test.cpp @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/ReplaceMulAddWithDepthwiseConvPass.h" + +#include + +#include + +namespace +{ + +/** + * Simple graph for test + * + * BEFORE + * + * [Node] [gamma] + * | / + * [Mul] [beta] + * | / + * [Add] + * + * AFTER + * + * [Node] [weights] [bias] + * \ / / + * [DepthwiseConv2D] + */ +class SimpleGraph +{ +public: + SimpleGraph() + { + input = g.nodes()->create(); + mul = g.nodes()->create(); + gamma = g.nodes()->create(); + add = g.nodes()->create(); + beta = g.nodes()->create(); + output = g.nodes()->create(); + + auto graph_input = g.inputs()->create(); + input->index(graph_input->index()); + auto graph_output = g.outputs()->create(); + output->index(graph_output->index()); + + input->dtype(loco::DataType::FLOAT32); + mul->dtype(loco::DataType::FLOAT32); + gamma->dtype(loco::DataType::FLOAT32); + add->dtype(loco::DataType::FLOAT32); + beta->dtype(loco::DataType::FLOAT32); + output->dtype(loco::DataType::FLOAT32); + + uint32_t channel_size = 16; + input->shape({1, 4, 4, channel_size}); + mul->shape({1, 4, 4, channel_size}); + gamma->shape({channel_size}); + add->shape({1, 4, 4, channel_size}); + beta->shape({channel_size}); + output->shape({1, 4, 4, channel_size}); + + gamma->size(channel_size); + beta->size(channel_size); + for (uint32_t i = 0; i < channel_size; i++) + { + gamma->at(i) = i; + beta->at(i) = i; + } + + mul->x(input); + mul->y(gamma); + add->x(mul); + add->y(beta); + output->from(add); + } + +public: + loco::Graph g; + luci::CircleInput *input = nullptr; + luci::CircleMul *mul = nullptr; + luci::CircleConst *gamma = nullptr; + luci::CircleAdd *add = nullptr; + luci::CircleConst *beta = nullptr; + luci::CircleOutput *output = nullptr; +}; + +} // namespace + +TEST(ReplaceMulAddWithDepthwiseConv, simple) +{ + SimpleGraph g; + + luci::ReplaceMulAddWithDepthwiseConvPass pass; + while (pass.run(&g.g)) + ; + + auto dwconv = dynamic_cast(g.output->from()); + EXPECT_NE(nullptr, dwconv); + + uint32_t channel_size = 16; + auto weights = dynamic_cast(dwconv->filter()); + auto bias = dynamic_cast(dwconv->bias()); + EXPECT_NE(nullptr, weights); + EXPECT_EQ(4, weights->rank()); + EXPECT_EQ(channel_size, weights->dim(3).value()); + EXPECT_NE(nullptr, bias); + EXPECT_EQ(1, bias->rank()); + EXPECT_EQ(channel_size, bias->dim(0).value()); + + for (int i = 0; i < channel_size; i++) + { + EXPECT_FLOAT_EQ(i, weights->at(i)); + EXPECT_FLOAT_EQ(i, bias->at(i)); + } +} + +TEST(ReplaceMulAddWithDepthwiseConv, wrong_op_NEG) +{ + SimpleGraph g; + // swap mul/add (changed to add->mul) + g.add->x(g.input); + loco::replace(g.add).with(g.mul); + g.mul->x(g.add); + + luci::ReplaceMulAddWithDepthwiseConvPass pass; + auto changed = pass.run(&g.g); + + EXPECT_EQ(false, changed); +} diff --git a/compiler/luci/pass/src/ShapeInferencePass.cpp b/compiler/luci/pass/src/ShapeInferencePass.cpp index f681b3d..4bd0aae 100644 --- a/compiler/luci/pass/src/ShapeInferencePass.cpp +++ b/compiler/luci/pass/src/ShapeInferencePass.cpp @@ -28,6 +28,19 @@ namespace luci { +bool ShapeInferencePass::run(luci::Module *m) +{ + bool changed = false; + + for (size_t g = 0; g < m->size(); ++g) + { + if (run(m->graph(g))) + changed = true; + } + + return changed; +} + bool ShapeInferencePass::run(loco::Graph *g) { loco::CanonicalShapeInferenceRule canonical_rule; diff --git a/compiler/luci/pass/src/ShapeSignatureInferencePass.cpp b/compiler/luci/pass/src/ShapeSignatureInferencePass.cpp new file mode 100644 index 0000000..115b77a --- /dev/null +++ b/compiler/luci/pass/src/ShapeSignatureInferencePass.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/ShapeSignatureInferencePass.h" + +#include +#include + +#include + +namespace luci +{ + +bool ShapeSignatureInferencePass::run(luci::Module *m) +{ + bool changed = false; + + for (size_t g = 0; g < m->size(); ++g) + { + if (run(m->graph(g))) + changed = true; + } + + return changed; +} + +bool ShapeSignatureInferencePass::run(loco::Graph *g) +{ + luci::ssinf::Rule signature_inference_rule; + bool changed = false; + + for (auto node : loco::postorder_traversal(loco::output_nodes(g))) + { + luci::ShapeSignature shape_signature; + + auto circle_node = loco::must_cast(node); + if (signature_inference_rule.infer(circle_node, shape_signature)) + { + if (!(circle_node->shape_signature() == shape_signature)) + { + circle_node->shape_signature(shape_signature); + changed = true; + } + } + } + + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/ShuffleWeightTo16x1Float32Pass.cpp b/compiler/luci/pass/src/ShuffleWeightTo16x1Float32Pass.cpp new file mode 100644 index 0000000..6a58f18 --- /dev/null +++ b/compiler/luci/pass/src/ShuffleWeightTo16x1Float32Pass.cpp @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/ShuffleWeightTo16x1Float32Pass.h" + +#include + +#include +#include + +namespace +{ + +bool satisfy_precondition(luci::CircleFullyConnected *fc) +{ + // check if it's already been shuffled + if (fc->weights_format() != luci::CircleFullyConnected::WeightsFormat::DEFAULT) + return false; + + // check if its data type is FLOAT32 + if (fc->dtype() != loco::DataType::FLOAT32) + return false; + + auto weights = loco::must_cast(fc->weights()); + // rank must be 2 + if (weights->rank() != 2) + return false; + + // check if it has sparsity parameter + if (weights->sparsityparam()) + return false; + + // check if the number of row of FullyConnected's weight is a multiple of 16 + const uint32_t MULTIPLE = 16; + uint32_t rows = weights->dim(0).value(); + if (rows % MULTIPLE) + return false; + + return true; +} + +// get FullyConnected op vector that has same tensor +void get_FCs_having_same_tensor(std::vector &fc_vec, loco::Graph *g, + luci::CircleFullyConnected *fc) +{ + auto the_tensor = fc->weights(); + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + auto fc = dynamic_cast(node); + if (not fc) + continue; + + if (fc->weights() == the_tensor) + fc_vec.push_back(fc); + } +} + +luci::CircleConst *shuffle_weight(luci::CircleFullyConnected *fc) +{ + auto the_weights = loco::must_cast(fc->weights()); + + // create CircleConst where shuffled data will be stored + luci::CircleConst *new_weights = fc->graph()->nodes()->create(); + new_weights->dtype(loco::DataType::FLOAT32); + new_weights->size(the_weights->size()); + new_weights->rank(the_weights->rank()); + new_weights->shape_status(the_weights->shape_status()); + for (uint32_t r = 0; r < new_weights->rank(); r++) + { + new_weights->dim(r).set(the_weights->dim(r).value()); + } + + // suffle weight + const uint32_t MULTIPLE = 16; + const uint32_t rows = the_weights->dim(0).value(); + const uint32_t cols = the_weights->dim(1).value(); + const uint32_t r_step = rows / MULTIPLE; + uint32_t index = 0; + for (uint32_t r = 0; r < r_step; r++) + { + for (uint32_t c = 0; c < cols; c++) + { + for (uint32_t i = 0; i < MULTIPLE; i++) + { + new_weights->at(index++) = + the_weights->at((r * MULTIPLE + i) * cols + c); + } + } + } + + return new_weights; +} + +} // namespace + +namespace luci +{ + +bool ShuffleWeightTo16x1Float32Pass::run(loco::Graph *g) +{ + bool changed = false; + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + auto fc = dynamic_cast(node); + if (not fc) + continue; + + if (not satisfy_precondition(fc)) + continue; + + std::vector fc_vec; + get_FCs_having_same_tensor(fc_vec, g, fc); + auto new_weights = shuffle_weight(fc); + + // replace to new weights + for (const auto fc : fc_vec) + { + fc->weights(new_weights); + fc->weights_format(luci::CircleFullyConnected::WeightsFormat::SHUFFLED16x1FLOAT32); + } + } + + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/ShuffleWeightTo16x1Float32Pass.test.cpp b/compiler/luci/pass/src/ShuffleWeightTo16x1Float32Pass.test.cpp new file mode 100644 index 0000000..9745e57 --- /dev/null +++ b/compiler/luci/pass/src/ShuffleWeightTo16x1Float32Pass.test.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/ShuffleWeightTo16x1Float32Pass.h" + +#include + +#include + +void create_fc_net(loco::Graph *g) +{ + assert(g); + + const uint32_t ROW = 16; + const uint32_t COL = 2; + const uint32_t elements_num = ROW * COL; + + // input + auto input = g->nodes()->create(); + auto graph_input = g->inputs()->create(); + input->index(graph_input->index()); + + // fc weights + auto weights = g->nodes()->create(); + weights->dtype(loco::DataType::FLOAT32); + weights->size(elements_num); + weights->rank(2); + weights->dim(0).set(ROW); + weights->dim(1).set(COL); + for (uint32_t idx = 0; idx < elements_num; idx++) + { + weights->at(idx) = idx; + } + + // fc + auto fc = g->nodes()->create(); + fc->dtype(loco::DataType::FLOAT32); + fc->input(input); + fc->weights(weights); + + // output + auto output = g->nodes()->create(); + output->from(fc); + auto graph_output = g->outputs()->create(); + output->index(graph_output->index()); +} + +TEST(ShuffleWeightTo16x1Float32PassTest, SimpleTest1) +{ + auto graph = loco::make_graph(); + create_fc_net(graph.get()); + + luci::CircleFullyConnected *fc_node = nullptr; + for (auto node : loco::active_nodes(loco::output_nodes(graph.get()))) + { + auto fc = dynamic_cast(node); + if (not fc) + continue; + + fc_node = fc; + break; + } + ASSERT_NE(fc_node, nullptr); + auto weights = loco::must_cast(fc_node->weights()); + // before + ASSERT_EQ(0, weights->at(0)); + ASSERT_EQ(1, weights->at(1)); + ASSERT_EQ(2, weights->at(2)); + ASSERT_EQ(3, weights->at(3)); + ASSERT_EQ(4, weights->at(4)); + ASSERT_EQ(5, weights->at(5)); + ASSERT_EQ(6, weights->at(6)); + ASSERT_EQ(7, weights->at(7)); + ASSERT_EQ(8, weights->at(8)); + ASSERT_EQ(9, weights->at(9)); + ASSERT_EQ(10, weights->at(10)); + ASSERT_EQ(11, weights->at(11)); + ASSERT_EQ(12, weights->at(12)); + ASSERT_EQ(13, weights->at(13)); + ASSERT_EQ(14, weights->at(14)); + ASSERT_EQ(15, weights->at(15)); + + luci::ShuffleWeightTo16x1Float32Pass pass; + while (pass.run(graph.get())) + ; + + weights = loco::must_cast(fc_node->weights()); + // after + ASSERT_EQ(0, weights->at(0)); + ASSERT_EQ(2, weights->at(1)); + ASSERT_EQ(4, weights->at(2)); + ASSERT_EQ(6, weights->at(3)); + ASSERT_EQ(8, weights->at(4)); + ASSERT_EQ(10, weights->at(5)); + ASSERT_EQ(12, weights->at(6)); + ASSERT_EQ(14, weights->at(7)); + ASSERT_EQ(16, weights->at(8)); + ASSERT_EQ(18, weights->at(9)); + ASSERT_EQ(20, weights->at(10)); + ASSERT_EQ(22, weights->at(11)); + ASSERT_EQ(24, weights->at(12)); + ASSERT_EQ(26, weights->at(13)); + ASSERT_EQ(28, weights->at(14)); + ASSERT_EQ(30, weights->at(15)); +} diff --git a/compiler/luci/pass/src/SubstitutePackToReshapePass.cpp b/compiler/luci/pass/src/SubstitutePackToReshapePass.cpp new file mode 100644 index 0000000..44e974b --- /dev/null +++ b/compiler/luci/pass/src/SubstitutePackToReshapePass.cpp @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/SubstitutePackToReshapePass.h" + +#include + +namespace +{ + +bool substitute_pack_to_reshape(luci::CircleNode *node) +{ + auto target_node = dynamic_cast(node); + if (target_node == nullptr) + return false; + if (target_node->values_count() != 1) + return false; + auto value_node = loco::must_cast(target_node->values(0)); + if (value_node->shape_status() != luci::ShapeStatus::VALID) + return false; + int32_t axis = target_node->axis(); + if (axis < 0) + axis = axis + static_cast(value_node->rank()) + 1; + + auto graph = target_node->graph(); + auto reshape_node = graph->nodes()->create(); + reshape_node->tensor(value_node); + + auto const_node = graph->nodes()->create(); + const_node->dtype(loco::DataType::S32); + const_node->size(value_node->rank() + 1); + const_node->shape_status(luci::ShapeStatus::VALID); + const_node->rank(1); + const_node->dim(0).set(value_node->rank() + 1); + for (int32_t i = 0; i < static_cast(value_node->rank()) + 1; i++) + { + if (i == axis) + { + const_node->at(i) = 1; + } + else if (i < axis) + { + const_node->at(i) = value_node->dim(i).value(); + } + else + { + const_node->at(i) = value_node->dim(i - 1).value(); + } + } + reshape_node->shape(const_node); + replace(target_node).with(reshape_node); + return true; +} + +} // namespace + +namespace luci +{ + +/** + * BEFORE + * | + * [CircleNode] + * | + * [CirclePack] + * | + * [CircleNode] + * | + * + * AFTER + * | + * [CircleNode] [CircleConst] + * \ / + * [CircleReshape] + * | + * [CircleNode] + * | + * + */ +bool SubstitutePackToReshapePass::run(loco::Graph *g) +{ + bool changed = false; + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + auto circle_node = loco::must_cast(node); + if (substitute_pack_to_reshape(circle_node)) + { + changed = true; + } + } + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/SubstitutePackToReshapePass.test.cpp b/compiler/luci/pass/src/SubstitutePackToReshapePass.test.cpp new file mode 100644 index 0000000..143b888 --- /dev/null +++ b/compiler/luci/pass/src/SubstitutePackToReshapePass.test.cpp @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "luci/Pass/SubstitutePackToReshapePass.h" + +#include + +#include + +namespace +{ + +/** + * BEFORE + * | + * [CircleNode] + * | + * [CirclePack] + * | + * [CircleNode] + * | + * + * AFTER + * | + * [CircleNode] [CircleConst] + * \ / + * [CircleReshape] + * | + * [CircleNode] + * | + * + */ +void create_substitute_pack_to_reshape(loco::Graph *g, const std::initializer_list shape, + int32_t axis) +{ + assert(g); + + // Input Create. + auto input = g->nodes()->create(); + auto graph_input = g->inputs()->create(); + input->index(graph_input->index()); + input->shape_status(luci::ShapeStatus::VALID); + input->rank(shape.size()); + input->shape(shape); + + // Pack Node create. + auto pack = g->nodes()->create(1); + pack->values(0, input); + pack->axis(axis); + + // Output Connect. + auto output = g->nodes()->create(); + output->from(pack); + auto graph_output = g->outputs()->create(); + output->index(graph_output->index()); + + return; +} + +} // namespace + +TEST(SubstitutePackToReshapePass, simple_case) +{ + auto graph = loco::make_graph(); + create_substitute_pack_to_reshape(graph.get(), {1, 2, 3, 4}, 0); + luci::SubstitutePackToReshapePass pass; + while (pass.run(graph.get())) + ; + luci::CircleReshape *reshape_node = nullptr; + luci::CirclePack *pack_node = nullptr; + for (auto node : loco::active_nodes(loco::output_nodes(graph.get()))) + { + if (auto reshape = dynamic_cast(node)) + reshape_node = reshape; + else if (auto pack = dynamic_cast(node)) + pack_node = pack; + } + ASSERT_NE(nullptr, reshape_node); + ASSERT_EQ(nullptr, pack_node); + auto new_shape = loco::must_cast(reshape_node->shape()); + ASSERT_EQ(1, new_shape->at(0)); + ASSERT_EQ(1, new_shape->at(1)); + ASSERT_EQ(2, new_shape->at(2)); + ASSERT_EQ(3, new_shape->at(3)); + ASSERT_EQ(4, new_shape->at(4)); +} + +TEST(SubstitutePackToReshapePass, simple_case_neg_axis) +{ + auto graph = loco::make_graph(); + create_substitute_pack_to_reshape(graph.get(), {1, 2, 3, 4}, -1); + luci::SubstitutePackToReshapePass pass; + while (pass.run(graph.get())) + ; + luci::CircleReshape *reshape_node = nullptr; + luci::CirclePack *pack_node = nullptr; + for (auto node : loco::active_nodes(loco::output_nodes(graph.get()))) + { + if (auto reshape = dynamic_cast(node)) + reshape_node = reshape; + else if (auto pack = dynamic_cast(node)) + pack_node = pack; + } + ASSERT_NE(nullptr, reshape_node); + ASSERT_EQ(nullptr, pack_node); + auto new_shape = loco::must_cast(reshape_node->shape()); + ASSERT_EQ(1, new_shape->at(0)); + ASSERT_EQ(2, new_shape->at(1)); + ASSERT_EQ(3, new_shape->at(2)); + ASSERT_EQ(4, new_shape->at(3)); + ASSERT_EQ(1, new_shape->at(4)); +} diff --git a/compiler/luci/pass/src/TypeInferencePass.cpp b/compiler/luci/pass/src/TypeInferencePass.cpp index 2c7b3a8..6374404 100644 --- a/compiler/luci/pass/src/TypeInferencePass.cpp +++ b/compiler/luci/pass/src/TypeInferencePass.cpp @@ -26,6 +26,19 @@ namespace luci { +bool TypeInferencePass::run(luci::Module *m) +{ + bool changed = false; + + for (size_t g = 0; g < m->size(); ++g) + { + if (run(m->graph(g))) + changed = true; + } + + return changed; +} + bool TypeInferencePass::run(loco::Graph *g) { loco::CanonicalTypeInferenceRule canonical_rule; diff --git a/compiler/luci/service/include/luci/Service/CircleShapeInference.h b/compiler/luci/service/include/luci/Service/CircleShapeInference.h index fb934c2..c301db5 100644 --- a/compiler/luci/service/include/luci/Service/CircleShapeInference.h +++ b/compiler/luci/service/include/luci/Service/CircleShapeInference.h @@ -21,6 +21,10 @@ #include +#include +#include +#include + namespace luci { @@ -36,6 +40,155 @@ struct ShapeInference static ShapeDescription get(loco::Node *node); }; +namespace sinf // namespace for Shape Inference +{ + +struct Rule +{ + bool infer(const luci::CircleNode *, loco::TensorShape &) const; +}; + +class Algorithm final : public luci::CircleNodeVisitor +{ +public: + // TODO Remove this when all of visit function is implemented + loco::TensorShape visit(const luci::CircleNode *node) final { return sinf::circle_shape(node); } + + // loco::TensorShape visit(const luci::CircleAbs *node) final; + // loco::TensorShape visit(const luci::CircleAdd *node) final; + // loco::TensorShape visit(const luci::CircleAddN *node) final; + // loco::TensorShape visit(const luci::CircleArgMax *node) final; + // loco::TensorShape visit(const luci::CircleArgMin *node) final; + // loco::TensorShape visit(const luci::CircleAveragePool2D *node) final; + // loco::TensorShape visit(const luci::CircleBatchMatMul *node) final; + // loco::TensorShape visit(const luci::CircleBatchToSpaceND *node) final; + // loco::TensorShape visit(const luci::CircleCast *node) final; + // loco::TensorShape visit(const luci::CircleCeil *node) final; + // loco::TensorShape visit(const luci::CircleConcatenation *node) final; + // loco::TensorShape visit(const luci::CircleConst *node) final; + // loco::TensorShape visit(const luci::CircleConv2D *node) final; + // loco::TensorShape visit(const luci::CircleCos *node) final; + // loco::TensorShape visit(const luci::CircleCustom *node) final; + // loco::TensorShape visit(const luci::CircleDepthToSpace *node) final; + // loco::TensorShape visit(const luci::CircleDepthwiseConv2D *node) final; + // loco::TensorShape visit(const luci::CircleDequantize *node) final; + // loco::TensorShape visit(const luci::CircleDiv *node) final; + // loco::TensorShape visit(const luci::CircleElu *node) final; + // loco::TensorShape visit(const luci::CircleEqual *node) final; + // loco::TensorShape visit(const luci::CircleExp *node) final; + // loco::TensorShape visit(const luci::CircleExpandDims *node) final; + // loco::TensorShape visit(const luci::CircleFill *node) final; + // loco::TensorShape visit(const luci::CircleFloor *node) final; + // loco::TensorShape visit(const luci::CircleFloorDiv *node) final; + // loco::TensorShape visit(const luci::CircleFloorMod *node) final; + // loco::TensorShape visit(const luci::CircleFullyConnected *node) final; + // loco::TensorShape visit(const luci::CircleGather *node) final; + // loco::TensorShape visit(const luci::CircleGatherNd *node) final; + // loco::TensorShape visit(const luci::CircleGreater *node) final; + // loco::TensorShape visit(const luci::CircleGreaterEqual *node) final; + // loco::TensorShape visit(const luci::CircleIf *node) final; + // loco::TensorShape visit(const luci::CircleL2Normalize *node) final; + // loco::TensorShape visit(const luci::CircleL2Pool2D *node) final; + // loco::TensorShape visit(const luci::CircleLeakyRelu *node) final; + // loco::TensorShape visit(const luci::CircleLess *node) final; + // loco::TensorShape visit(const luci::CircleLessEqual *node) final; + // loco::TensorShape visit(const luci::CircleLocalResponseNormalization *node) final; + // loco::TensorShape visit(const luci::CircleLog *node) final; + // loco::TensorShape visit(const luci::CircleLogicalAnd *node) final; + // loco::TensorShape visit(const luci::CircleLogicalNot *node) final; + // loco::TensorShape visit(const luci::CircleLogicalOr *node) final; + // loco::TensorShape visit(const luci::CircleLogistic *node) final; + // loco::TensorShape visit(const luci::CircleLogSoftmax *node) final; + // loco::TensorShape visit(const luci::CircleMatrixDiag *node) final; + // loco::TensorShape visit(const luci::CircleMatrixSetDiag *node) final; + // loco::TensorShape visit(const luci::CircleMaximum *node) final; + // loco::TensorShape visit(const luci::CircleMaxPool2D *node) final; + // loco::TensorShape visit(const luci::CircleMean *node) final; + // loco::TensorShape visit(const luci::CircleMinimum *node) final; + // loco::TensorShape visit(const luci::CircleMirrorPad *node) final; + // loco::TensorShape visit(const luci::CircleNeg *node) final; + // loco::TensorShape visit(const luci::CircleNonMaxSuppressionV4 *node) final; + // loco::TensorShape visit(const luci::CircleNonMaxSuppressionV5 *node) final; + // loco::TensorShape visit(const luci::CircleNotEqual *node) final; + // loco::TensorShape visit(const luci::CirclePack *node) final; + // loco::TensorShape visit(const luci::CirclePad *node) final; + // loco::TensorShape visit(const luci::CirclePadV2 *node) final; + // loco::TensorShape visit(const luci::CirclePow *node) final; + // loco::TensorShape visit(const luci::CirclePRelu *node) final; + // loco::TensorShape visit(const luci::CircleRange *node) final; + // loco::TensorShape visit(const luci::CircleRank *node) final; + // loco::TensorShape visit(const luci::CircleMul *node) final; + // loco::TensorShape visit(const luci::CircleOneHot *node) final; + // loco::TensorShape visit(const luci::CircleReduceAny *node) final; + // loco::TensorShape visit(const luci::CircleReduceMax *node) final; + // loco::TensorShape visit(const luci::CircleReduceMin *node) final; + // loco::TensorShape visit(const luci::CircleReduceProd *node) final; + // loco::TensorShape visit(const luci::CircleRelu *node) final; + // loco::TensorShape visit(const luci::CircleRelu6 *node) final; + // loco::TensorShape visit(const luci::CircleReluN1To1 *node) final; + // loco::TensorShape visit(const luci::CircleReshape *node) final; + // loco::TensorShape visit(const luci::CircleResizeBilinear *node) final; + // loco::TensorShape visit(const luci::CircleResizeNearestNeighbor *node) final; + // loco::TensorShape visit(const luci::CircleReverseSequence *node) final; + // loco::TensorShape visit(const luci::CircleReverseV2 *node) final; + // loco::TensorShape visit(const luci::CircleRound *node) final; + // loco::TensorShape visit(const luci::CircleRsqrt *node) final; + // loco::TensorShape visit(const luci::CircleScatterNd *node) final; + // loco::TensorShape visit(const luci::CircleSegmentSum *node) final; + // loco::TensorShape visit(const luci::CircleSelect *node) final; + // loco::TensorShape visit(const luci::CircleSelectV2 *node) final; + // loco::TensorShape visit(const luci::CircleShape *node) final; + // loco::TensorShape visit(const luci::CircleSin *node) final; + // loco::TensorShape visit(const luci::CircleSlice *node) final; + // loco::TensorShape visit(const luci::CircleSoftmax *node) final; + // loco::TensorShape visit(const luci::CircleSpaceToBatchND *node) final; + // loco::TensorShape visit(const luci::CircleSpaceToDepth *node) final; + // loco::TensorShape visit(const luci::CircleSparseToDense *node) final; + // loco::TensorShape visit(const luci::CircleSplit *node) final; + // loco::TensorShape visit(const luci::CircleSplitV *node) final; + // loco::TensorShape visit(const luci::CircleSqrt *node) final; + // loco::TensorShape visit(const luci::CircleSquare *node) final; + // loco::TensorShape visit(const luci::CircleSquaredDifference *node) final; + // loco::TensorShape visit(const luci::CircleSqueeze *node) final; + // loco::TensorShape visit(const luci::CircleStridedSlice *node) final; + // loco::TensorShape visit(const luci::CircleSub *node) final; + // loco::TensorShape visit(const luci::CircleSum *node) final; + // loco::TensorShape visit(const luci::CircleTanh *node) final; + // loco::TensorShape visit(const luci::CircleTile *node) final; + // loco::TensorShape visit(const luci::CircleTopKV2 *node) final; + // loco::TensorShape visit(const luci::CircleTranspose *node) final; + // loco::TensorShape visit(const luci::CircleTransposeConv *node) final; + // loco::TensorShape visit(const luci::CircleUnidirectionalSequenceLSTM *node) final; + // loco::TensorShape visit(const luci::CircleUnique *node) final; + // loco::TensorShape visit(const luci::CircleUnpack *node) final; + // loco::TensorShape visit(const luci::CircleWhere *node) final; + // loco::TensorShape visit(const luci::CircleWhile *node) final; + // loco::TensorShape visit(const luci::CircleZerosLike *node) final; + + // Circle Only + // loco::TensorShape visit(const luci::CircleBCQFullyConnected *node) final; + // loco::TensorShape visit(const luci::CircleBCQGather *node) final; + // loco::TensorShape visit(const luci::CircleInstanceNorm *node) final; + + // Virtual + // loco::TensorShape visit(const luci::CircleInput *node) final; + // loco::TensorShape visit(const luci::CircleOutput *node) final; + // loco::TensorShape visit(const luci::CircleOutputDummy *node) final; + // loco::TensorShape visit(const luci::CircleOutputExclude *node) final; + // loco::TensorShape visit(const luci::CircleCustomOut *node) final; + // loco::TensorShape visit(const luci::CircleIfOut *node) final; + // loco::TensorShape visit(const luci::CircleNonMaxSuppressionV4Out *node) final; + // loco::TensorShape visit(const luci::CircleNonMaxSuppressionV5Out *node) final; + // loco::TensorShape visit(const luci::CircleSplitOut *node) final; + // loco::TensorShape visit(const luci::CircleSplitVOut *node) final; + // loco::TensorShape visit(const luci::CircleTopKV2Out *node) final; + // loco::TensorShape visit(const luci::CircleUniqueOut *node) final; + // loco::TensorShape visit(const luci::CircleUnpackOut *node) final; + // loco::TensorShape visit(const luci::CircleWhileOut *node) final; +}; + +} // namespace sinf + } // namespace luci #endif // __LUCI_CIRCLE_SHAPE_INFERENCE_H__ diff --git a/compiler/luci/service/include/luci/Service/CircleShapeInferenceHelper.h b/compiler/luci/service/include/luci/Service/CircleShapeInferenceHelper.h new file mode 100644 index 0000000..dd6a5a4 --- /dev/null +++ b/compiler/luci/service/include/luci/Service/CircleShapeInferenceHelper.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_CIRCLE_SHAPE_INFERENCE_HELPER_H__ +#define __LUCI_CIRCLE_SHAPE_INFERENCE_HELPER_H__ + +#include + +#include +#include + +namespace luci +{ +namespace sinf // Namespace for Shape Inference +{ + +// Return shape of circle node as loco::TensorShape +loco::TensorShape circle_shape(const luci::CircleNode *node); + +} // namespace sinf +} // namespace luci + +#endif // __LUCI_CIRCLE_SHAPE_INFERENCE_HELPER_H__ diff --git a/compiler/luci/service/include/luci/Service/CircleShapeSignatureInferenceRule.h b/compiler/luci/service/include/luci/Service/CircleShapeSignatureInference.h similarity index 87% rename from compiler/luci/service/include/luci/Service/CircleShapeSignatureInferenceRule.h rename to compiler/luci/service/include/luci/Service/CircleShapeSignatureInference.h index 4d1d830..f7ea89b 100644 --- a/compiler/luci/service/include/luci/Service/CircleShapeSignatureInferenceRule.h +++ b/compiler/luci/service/include/luci/Service/CircleShapeSignatureInference.h @@ -14,22 +14,26 @@ * limitations under the License. */ -#ifndef __LUCI_CIRCLE_SHAPE_SIGNATURE_INFERENCE_RULE_H__ -#define __LUCI_CIRCLE_SHAPE_SIGNATURE_INFERENCE_RULE_H__ +#ifndef __LUCI_CIRCLE_SHAPE_SIGNATURE_INFERENCE_H__ +#define __LUCI_CIRCLE_SHAPE_SIGNATURE_INFERENCE_H__ #include #include #include +#include namespace luci { -struct CircleShapeSignatureInferenceRule +namespace ssinf // namespace for Shape Signature Inference +{ + +struct Rule { bool infer(const luci::CircleNode *, ShapeSignature &) const; }; -class ShapeSignatureInferenceAlgorithm final : public luci::CircleNodeVisitor +class Algorithm final : public luci::CircleNodeVisitor { public: // TODO Remove this when visit function is implemented for all the operations. @@ -84,7 +88,7 @@ public: // ShapeSignature visit(const luci::CircleMatrixSetDiag *node) final; // ShapeSignature visit(const luci::CircleMaximum *node) final; // ShapeSignature visit(const luci::CircleMaxPool2D *node) final; - // ShapeSignature visit(const luci::CircleMean *node) final; + ShapeSignature visit(const luci::CircleMean *node) final; // ShapeSignature visit(const luci::CircleMinimum *node) final; // ShapeSignature visit(const luci::CircleMirrorPad *node) final; // ShapeSignature visit(const luci::CircleNeg *node) final; @@ -100,13 +104,13 @@ public: // ShapeSignature visit(const luci::CircleRank *node) final; // ShapeSignature visit(const luci::CircleMul *node) final; // ShapeSignature visit(const luci::CircleOneHot *node) final; - // ShapeSignature visit(const luci::CircleReduceAny *node) final; - // ShapeSignature visit(const luci::CircleReduceMax *node) final; - // ShapeSignature visit(const luci::CircleReduceMin *node) final; - // ShapeSignature visit(const luci::CircleReduceProd *node) final; - // ShapeSignature visit(const luci::CircleRelu *node) final; - // ShapeSignature visit(const luci::CircleRelu6 *node) final; - // ShapeSignature visit(const luci::CircleReluN1To1 *node) final; + ShapeSignature visit(const luci::CircleReduceAny *node) final; + ShapeSignature visit(const luci::CircleReduceMax *node) final; + ShapeSignature visit(const luci::CircleReduceMin *node) final; + ShapeSignature visit(const luci::CircleReduceProd *node) final; + ShapeSignature visit(const luci::CircleRelu *node) final; + ShapeSignature visit(const luci::CircleRelu6 *node) final; + ShapeSignature visit(const luci::CircleReluN1To1 *node) final; // ShapeSignature visit(const luci::CircleReshape *node) final; // ShapeSignature visit(const luci::CircleResizeBilinear *node) final; // ShapeSignature visit(const luci::CircleResizeNearestNeighbor *node) final; @@ -133,7 +137,7 @@ public: // ShapeSignature visit(const luci::CircleSqueeze *node) final; // ShapeSignature visit(const luci::CircleStridedSlice *node) final; // ShapeSignature visit(const luci::CircleSub *node) final; - // ShapeSignature visit(const luci::CircleSum *node) final; + ShapeSignature visit(const luci::CircleSum *node) final; // ShapeSignature visit(const luci::CircleTanh *node) final; // ShapeSignature visit(const luci::CircleTile *node) final; // ShapeSignature visit(const luci::CircleTopKV2 *node) final; @@ -152,10 +156,10 @@ public: // ShapeSignature visit(const luci::CircleInstanceNorm *node) final; // Virtual - // ShapeSignature visit(const luci::CircleInput *node) final; - // ShapeSignature visit(const luci::CircleOutput *node) final; - // ShapeSignature visit(const luci::CircleOutputDummy *node) final; - // ShapeSignature visit(const luci::CircleOutputExclude *node) final; + ShapeSignature visit(const luci::CircleInput *node) final; + ShapeSignature visit(const luci::CircleOutput *node) final; + ShapeSignature visit(const luci::CircleOutputDummy *node) final; + ShapeSignature visit(const luci::CircleOutputExclude *node) final; // ShapeSignature visit(const luci::CircleCustomOut *node) final; // ShapeSignature visit(const luci::CircleIfOut *node) final; // ShapeSignature visit(const luci::CircleNonMaxSuppressionV4Out *node) final; @@ -168,6 +172,8 @@ public: // ShapeSignature visit(const luci::CircleWhileOut *node) final; }; +} // namespace ssinf + } // namespace luci -#endif // __LUCI_CIRCLE_SHAPE_SIGNATURE_INFERENCE_RULE_H__ +#endif // __LUCI_CIRCLE_SHAPE_SIGNATURE_INFERENCE_H__ diff --git a/compiler/luci/service/include/luci/Service/CircleShapeSignatureInferenceHelper.h b/compiler/luci/service/include/luci/Service/CircleShapeSignatureInferenceHelper.h new file mode 100644 index 0000000..fb5b3b3 --- /dev/null +++ b/compiler/luci/service/include/luci/Service/CircleShapeSignatureInferenceHelper.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_CIRCLE_SHAPE_SIGNATURE_INFERENCE_HELPER_H__ +#define __LUCI_CIRCLE_SHAPE_SIGNATURE_INFERENCE_HELPER_H__ + +#include +#include + +namespace luci +{ + +namespace ssinf // Namespace for Shape Signature Inference +{ + +// Return empty signature if all of dimensions are known. +// If at least one of dimensions is unknown, return signature without change. +ShapeSignature legalized_signature(const luci::ShapeSignature &signature); + +// Return reduced input_signature with indices and keep_dims. +// - indices : reduction index +// - keep_dims : If true, rank is not changed. If false, rank is reduced along indices. +ShapeSignature reduced_signature(const loco::Node *node, const loco::Node *indices, bool keep_dims); + +// Return signature of index-th argument of node. +ShapeSignature input_arg_signature(const luci::CircleNode *node, uint32_t index); + +} // namespace ssinf + +} // namespace luci + +#endif // __LUCI_CIRCLE_SHAPE_SIGNATURE_INFERENCE_HELPER_H__ diff --git a/compiler/luci/service/include/luci/Service/CircleTypeInference.h b/compiler/luci/service/include/luci/Service/CircleTypeInference.h index ea7a3c5..3422148 100644 --- a/compiler/luci/service/include/luci/Service/CircleTypeInference.h +++ b/compiler/luci/service/include/luci/Service/CircleTypeInference.h @@ -21,6 +21,10 @@ #include +#include +#include +#include + namespace luci { @@ -37,6 +41,155 @@ struct TypeInference static circle::TensorType get(loco::Node *node); }; +namespace tinf // namespace for Type Inference +{ + +struct Rule +{ + bool infer(const luci::CircleNode *, loco::DataType &) const; +}; + +class Algorithm final : public luci::CircleNodeVisitor +{ +public: + // TODO Remove this when all of visit function is implemented + loco::DataType visit(const luci::CircleNode *node) final { return node->dtype(); } + + // loco::DataType visit(const luci::CircleAbs *node) final; + // loco::DataType visit(const luci::CircleAdd *node) final; + // loco::DataType visit(const luci::CircleAddN *node) final; + // loco::DataType visit(const luci::CircleArgMax *node) final; + // loco::DataType visit(const luci::CircleArgMin *node) final; + // loco::DataType visit(const luci::CircleAveragePool2D *node) final; + // loco::DataType visit(const luci::CircleBatchMatMul *node) final; + // loco::DataType visit(const luci::CircleBatchToSpaceND *node) final; + // loco::DataType visit(const luci::CircleCast *node) final; + // loco::DataType visit(const luci::CircleCeil *node) final; + // loco::DataType visit(const luci::CircleConcatenation *node) final; + // loco::DataType visit(const luci::CircleConst *node) final; + // loco::DataType visit(const luci::CircleConv2D *node) final; + // loco::DataType visit(const luci::CircleCos *node) final; + // loco::DataType visit(const luci::CircleCustom *node) final; + // loco::DataType visit(const luci::CircleDepthToSpace *node) final; + // loco::DataType visit(const luci::CircleDepthwiseConv2D *node) final; + // loco::DataType visit(const luci::CircleDequantize *node) final; + // loco::DataType visit(const luci::CircleDiv *node) final; + // loco::DataType visit(const luci::CircleElu *node) final; + // loco::DataType visit(const luci::CircleEqual *node) final; + // loco::DataType visit(const luci::CircleExp *node) final; + // loco::DataType visit(const luci::CircleExpandDims *node) final; + // loco::DataType visit(const luci::CircleFill *node) final; + // loco::DataType visit(const luci::CircleFloor *node) final; + // loco::DataType visit(const luci::CircleFloorDiv *node) final; + // loco::DataType visit(const luci::CircleFloorMod *node) final; + // loco::DataType visit(const luci::CircleFullyConnected *node) final; + // loco::DataType visit(const luci::CircleGather *node) final; + // loco::DataType visit(const luci::CircleGatherNd *node) final; + // loco::DataType visit(const luci::CircleGreater *node) final; + // loco::DataType visit(const luci::CircleGreaterEqual *node) final; + // loco::DataType visit(const luci::CircleIf *node) final; + // loco::DataType visit(const luci::CircleL2Normalize *node) final; + // loco::DataType visit(const luci::CircleL2Pool2D *node) final; + // loco::DataType visit(const luci::CircleLeakyRelu *node) final; + // loco::DataType visit(const luci::CircleLess *node) final; + // loco::DataType visit(const luci::CircleLessEqual *node) final; + // loco::DataType visit(const luci::CircleLocalResponseNormalization *node) final; + // loco::DataType visit(const luci::CircleLog *node) final; + // loco::DataType visit(const luci::CircleLogicalAnd *node) final; + // loco::DataType visit(const luci::CircleLogicalNot *node) final; + // loco::DataType visit(const luci::CircleLogicalOr *node) final; + // loco::DataType visit(const luci::CircleLogistic *node) final; + // loco::DataType visit(const luci::CircleLogSoftmax *node) final; + // loco::DataType visit(const luci::CircleMatrixDiag *node) final; + // loco::DataType visit(const luci::CircleMatrixSetDiag *node) final; + // loco::DataType visit(const luci::CircleMaximum *node) final; + // loco::DataType visit(const luci::CircleMaxPool2D *node) final; + // loco::DataType visit(const luci::CircleMean *node) final; + // loco::DataType visit(const luci::CircleMinimum *node) final; + // loco::DataType visit(const luci::CircleMirrorPad *node) final; + // loco::DataType visit(const luci::CircleNeg *node) final; + // loco::DataType visit(const luci::CircleNonMaxSuppressionV4 *node) final; + // loco::DataType visit(const luci::CircleNonMaxSuppressionV5 *node) final; + // loco::DataType visit(const luci::CircleNotEqual *node) final; + // loco::DataType visit(const luci::CirclePack *node) final; + // loco::DataType visit(const luci::CirclePad *node) final; + // loco::DataType visit(const luci::CirclePadV2 *node) final; + // loco::DataType visit(const luci::CirclePow *node) final; + // loco::DataType visit(const luci::CirclePRelu *node) final; + // loco::DataType visit(const luci::CircleRange *node) final; + // loco::DataType visit(const luci::CircleRank *node) final; + // loco::DataType visit(const luci::CircleMul *node) final; + // loco::DataType visit(const luci::CircleOneHot *node) final; + // loco::DataType visit(const luci::CircleReduceAny *node) final; + // loco::DataType visit(const luci::CircleReduceMax *node) final; + // loco::DataType visit(const luci::CircleReduceMin *node) final; + // loco::DataType visit(const luci::CircleReduceProd *node) final; + // loco::DataType visit(const luci::CircleRelu *node) final; + // loco::DataType visit(const luci::CircleRelu6 *node) final; + // loco::DataType visit(const luci::CircleReluN1To1 *node) final; + // loco::DataType visit(const luci::CircleReshape *node) final; + // loco::DataType visit(const luci::CircleResizeBilinear *node) final; + // loco::DataType visit(const luci::CircleResizeNearestNeighbor *node) final; + // loco::DataType visit(const luci::CircleReverseSequence *node) final; + // loco::DataType visit(const luci::CircleReverseV2 *node) final; + // loco::DataType visit(const luci::CircleRound *node) final; + // loco::DataType visit(const luci::CircleRsqrt *node) final; + // loco::DataType visit(const luci::CircleScatterNd *node) final; + // loco::DataType visit(const luci::CircleSegmentSum *node) final; + // loco::DataType visit(const luci::CircleSelect *node) final; + // loco::DataType visit(const luci::CircleSelectV2 *node) final; + // loco::DataType visit(const luci::CircleShape *node) final; + // loco::DataType visit(const luci::CircleSin *node) final; + // loco::DataType visit(const luci::CircleSlice *node) final; + // loco::DataType visit(const luci::CircleSoftmax *node) final; + // loco::DataType visit(const luci::CircleSpaceToBatchND *node) final; + // loco::DataType visit(const luci::CircleSpaceToDepth *node) final; + // loco::DataType visit(const luci::CircleSparseToDense *node) final; + // loco::DataType visit(const luci::CircleSplit *node) final; + // loco::DataType visit(const luci::CircleSplitV *node) final; + // loco::DataType visit(const luci::CircleSqrt *node) final; + // loco::DataType visit(const luci::CircleSquare *node) final; + // loco::DataType visit(const luci::CircleSquaredDifference *node) final; + // loco::DataType visit(const luci::CircleSqueeze *node) final; + // loco::DataType visit(const luci::CircleStridedSlice *node) final; + // loco::DataType visit(const luci::CircleSub *node) final; + // loco::DataType visit(const luci::CircleSum *node) final; + // loco::DataType visit(const luci::CircleTanh *node) final; + // loco::DataType visit(const luci::CircleTile *node) final; + // loco::DataType visit(const luci::CircleTopKV2 *node) final; + // loco::DataType visit(const luci::CircleTranspose *node) final; + // loco::DataType visit(const luci::CircleTransposeConv *node) final; + // loco::DataType visit(const luci::CircleUnidirectionalSequenceLSTM *node) final; + // loco::DataType visit(const luci::CircleUnique *node) final; + // loco::DataType visit(const luci::CircleUnpack *node) final; + // loco::DataType visit(const luci::CircleWhere *node) final; + // loco::DataType visit(const luci::CircleWhile *node) final; + // loco::DataType visit(const luci::CircleZerosLike *node) final; + + // Circle Only + // loco::DataType visit(const luci::CircleBCQFullyConnected *node) final; + // loco::DataType visit(const luci::CircleBCQGather *node) final; + // loco::DataType visit(const luci::CircleInstanceNorm *node) final; + + // Virtual + // loco::DataType visit(const luci::CircleInput *node) final; + // loco::DataType visit(const luci::CircleOutput *node) final; + // loco::DataType visit(const luci::CircleOutputDummy *node) final; + // loco::DataType visit(const luci::CircleOutputExclude *node) final; + // loco::DataType visit(const luci::CircleCustomOut *node) final; + // loco::DataType visit(const luci::CircleIfOut *node) final; + // loco::DataType visit(const luci::CircleNonMaxSuppressionV4Out *node) final; + // loco::DataType visit(const luci::CircleNonMaxSuppressionV5Out *node) final; + // loco::DataType visit(const luci::CircleSplitOut *node) final; + // loco::DataType visit(const luci::CircleSplitVOut *node) final; + // loco::DataType visit(const luci::CircleTopKV2Out *node) final; + // loco::DataType visit(const luci::CircleUniqueOut *node) final; + // loco::DataType visit(const luci::CircleUnpackOut *node) final; + // loco::DataType visit(const luci::CircleWhileOut *node) final; +}; + +} // namespace tinf + } // namespace luci #endif // __LUCI_CIRCLE_TYPE_INFERENCE_H__ diff --git a/compiler/luci/service/include/luci/Service/CircleTypeInferenceHelper.h b/compiler/luci/service/include/luci/Service/CircleTypeInferenceHelper.h new file mode 100644 index 0000000..296f993 --- /dev/null +++ b/compiler/luci/service/include/luci/Service/CircleTypeInferenceHelper.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_CIRCLE_TYPE_INFERENCE_HELPER_H__ +#define __LUCI_CIRCLE_TYPE_INFERENCE_HELPER_H__ + +#include + +#include + +namespace luci +{ +namespace tinf // Namespace for Type Inference +{ + +// Helper function will be added + +} // namespace tinf +} // namespace luci + +#endif // __LUCI_CIRCLE_TYPE_INFERENCE_HELPER_H__ diff --git a/compiler/luci/service/include/luci/Service/ShapeDescription.h b/compiler/luci/service/include/luci/Service/ShapeDescription.h index 949cce5..4d92be1 100644 --- a/compiler/luci/service/include/luci/Service/ShapeDescription.h +++ b/compiler/luci/service/include/luci/Service/ShapeDescription.h @@ -20,6 +20,8 @@ #include #include +#include + #include #include @@ -33,6 +35,7 @@ struct ShapeDescription }; // TODO remove these when CircleDialect is fully functioal +ShapeDescription to_shape_description(const luci::CircleNode *node); ShapeDescription to_shape_description(const loco::TensorShape &shape); ShapeDescription to_shape_description(const loco::FeatureShape &shape); ShapeDescription to_shape_description(const loco::FilterShape &shape); diff --git a/compiler/luci/service/src/CircleShapeInference.cpp b/compiler/luci/service/src/CircleShapeInference.cpp index 0732849..db8ffd8 100644 --- a/compiler/luci/service/src/CircleShapeInference.cpp +++ b/compiler/luci/service/src/CircleShapeInference.cpp @@ -20,7 +20,10 @@ #include #include +#include + #include +#include namespace luci { @@ -32,3 +35,60 @@ ShapeDescription ShapeInference::get(loco::Node *node) } } // namespace luci + +namespace +{ + +std::ostream &operator<<(std::ostream &os, const loco::TensorShape &tensor_shape) +{ + os << "["; + for (uint32_t r = 0; r < tensor_shape.rank(); ++r) + { + if (r) + os << ","; + os << tensor_shape.dim(r).value(); + } + os << "]"; + return os; +} + +bool inputs_shape_ready(const luci::CircleNode *node) +{ + for (uint32_t arity = 0; arity < node->arity(); ++arity) + { + auto node_input = loco::must_cast(node->arg(arity)); + if (node_input->shape_status() == luci::ShapeStatus::UNDEFINED) + return false; + } + + return true; +} + +} // namespace + +namespace luci +{ +namespace sinf +{ + +bool Rule::infer(const luci::CircleNode *circle_node, loco::TensorShape &shape) const +{ + LOGGER(l); + VERBOSE(l, 1) << "[CircleShapeInference] " << circle_node->name(); + VERBOSE(l, 1) << " before: " << circle_shape(circle_node); + + if (!inputs_shape_ready(circle_node)) + { + VERBOSE(l, 1) << " after: Some inputs are not ready for inference"; + return false; + } + + Algorithm alg; + shape = circle_node->accept(&alg); + VERBOSE(l, 1) << " after: " << shape; + + return true; +} + +} // namespace ssinf +} // namespace luci diff --git a/compiler/luci/service/src/CircleShapeInferenceHelper.cpp b/compiler/luci/service/src/CircleShapeInferenceHelper.cpp new file mode 100644 index 0000000..f7eb6c3 --- /dev/null +++ b/compiler/luci/service/src/CircleShapeInferenceHelper.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Service/CircleShapeInferenceHelper.h" + +namespace luci +{ +namespace sinf +{ + +loco::TensorShape circle_shape(const luci::CircleNode *node) +{ + loco::TensorShape shape; + shape.rank(node->rank()); + for (uint32_t r = 0; r < node->rank(); ++r) + shape.dim(r) = loco::Dimension(node->dim(r).value()); + return shape; +} + +} // namespace sinf +} // namespace luci diff --git a/compiler/luci/service/src/CircleShapeInferenceRule.cpp b/compiler/luci/service/src/CircleShapeInferenceRule.cpp index a55f50b..38ff619 100644 --- a/compiler/luci/service/src/CircleShapeInferenceRule.cpp +++ b/compiler/luci/service/src/CircleShapeInferenceRule.cpp @@ -102,7 +102,7 @@ private: }; /** - * @breif Expand shape x and y to same rank by align right and filling with 1 + * @brief Expand shape x and y to same rank by align right and filling with 1 */ void expand_rank(loco::TensorShape &x, loco::TensorShape &y) { @@ -122,7 +122,7 @@ void expand_rank(loco::TensorShape &x, loco::TensorShape &y) } /** - * @breif Returns shape of expanded dimension of input x and y having same rank + * @brief Returns shape of expanded dimension of input x and y having same rank */ loco::TensorShape expand_dimension(const loco::TensorShape &x, const loco::TensorShape &y) { diff --git a/compiler/luci/service/src/CircleShapeSignatureInferenceRule.cpp b/compiler/luci/service/src/CircleShapeSignatureInference.cpp similarity index 83% rename from compiler/luci/service/src/CircleShapeSignatureInferenceRule.cpp rename to compiler/luci/service/src/CircleShapeSignatureInference.cpp index dc7df3e..1ccaa19 100644 --- a/compiler/luci/service/src/CircleShapeSignatureInferenceRule.cpp +++ b/compiler/luci/service/src/CircleShapeSignatureInference.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "luci/Service/CircleShapeSignatureInferenceRule.h" +#include "luci/Service/CircleShapeSignatureInference.h" #include @@ -39,14 +39,16 @@ std::ostream &operator<<(std::ostream &os, const luci::ShapeSignature &shape_sig namespace luci { -bool CircleShapeSignatureInferenceRule::infer(const luci::CircleNode *circle_node, - ShapeSignature &shape_signature) const +namespace ssinf +{ + +bool Rule::infer(const luci::CircleNode *circle_node, ShapeSignature &shape_signature) const { LOGGER(l); // There is nothing to check before ShapeSignatureInference. - ShapeSignatureInferenceAlgorithm alg; + Algorithm alg; shape_signature = circle_node->accept(&alg); @@ -57,4 +59,6 @@ bool CircleShapeSignatureInferenceRule::infer(const luci::CircleNode *circle_nod return true; } +} // namespace ssinf + } // namespace luci diff --git a/compiler/luci/service/src/CircleShapeSignatureInferenceHelper.cpp b/compiler/luci/service/src/CircleShapeSignatureInferenceHelper.cpp new file mode 100644 index 0000000..d7d1a24 --- /dev/null +++ b/compiler/luci/service/src/CircleShapeSignatureInferenceHelper.cpp @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Service/CircleShapeSignatureInferenceHelper.h" + +#include + +#include + +#include + +namespace luci +{ + +namespace ssinf +{ + +luci::ShapeSignature legalized_signature(const luci::ShapeSignature &signature) +{ + // If shape signature has at least one -1, it is not static. + for (uint32_t i = 0; i < signature.rank(); ++i) + if (signature.dim(i) == -1) + return signature; + + // If all dimensions are static, return empty shape signature. + return luci::ShapeSignature(); +} + +ShapeSignature reduced_signature(const loco::Node *node, const loco::Node *indices, bool keep_dims) +{ + LOGGER(l); + + ShapeSignature input_signature; + ShapeSignature output_signature; + + auto circle_node = loco::must_cast(node); + if (circle_node->shape_signature().rank() > 0) + input_signature = circle_node->shape_signature(); + else + { + input_signature.rank(circle_node->rank()); + for (uint32_t i = 0; i < circle_node->rank(); ++i) + input_signature.dim(i) = circle_node->dim(i).value(); + } + + // If input rank is 0, it means that one of following case is occurred. + // - Input is scalar : result is always scalar + // - Input shape signature is not inferenced : cannot infer output shape signauture + // Therefore, when input signature rank is 0, always return empty signature. + if (input_signature.rank() == 0) + return output_signature; + + // When reduction_indices is not constant + auto reduction_indices = dynamic_cast(indices); + if (reduction_indices == nullptr) + { + if (keep_dims) + { + // If keep_dims is true, rank is not changed. + output_signature.rank(input_signature.rank()); + for (uint32_t i = 0; i < output_signature.rank(); ++i) + output_signature.dim(i) = -1; + } + else + { + // There is no way to inference for this case. + // Do nothing to return empty signature. + INFO(l) << "[CircleShapeSignatureInferenceHelper] " << circle_node->name() << std::endl; + INFO(l) << " reduced_signature : cannot infer because of non-constant node" << std::endl; + } + + return output_signature; + } + + std::vector reduction_values; + if (reduction_indices->dtype() == loco::DataType::S32) + { + auto reduction_size = reduction_indices->size(); + for (uint32_t i = 0; i < reduction_size; ++i) + { + int32_t axis = reduction_indices->at(i); + if (axis < 0) + axis += input_signature.rank(); + + if (!(0 <= axis && axis < static_cast(input_signature.rank()))) + INTERNAL_EXN_V("Invalid reduction axis for REDUCER", oops::to_uint32(axis)); + + reduction_values.push_back(axis); + } + } + else if (reduction_indices->dtype() == loco::DataType::S64) + { + auto reduction_size = reduction_indices->size(); + for (uint32_t i = 0; i < reduction_size; ++i) + { + int32_t axis = static_cast(reduction_indices->at(i)); + if (axis < 0) + axis += input_signature.rank(); + + if (!(0 <= axis && axis < static_cast(input_signature.rank()))) + INTERNAL_EXN_V("Invalid reduction axis for REDUCER", oops::to_uint32(axis)); + + reduction_values.push_back(axis); + } + } + else + { + INTERNAL_EXN("Wrong reduction axis type, Only INT32, INT64 supported."); + } + + if (keep_dims) + { + output_signature.rank(input_signature.rank()); + for (uint32_t i = 0; i < input_signature.rank(); ++i) + output_signature.dim(i) = input_signature.dim(i); + for (uint32_t i = 0; i < reduction_values.size(); ++i) + output_signature.dim(reduction_values.at(i)) = 1; + } + else + { + std::vector check_reduce(input_signature.rank(), false); + for (uint32_t i = 0; i < reduction_values.size(); ++i) + check_reduce.at(reduction_values.at(i)) = true; + + uint32_t reduce_cnt = 0; + for (uint32_t i = 0; i < check_reduce.size(); ++i) + if (check_reduce.at(i)) + ++reduce_cnt; + + output_signature.rank(input_signature.rank() - reduce_cnt); + for (uint32_t i = 0, j = 0; i < check_reduce.size(); ++i) + if (check_reduce.at(i) == false) + output_signature.dim(j++) = input_signature.dim(i); + } + + return output_signature; +} + +ShapeSignature input_arg_signature(const luci::CircleNode *node, uint32_t index) +{ + auto circle_input = loco::must_cast(node->arg(index)); + return circle_input->shape_signature(); +} + +} // namespace ssinf + +} // namespace luci diff --git a/compiler/luci/service/src/CircleTypeInference.cpp b/compiler/luci/service/src/CircleTypeInference.cpp index aa8524a..b4755b5 100644 --- a/compiler/luci/service/src/CircleTypeInference.cpp +++ b/compiler/luci/service/src/CircleTypeInference.cpp @@ -16,6 +16,8 @@ #include "luci/Service/CircleTypeInference.h" +#include + #include #include @@ -70,3 +72,47 @@ circle::TensorType TypeInference::get(loco::Node *node) } } // namespace luci + +namespace +{ + +bool inputs_dtype_ready(const luci::CircleNode *node) +{ + for (uint32_t arity = 0; arity < node->arity(); ++arity) + { + if (node->dtype() == loco::DataType::Unknown) + return false; + } + + return true; +} + +} // namespace + +namespace luci +{ +namespace tinf +{ + +bool Rule::infer(const luci::CircleNode *circle_node, loco::DataType &dtype) const +{ + LOGGER(l); + VERBOSE(l, 1) << "[CircleTypeInference] " << circle_node->name(); + VERBOSE(l, 1) << " before: " << static_cast(circle_node->dtype()); + + if (!inputs_dtype_ready(circle_node)) + { + VERBOSE(l, 1) << " after: Some inputs are not ready for inference"; + return false; + } + + Algorithm alg; + dtype = circle_node->accept(&alg); + + VERBOSE(l, 1) << " after: " << static_cast(dtype); + + return true; +} + +} // namespace tinf +} // namespace luci diff --git a/compiler/luci/service/src/CircleTypeInferenceHelper.cpp b/compiler/luci/service/src/CircleTypeInferenceHelper.cpp new file mode 100644 index 0000000..75cd9f7 --- /dev/null +++ b/compiler/luci/service/src/CircleTypeInferenceHelper.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Service/CircleTypeInferenceHelper.h" + +namespace luci +{ +namespace tinf +{ + +// Helper function will be added + +} // namespace tinf +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleInput.cpp b/compiler/luci/service/src/Nodes/CircleInput.cpp new file mode 100644 index 0000000..24eab7b --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleInput.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleInput *node) +{ + return node->shape_signature(); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleMean.cpp b/compiler/luci/service/src/Nodes/CircleMean.cpp new file mode 100644 index 0000000..a787136 --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleMean.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleMean *node) +{ + return legalized_signature( + reduced_signature(node->input(), node->reduction_indices(), node->keep_dims())); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleOutput.cpp b/compiler/luci/service/src/Nodes/CircleOutput.cpp new file mode 100644 index 0000000..d4c8da2 --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleOutput.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleOutput *node) +{ + return input_arg_signature(node, 0); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleOutputDummy.cpp b/compiler/luci/service/src/Nodes/CircleOutputDummy.cpp new file mode 100644 index 0000000..e0f13c4 --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleOutputDummy.cpp @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleOutputDummy *) { return ShapeSignature(); } + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleOutputExclude.cpp b/compiler/luci/service/src/Nodes/CircleOutputExclude.cpp new file mode 100644 index 0000000..75bbbb3 --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleOutputExclude.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleOutputExclude *) +{ + return ShapeSignature(); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleReduceAny.cpp b/compiler/luci/service/src/Nodes/CircleReduceAny.cpp new file mode 100644 index 0000000..27da814 --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleReduceAny.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleReduceAny *node) +{ + return legalized_signature( + reduced_signature(node->input(), node->reduction_indices(), node->keep_dims())); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleReduceMax.cpp b/compiler/luci/service/src/Nodes/CircleReduceMax.cpp new file mode 100644 index 0000000..48d9cb9 --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleReduceMax.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleReduceMax *node) +{ + return legalized_signature( + reduced_signature(node->input(), node->reduction_indices(), node->keep_dims())); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleReduceMin.cpp b/compiler/luci/service/src/Nodes/CircleReduceMin.cpp new file mode 100644 index 0000000..9a99971 --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleReduceMin.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleReduceMin *node) +{ + return legalized_signature( + reduced_signature(node->input(), node->reduction_indices(), node->keep_dims())); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleReduceProd.cpp b/compiler/luci/service/src/Nodes/CircleReduceProd.cpp new file mode 100644 index 0000000..a9d381a --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleReduceProd.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleReduceProd *node) +{ + return legalized_signature( + reduced_signature(node->input(), node->reduction_indices(), node->keep_dims())); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleRelu.cpp b/compiler/luci/service/src/Nodes/CircleRelu.cpp new file mode 100644 index 0000000..a7a7f6f --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleRelu.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleRelu *node) +{ + return input_arg_signature(node, 0); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleRelu6.cpp b/compiler/luci/service/src/Nodes/CircleRelu6.cpp new file mode 100644 index 0000000..92a596d --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleRelu6.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleRelu6 *node) +{ + return input_arg_signature(node, 0); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleReluN1To1.cpp b/compiler/luci/service/src/Nodes/CircleReluN1To1.cpp new file mode 100644 index 0000000..1e8d997 --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleReluN1To1.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleReluN1To1 *node) +{ + return input_arg_signature(node, 0); +} + +} // namespace luci diff --git a/compiler/luci/service/src/Nodes/CircleSum.cpp b/compiler/luci/service/src/Nodes/CircleSum.cpp new file mode 100644 index 0000000..9ef90e8 --- /dev/null +++ b/compiler/luci/service/src/Nodes/CircleSum.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace luci +{ + +ShapeSignature ssinf::Algorithm::visit(const luci::CircleSum *node) +{ + return legalized_signature( + reduced_signature(node->input(), node->reduction_indices(), node->keep_dims())); +} + +} // namespace luci diff --git a/compiler/luci/service/src/ShapeDescription.cpp b/compiler/luci/service/src/ShapeDescription.cpp index cbc302f..01a638f 100644 --- a/compiler/luci/service/src/ShapeDescription.cpp +++ b/compiler/luci/service/src/ShapeDescription.cpp @@ -23,6 +23,19 @@ namespace luci { +ShapeDescription to_shape_description(const luci::CircleNode *circle_node) +{ + ShapeDescription res; + + res._rank_known = true; + + res._dims.resize(circle_node->rank()); + for (uint32_t i = 0; i < circle_node->rank(); ++i) + res._dims.at(i) = circle_node->dim(i).value(); + + return res; +} + ShapeDescription to_shape_description(const loco::TensorShape &shape) { ShapeDescription res; diff --git a/compiler/luci/service/src/Validate.cpp b/compiler/luci/service/src/Validate.cpp index d224fd1..3f732b6 100644 --- a/compiler/luci/service/src/Validate.cpp +++ b/compiler/luci/service/src/Validate.cpp @@ -42,6 +42,19 @@ std::ostream &operator<<(std::ostream &os, const loco::TensorShape &tensor_shape return os; } +std::ostream &operator<<(std::ostream &os, const luci::CircleNode *circle_node) +{ + os << "["; + for (uint32_t r = 0; r < circle_node->rank(); ++r) + { + if (r) + os << ","; + os << circle_node->dim(r).value(); + } + os << "]"; + return os; +} + /** * @brief returns a node that is CircleOutput with index is out_index in nodes */ @@ -80,23 +93,28 @@ bool validate_shape_dtype(loco::Graph *g) if (dynamic_cast(circle_node)) continue; - assert(loco::shape_known(circle_node)); + assert(circle_node->shape_status() != luci::ShapeStatus::UNDEFINED); // check if output node shape is same as graph output shape - auto co_tensor_shape = loco::shape_get(circle_node).as(); auto go_tensor_shape = graph_out->shape(); assert(go_tensor_shape); - if (!(co_tensor_shape == *go_tensor_shape)) + + bool is_shape_valid = (circle_node->rank() == go_tensor_shape->rank()); + for (uint32_t i = 0; is_shape_valid && i < circle_node->rank(); ++i) + if (circle_node->dim(i).value() != go_tensor_shape->dim(i).value()) + is_shape_valid = false; + + if (is_shape_valid == false) { INFO(l) << "[luci] Shape for output #" << out_index << " not same " << std::endl; - INFO(l) << "[luci] " << circle_node->name() << " " << co_tensor_shape << " vs " + INFO(l) << "[luci] " << circle_node->name() << " " << circle_node << " vs " << *go_tensor_shape << std::endl; return false; } // check if data type match - assert(loco::dtype_known(circle_node)); - if (graph_out->dtype() != loco::dtype_get(circle_node)) + assert(circle_node->dtype() != loco::DataType::Unknown); + if (graph_out->dtype() != circle_node->dtype()) { INFO(l) << "[luci] Type for output #" << out_index << " not same " << std::endl; return false; @@ -106,6 +124,55 @@ bool validate_shape_dtype(loco::Graph *g) return true; } +bool validate_shape_signature(loco::Graph *g) +{ + LOGGER(l); + + for (auto node : loco::postorder_traversal(loco::output_nodes(g))) + { + auto circle_node = loco::must_cast(node); + const auto shape_signature = circle_node->shape_signature(); + + if (shape_signature.rank() == 0) + continue; + + // Rank of shape and shape signature should be same + if (circle_node->rank() != shape_signature.rank()) + { + INFO(l) << "[luci] Rank of shape signature for " << circle_node->name() << " do not match" + << std::endl; + return false; + } + + bool has_unknown = false; + + // If shape siganture is not -1, dimension value should be same + for (uint32_t d = 0; d < shape_signature.rank(); ++d) + { + if (shape_signature.dim(d) != -1 && + shape_signature.dim(d) != (int32_t)(circle_node->dim(d).value())) + { + INFO(l) << "[luci] Dimension " << d << "of shape signature for " << circle_node->name() + << " do not match" << std::endl; + return false; + } + + if (shape_signature.dim(d) == -1) + has_unknown = true; + } + + // Shape signature should have at least one -1 value. + if (!has_unknown) + { + INFO(l) << "[luci] Shape signature in " << circle_node->name() + << " do not have unknown dimension" << std::endl; + return false; + } + } + + return true; +} + } // namespace namespace luci @@ -119,6 +186,9 @@ bool validate(loco::Graph *g) if (!validate_shape_dtype(g)) return false; + if (!validate_shape_signature(g)) + return false; + // TODO add more validation return true; diff --git a/compiler/luci/tester/src/ReadTester.cpp b/compiler/luci/tester/src/ReadTester.cpp index a1aead1..f270a23 100644 --- a/compiler/luci/tester/src/ReadTester.cpp +++ b/compiler/luci/tester/src/ReadTester.cpp @@ -21,6 +21,9 @@ #include #include +// Following passes will be removed after refactoring is finished +#include + #include #include #include @@ -95,6 +98,12 @@ int entry(int argc, char **argv) while (pass.run(graph) == true) ; } + { + // This pass will be removed after refactoring is finished + luci::MigrateLegacyShapeDtypePass pass; + while (pass.run(graph) == true) + ; + } if (!luci::validate(graph)) return 255; diff --git a/compiler/luci/tester/src/WriteTester.cpp b/compiler/luci/tester/src/WriteTester.cpp index aa7085c..9a6e8de 100644 --- a/compiler/luci/tester/src/WriteTester.cpp +++ b/compiler/luci/tester/src/WriteTester.cpp @@ -23,6 +23,9 @@ #include #include +// Following passes will be removed after refactoring is finished +#include + #include #include #include @@ -139,6 +142,12 @@ int entry(int argc, char **argv) while (pass.run(graph) == true) ; } + { + // This pass will be removed after refactoring is finished + luci::MigrateLegacyShapeDtypePass pass; + while (pass.run(graph) == true) + ; + } if (!luci::validate(graph)) return 255; diff --git a/compiler/moco/support/src/TFShapeInferenceHelper.cpp b/compiler/moco/support/src/TFShapeInferenceHelper.cpp index 13e514a..605fb9c 100644 --- a/compiler/moco/support/src/TFShapeInferenceHelper.cpp +++ b/compiler/moco/support/src/TFShapeInferenceHelper.cpp @@ -66,7 +66,7 @@ private: }; /** - * @breif Expand shape x and y to same rank by align right and filling with 1 + * @brief Expand shape x and y to same rank by align right and filling with 1 */ void expand_rank(loco::TensorShape &x, loco::TensorShape &y) { @@ -86,7 +86,7 @@ void expand_rank(loco::TensorShape &x, loco::TensorShape &y) } /** - * @breif Returns shape of expanded dimension of input x and y having same rank + * @brief Returns shape of expanded dimension of input x and y having same rank */ loco::TensorShape expand_dimension(const loco::TensorShape &x, const loco::TensorShape &y) { diff --git a/compiler/nnc/include/Definitions.h.in b/compiler/nnc/include/Definitions.h.in index 070cdd2..bd86429 100644 --- a/compiler/nnc/include/Definitions.h.in +++ b/compiler/nnc/include/Definitions.h.in @@ -7,12 +7,12 @@ */ /** - * @breif absolute path to installation directory of *nnc* project + * @brief absolute path to installation directory of *nnc* project */ #define NNC_ROOT_PATH "@NNC_INSTALL_PATH@" /** - * @breif absolute path to directory contains libraries + * @brief absolute path to directory contains libraries */ #define NNC_LIB_PATH "@NNC_INSTALL_LIB_PATH@" diff --git a/compiler/one-cmds/how-to-use-one-commands.txt b/compiler/one-cmds/how-to-use-one-commands.txt index 62a4978..d4e3269 100644 --- a/compiler/one-cmds/how-to-use-one-commands.txt +++ b/compiler/one-cmds/how-to-use-one-commands.txt @@ -161,6 +161,7 @@ Current transformation options are - make_batchnorm_gamma_positive: This makes negative gamma of batch normalization into a small positive value (1e-10). Note that this pass can change the execution result of the model. So, use it only when the impact is known to be acceptable. +- replace_cw_mul_add_with_depthwise_conv: This will replace channel-wise Mul/Add with DepthwiseConv2D. - resolve_customop_add: This will convert Custom(Add) to normal Add operator - resolve_customop_batchmatmul: This will convert Custom(BatchMatMul) to normal BatchMatMul operator diff --git a/compiler/one-cmds/one-codegen b/compiler/one-cmds/one-codegen index f2d8230..fbe3d52 100644 --- a/compiler/one-cmds/one-codegen +++ b/compiler/one-cmds/one-codegen @@ -87,24 +87,19 @@ def main(): # verify arguments _verify_arg(parser, args) - # get file path to log + # make a command to run given backend driver dir_path = os.path.dirname(os.path.realpath(__file__)) - logfile_path = os.path.realpath(args.output_path) + '.log' - - with open(logfile_path, 'wb') as f: - # make a command to run given backend driver - codegen_path = os.path.join(dir_path, getattr(args, 'backend') + '-compile') - codegen_cmd = [codegen_path] + unknown_args - - f.write((' '.join(codegen_cmd) + '\n').encode()) - - # run backend driver - with subprocess.Popen( - codegen_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, - bufsize=1) as p: - for line in p.stdout: - sys.stdout.buffer.write(line) - f.write(line) + codegen_path = os.path.join(dir_path, getattr(args, 'backend') + '-compile') + codegen_cmd = [codegen_path] + unknown_args + if _utils._is_valid_attr(args, 'command'): + codegen_cmd += getattr(args, 'command').split() + + # run backend driver + with subprocess.Popen( + codegen_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + bufsize=1) as p: + for line in p.stdout: + sys.stdout.buffer.write(line) if __name__ == '__main__': diff --git a/compiler/one-cmds/one-import-bcq b/compiler/one-cmds/one-import-bcq index 5ea1f57..50f5879 100644 --- a/compiler/one-cmds/one-import-bcq +++ b/compiler/one-cmds/one-import-bcq @@ -43,13 +43,13 @@ def _get_parser(): converter_version.add_argument( '--v1', action='store_const', - dest='converter_version', + dest='converter_version_cmd', const='--v1', help='use TensorFlow Lite Converter 1.x') converter_version.add_argument( '--v2', action='store_const', - dest='converter_version', + dest='converter_version_cmd', const='--v2', help='use TensorFlow Lite Converter 2.x') diff --git a/compiler/one-cmds/one-import-tf b/compiler/one-cmds/one-import-tf index 49009d3..3a7c69a 100644 --- a/compiler/one-cmds/one-import-tf +++ b/compiler/one-cmds/one-import-tf @@ -52,8 +52,6 @@ def _get_parser(): const='--v2', help='use TensorFlow Lite Converter 2.x') - #converter_version.set_defaults(converter_version='--v1') - parser.add_argument('--converter_version', type=str, help=argparse.SUPPRESS) # input model format diff --git a/compiler/one-cmds/one-optimize b/compiler/one-cmds/one-optimize index 4c5f109..f03bb8d 100644 --- a/compiler/one-cmds/one-optimize +++ b/compiler/one-cmds/one-optimize @@ -73,6 +73,10 @@ def _get_parser(): circle2circle_group.add_argument( '--fuse_instnorm', action='store_true', help='fuse ops to InstanceNorm operator') circle2circle_group.add_argument( + '--replace_cw_mul_add_with_depthwise_conv', + action='store_true', + help='replace channel-wise Mul/Add with DepthwiseConv2D') + circle2circle_group.add_argument( '--resolve_customop_add', action='store_true', help='convert Custom(Add) op to Add op') diff --git a/compiler/one-cmds/tests/one-build_001.cfg b/compiler/one-cmds/tests/one-build_001.cfg index 8524bbd..b022ba7 100644 --- a/compiler/one-cmds/tests/one-build_001.cfg +++ b/compiler/one-cmds/tests/one-build_001.cfg @@ -13,7 +13,7 @@ output_path=inception_v3.circle input_arrays=input input_shapes=1,299,299,3 output_arrays=InceptionV3/Predictions/Reshape_1 -v2=True +converter_version=v2 [one-optimize] input_path=inception_v3.circle diff --git a/compiler/one-cmds/tests/one-build_002.cfg b/compiler/one-cmds/tests/one-build_002.cfg index 1830776..bbf0915 100644 --- a/compiler/one-cmds/tests/one-build_002.cfg +++ b/compiler/one-cmds/tests/one-build_002.cfg @@ -13,7 +13,7 @@ output_path=inception_v3.circle input_arrays=input input_shapes=1,299,299,3 output_arrays=InceptionV3/Predictions/Reshape_1 -v2=True +converter_version=v2 [one-optimize] input_path=inception_v3.circle diff --git a/compiler/one-cmds/tests/one-build_neg_002.cfg b/compiler/one-cmds/tests/one-build_neg_002.cfg index 360c601..99db966 100644 --- a/compiler/one-cmds/tests/one-build_neg_002.cfg +++ b/compiler/one-cmds/tests/one-build_neg_002.cfg @@ -13,7 +13,7 @@ output_path=inception_v3.circle input_arrays=input input_shapes=1,299,299,3 output_arrays=InceptionV3/Predictions/Reshape_1 -v2=True +converter_version=v2 [one-optimize] input_path=inception_v3.circle diff --git a/compiler/one-cmds/tests/one-build_neg_003.cfg b/compiler/one-cmds/tests/one-build_neg_003.cfg index 91e7875..fa027cb 100644 --- a/compiler/one-cmds/tests/one-build_neg_003.cfg +++ b/compiler/one-cmds/tests/one-build_neg_003.cfg @@ -4,7 +4,7 @@ output_path=inception_v3.circle input_arrays=input input_shapes=1,299,299,3 output_arrays=InceptionV3/Predictions/Reshape_1 -v2=True +converter_version=v2 [one-optimize] input_path=inception_v3.circle diff --git a/compiler/one-cmds/tests/one-build_neg_004.cfg b/compiler/one-cmds/tests/one-build_neg_004.cfg index 4d312c4..571077b 100644 --- a/compiler/one-cmds/tests/one-build_neg_004.cfg +++ b/compiler/one-cmds/tests/one-build_neg_004.cfg @@ -13,7 +13,7 @@ output_path=inception_v3.circle input_arrays=input input_shapes=1,299,299,3 output_arrays=InceptionV3/Predictions/Reshape_1 -v2=True +converter_version=v2 [one-optimize] input_path=inception_v3.circle diff --git a/compiler/one-cmds/tests/one-import_002.cfg b/compiler/one-cmds/tests/one-import_002.cfg index 9a90abe..8d6ae2c 100644 --- a/compiler/one-cmds/tests/one-import_002.cfg +++ b/compiler/one-cmds/tests/one-import_002.cfg @@ -13,4 +13,4 @@ output_path=inception_v3.circle input_arrays=input input_shapes=1,299,299,3 output_arrays=InceptionV3/Predictions/Reshape_1 -v2=True +converter_version=v2 diff --git a/compiler/one-cmds/tests/one-import_003.cfg b/compiler/one-cmds/tests/one-import_003.cfg new file mode 100644 index 0000000..b679ebd --- /dev/null +++ b/compiler/one-cmds/tests/one-import_003.cfg @@ -0,0 +1,13 @@ +[one-build] +one-import-tf=True +one-import-tflite=False +one-import-bcq=False +one-optimize=False +one-quantize=False +one-pack=False +one-codegen=False + +[one-import-tf] +model_format=saved_model +input_path=test_saved_model +output_path=test_saved_model.circle diff --git a/compiler/one-cmds/tests/one-import_003.test b/compiler/one-cmds/tests/one-import_003.test new file mode 100644 index 0000000..6093f14 --- /dev/null +++ b/compiler/one-cmds/tests/one-import_003.test @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# import of TF 2.x saved model + +filename_ext="$(basename -- $0)" +filename="${filename_ext%.*}" + +trap_err_onexit() +{ + echo "${filename_ext} FAILED" + exit 255 +} + +trap trap_err_onexit ERR + +configfile="one-import_003.cfg" +outputfile="test_saved_model.circle" + +rm -f ${outputfile} + +# run test +one-import tf -C ${configfile} > /dev/null + +if [[ ! -s "${outputfile}" ]]; then + trap_err_onexit +fi + +echo "${filename_ext} SUCCESS" diff --git a/compiler/one-cmds/tests/one-import_004.cfg b/compiler/one-cmds/tests/one-import_004.cfg new file mode 100644 index 0000000..d28c8df --- /dev/null +++ b/compiler/one-cmds/tests/one-import_004.cfg @@ -0,0 +1,13 @@ +[one-build] +one-import-tf=True +one-import-tflite=False +one-import-bcq=False +one-optimize=False +one-quantize=False +one-pack=False +one-codegen=False + +[one-import-tf] +model_format=keras_model +input_path=test_keras_model.h5 +output_path=test_keras_model.circle diff --git a/compiler/one-cmds/tests/one-import_004.test b/compiler/one-cmds/tests/one-import_004.test new file mode 100644 index 0000000..9d10c43 --- /dev/null +++ b/compiler/one-cmds/tests/one-import_004.test @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# import of TF 2.x keras model + +filename_ext="$(basename -- $0)" +filename="${filename_ext%.*}" + +trap_err_onexit() +{ + echo "${filename_ext} FAILED" + exit 255 +} + +trap trap_err_onexit ERR + +configfile="one-import_004.cfg" +outputfile="test_keras_model.circle" + +rm -f ${outputfile} + +# run test +one-import tf -C ${configfile} > /dev/null + +if [[ ! -s "${outputfile}" ]]; then + trap_err_onexit +fi + +echo "${filename_ext} SUCCESS" diff --git a/compiler/one-cmds/tests/prepare_test_materials.sh b/compiler/one-cmds/tests/prepare_test_materials.sh index cb1067e..bc3d65d 100644 --- a/compiler/one-cmds/tests/prepare_test_materials.sh +++ b/compiler/one-cmds/tests/prepare_test_materials.sh @@ -63,6 +63,20 @@ if [[ ! -s "inception_v3_test_data.h5" ]]; then --output_path inception_v3_test_data.h5 fi +if [[ ! -d "test_saved_model" ]]; then + rm -rf test_saved_model.zip + wget https://github.com/Samsung/ONE/files/5516226/test_saved_model.zip + unzip test_saved_model.zip + # https://github.com/Samsung/ONE/issues/4268#issuecomment-724578237 +fi + +if [[ ! -s "test_keras_model.h5" ]]; then + rm -rf test_keras_model.zip + wget https://github.com/Samsung/ONE/files/5520777/test_keras_model.zip + unzip test_keras_model.zip + # https://github.com/Samsung/ONE/issues/4268#issuecomment-725025805 +fi + # prepare 'inception_v3.circle' file used for quantization test inputfile="./inception_v3.pb" outputfile="./inception_v3.circle" diff --git a/compiler/oops/include/oops/InternalExn.h b/compiler/oops/include/oops/InternalExn.h index 0e11085..e14332b 100644 --- a/compiler/oops/include/oops/InternalExn.h +++ b/compiler/oops/include/oops/InternalExn.h @@ -40,20 +40,20 @@ class InternalExn : public std::exception { public: InternalExn(const char *filename, const int line, const std::string &msg) - : _filename(filename), _line(line), _msg(msg) + : _filename(filename), _line(to_uint32(line)), _msg(msg) { construct_full_msg(); } explicit InternalExn(const char *filename, const int line, const std::string &msg, uint32_t val) - : _filename(filename), _line(line), _msg(msg + ": " + std::to_string(val)) + : _filename(filename), _line(to_uint32(line)), _msg(msg + ": " + std::to_string(val)) { construct_full_msg(); } explicit InternalExn(const char *filename, const int line, const std::string &msg, const std::string &val) - : _filename(filename), _line(line), _msg(msg + ": " + val) + : _filename(filename), _line(to_uint32(line)), _msg(msg + ": " + val) { construct_full_msg(); } diff --git a/compiler/pota-quantization-value-test/CMakeLists.txt b/compiler/pota-quantization-value-test/CMakeLists.txt index 73b9ead..80661e5 100644 --- a/compiler/pota-quantization-value-test/CMakeLists.txt +++ b/compiler/pota-quantization-value-test/CMakeLists.txt @@ -1,6 +1,12 @@ unset(QUANTIZATION_VALUE_TEST) unset(QUANTIZATION_VALUE_TEST_WITH_PARAM) +nnas_find_package(FlatBuffers QUIET) +if(NOT FlatBuffers_FOUND) + message(STATUS "Build pota-quantization-value-test: FAILED (missing FlatBuffers)") + return() +endif(NOT FlatBuffers_FOUND) + macro(addTest NAME GRANULARITY DTYPE) list(APPEND QUANTIZATION_VALUE_TEST ${NAME}) list(APPEND QUANTIZATION_VALUE_TEST_WITH_PARAM ${NAME} ${GRANULARITY} ${DTYPE}) @@ -14,8 +20,12 @@ include("test.local.lst" OPTIONAL) unset(TEST_DEPS) get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR) +get_target_property(SCHEMA_BIN_PATH mio_circle BINARY_DIR) + +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/gen_h5_explicit_inputs.py" + "${CMAKE_CURRENT_BINARY_DIR}/gen_h5_explicit_inputs.py" COPYONLY) -set(VIRTUALENV "${NNCC_OVERLAY_DIR}/venv_1_13_2") +set(VIRTUALENV "${NNCC_OVERLAY_DIR}/venv_2_3_0") ### ### Generate test.config @@ -35,7 +45,21 @@ add_custom_command( COMMENT "Generate test configuration" ) -list(APPEND TEST_DEPS "${TEST_CONFIG}") +### +### Generate python interface for circle schema +### +set(CIRCLE_SCHEMA_PYTHON_DIR "${CMAKE_CURRENT_BINARY_DIR}/circle") + +add_custom_command( + OUTPUT ${CIRCLE_SCHEMA_PYTHON_DIR} + COMMAND ${CMAKE_COMMAND} -E remove_directory "${CIRCLE_SCHEMA_PYTHON_DIR}" + COMMAND "$" --python + -o "${CMAKE_CURRENT_BINARY_DIR}" "${SCHEMA_BIN_PATH}/schema.fbs" + DEPENDS flatbuffers::flatc + COMMENT "Generate python interface for circle schema" +) + +list(APPEND TEST_DEPS "${TEST_CONFIG}" "${CIRCLE_SCHEMA_PYTHON_DIR}") # This enforces CMake to generate all the dependencies during "build" phase add_custom_target(pota_quantization_value_test_deps ALL DEPENDS ${TEST_DEPS}) diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/beta.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/beta.json new file mode 100644 index 0000000..fa2cdae --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/beta.json @@ -0,0 +1,20 @@ +{ + "weights": [ + 1, + 0, + 1, + 1 + ], + "scale": [ + 0.7023000121116638, + 0.3091999888420105, + 0.7552000284194946, + 0.2728999853134155 + ], + "zero_point": [ + 0, + 1, + 0, + 0 + ] +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/gamma.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/gamma.json new file mode 100644 index 0000000..393a44a --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/gamma.json @@ -0,0 +1,20 @@ +{ + "weights": [ + 1, + 0, + 1, + 0 + ], + "scale": [ + 0.012299999594688416, + 0.33239999413490295, + 0.23240000009536743, + 3.3359999656677246 + ], + "zero_point": [ + 0, + 1, + 0, + 1 + ] +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/ifm.json new file mode 100644 index 0000000..94c4e0f --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/ifm.json @@ -0,0 +1,4 @@ +{ + "scale": 0.003919127397239208, + "zero_point": 0.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/ofm.json new file mode 100644 index 0000000..27a1c85 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/quantization/ofm.json @@ -0,0 +1,4 @@ +{ + "scale": 0.051219820976257324, + "zero_point": 104.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/record_minmax/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/record_minmax/ifm.json new file mode 100644 index 0000000..910e855 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/record_minmax/ifm.json @@ -0,0 +1,4 @@ +{ + "min": 0.006417479291558266, + "max": 0.9993774032592774 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/record_minmax/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/record_minmax/ofm.json new file mode 100644 index 0000000..190da30 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/channel/uint8/record_minmax/ofm.json @@ -0,0 +1,4 @@ +{ + "min": -5.316554107666015, + "max": 7.744499607086182 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/beta.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/beta.json new file mode 100644 index 0000000..9dcefd5 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/beta.json @@ -0,0 +1,10 @@ +{ + "weights": [ + 242, + 0, + 255, + 139 + ], + "scale": 0.004174117464572191, + "zero_point": 74.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/gamma.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/gamma.json new file mode 100644 index 0000000..6d85a1e --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/gamma.json @@ -0,0 +1,10 @@ +{ + "weights": [ + 239, + 214, + 255, + 0 + ], + "scale": 0.013993725180625916, + "zero_point": 238.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/ifm.json new file mode 100644 index 0000000..df3df56 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/ifm.json @@ -0,0 +1,4 @@ +{ + "scale": 0.003914226312190294, + "zero_point": 0.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/ofm.json new file mode 100644 index 0000000..098816a --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/quantization/ofm.json @@ -0,0 +1,4 @@ +{ + "scale": 0.04870154336094856, + "zero_point": 122.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/record_minmax/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/record_minmax/ifm.json new file mode 100644 index 0000000..d2e7923 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/record_minmax/ifm.json @@ -0,0 +1,4 @@ +{ + "min": 0.011221568882465362, + "max": 0.9981276893615723 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/record_minmax/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/record_minmax/ofm.json new file mode 100644 index 0000000..b4ea586 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/InstanceNorm_001/layer/uint8/record_minmax/ofm.json @@ -0,0 +1,4 @@ +{ + "min": -5.94246238708496, + "max": 6.4764308166503906 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/alpha.json b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/alpha.json index 5f6db8d..6f99899 100644 --- a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/alpha.json +++ b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/alpha.json @@ -2,12 +2,20 @@ "weights": [ [ [ - 6553, - 19660, - 32767 + 1, + 1, + 1 ] ] ], - "scale": 1.5259254723787308e-05, - "zero_point": 0.0 + "scale": [ + 0.10000000149011612, + 0.30000001192092896, + 0.5 + ], + "zero_point": [ + 0, + 0, + 0 + ] } diff --git a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/ifm.json index e75377c..7d1f4c7 100644 --- a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/ifm.json +++ b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/ifm.json @@ -1,4 +1,4 @@ { - "scale": 0.0001509107678430155, + "scale": 0.00015214986342471093, "zero_point": 0.0 } diff --git a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/ofm.json index e4a89e2..533c1e3 100644 --- a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/ofm.json +++ b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/quantization/ofm.json @@ -1,4 +1,4 @@ { - "scale": 0.00015084103506524116, + "scale": 0.00015159364556893706, "zero_point": 0.0 } diff --git a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/record_minmax/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/record_minmax/ifm.json index a34d48c..edbbff9 100644 --- a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/record_minmax/ifm.json +++ b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/record_minmax/ifm.json @@ -1,4 +1,4 @@ { - "min": -4.944893226623535, - "max": 4.942608108520508 + "min": -4.985494499206543, + "max": 4.967269058227539 } diff --git a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/record_minmax/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/record_minmax/ofm.json index 640397c..954d5ef 100644 --- a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/record_minmax/ofm.json +++ b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/int16/record_minmax/ofm.json @@ -1,4 +1,4 @@ { - "min": -2.451441249847412, - "max": 4.942608108520508 + "min": -2.4895002365112306, + "max": 4.967269058227539 } diff --git a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/alpha.json b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/alpha.json new file mode 100644 index 0000000..6f99899 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/alpha.json @@ -0,0 +1,21 @@ +{ + "weights": [ + [ + [ + 1, + 1, + 1 + ] + ] + ], + "scale": [ + 0.10000000149011612, + 0.30000001192092896, + 0.5 + ], + "zero_point": [ + 0, + 0, + 0 + ] +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/ifm.json new file mode 100644 index 0000000..d661df3 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/ifm.json @@ -0,0 +1,4 @@ +{ + "scale": 0.03893596678972244, + "zero_point": 128.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/ofm.json new file mode 100644 index 0000000..6dfffd5 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/quantization/ofm.json @@ -0,0 +1,4 @@ +{ + "scale": 0.029139429330825806, + "zero_point": 85.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/record_minmax/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/record_minmax/ifm.json new file mode 100644 index 0000000..8de6b3d --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/record_minmax/ifm.json @@ -0,0 +1,4 @@ +{ + "min": -4.977406520843505, + "max": 4.951265411376953 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/record_minmax/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/record_minmax/ofm.json new file mode 100644 index 0000000..c88f6ca --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/PRelu_001/channel/uint8/record_minmax/ofm.json @@ -0,0 +1,4 @@ +{ + "min": -2.4792890548706055, + "max": 4.951265411376953 +} diff --git a/compiler/pota-quantization-value-test/gen_h5_explicit_inputs.py b/compiler/pota-quantization-value-test/gen_h5_explicit_inputs.py index 9863c80..a00cbeb 100755 --- a/compiler/pota-quantization-value-test/gen_h5_explicit_inputs.py +++ b/compiler/pota-quantization-value-test/gen_h5_explicit_inputs.py @@ -1,16 +1,17 @@ #!/usr/bin/env python3 import h5py as h5 import numpy as np -import tensorflow as tf +from circle.Model import Model +from circle.TensorType import TensorType import argparse import glob # -# This script generates a pack of random input data (.h5) expected by the input tflite model +# This script generates a pack of random input data (.h5) expected by the input circle model # # Basic usage: # gen_h5_explicit_inputs.py --model --input --output -# ex: gen_h5_explicit_inputs.py --model Add_000.tflite --input Add_000 --output Add_000.input.h5 +# ex: gen_h5_explicit_inputs.py --model Add_000.circle --input Add_000 --output Add_000.input.h5 # (This will create Add_000.input.h5) # # The input directory should be organized as follows @@ -33,15 +34,30 @@ model = args.model input = args.input output = args.output -# Build TFLite interpreter. (to get the information of model input) -interpreter = tf.lite.Interpreter(model) -input_details = interpreter.get_input_details() +with open(model, 'rb') as f: + buf = f.read() + circle_model = Model.GetRootAsModel(buf, 0) + +# Assume one subgraph +assert (circle_model.SubgraphsLength() == 1) +graph = circle_model.Subgraphs(0) +inputs = graph.InputsAsNumpy() # Create h5 file h5_file = h5.File(output, 'w') group = h5_file.create_group("value") group.attrs['desc'] = "Input data for " + model + +def toNumpyType(circle_type): + if circle_type == TensorType.UINT8: + return np.uint8 + if circle_type == TensorType.FLOAT32: + return np.float32 + if circle_type == TensorType.INT16: + return np.int16 + + # Input files records = sorted(glob.glob(input + "/*.txt")) for i, record in enumerate(records): @@ -51,9 +67,10 @@ for i, record in enumerate(records): lines = f.readlines() for j, line in enumerate(lines): data = np.array(line.split(',')) - input_detail = input_details[j] - input_data = np.array( - data.reshape(input_detail["shape"]), input_detail["dtype"]) + input_index = inputs[j] + tensor = graph.Tensors(input_index) + np_type = toNumpyType(tensor.Type()) + input_data = np.array(data.reshape(tensor.ShapeAsNumpy()), np_type) sample.create_dataset(str(j), data=input_data) h5_file.close() diff --git a/compiler/pota-quantization-value-test/test.lst b/compiler/pota-quantization-value-test/test.lst index 15606b8..dd16404 100644 --- a/compiler/pota-quantization-value-test/test.lst +++ b/compiler/pota-quantization-value-test/test.lst @@ -13,6 +13,8 @@ addTest(DepthwiseConv2D_002 layer uint8) addTest(FullyConnected_003 channel uint8) addTest(FullyConnected_003 channel int16) addTest(FullyConnected_003 layer uint8) +addTest(InstanceNorm_001 layer uint8) +addTest(InstanceNorm_001 channel uint8) addTest(Mean_000 layer uint8) addTest(Mean_000 channel int16) addTest(MaxPool2D_000 layer uint8) @@ -20,6 +22,7 @@ addTest(MaxPool2D_000 channel int16) addTest(Mul_001 layer uint8) addTest(Mul_001 channel int16) addTest(PRelu_001 layer uint8) +addTest(PRelu_001 channel uint8) addTest(PRelu_001 channel int16) addTest(ReLU_000 layer uint8) addTest(ReLU_000 channel int16) diff --git a/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/0.txt b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/0.txt new file mode 100644 index 0000000..5e926a2 --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/0.txt @@ -0,0 +1 @@ +0.15500909,0.32379007,0.12717001,0.60674316,0.07691418,0.437071 ,0.3737046 ,0.798342 ,0.65901846,0.40579247,0.15460491,0.80063623,0.591834 ,0.6617658 ,0.5617774 ,0.44884747,0.7996519 ,0.75895494,0.6239346 ,0.56500244,0.8955974 ,0.32503998,0.05756519,0.11889575,0.19635268,0.33958906,0.916527 ,0.16366032,0.51954055,0.2615102 ,0.07677322,0.6970092 ,0.27848312,0.97694606,0.73990864,0.96292055 diff --git a/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/1.txt b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/1.txt new file mode 100644 index 0000000..eb5de0c --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/1.txt @@ -0,0 +1 @@ +0.85332185,0.03102963,0.54344934,0.6300742 ,0.3323267 ,0.1701224 ,0.36199054,0.23949413,0.11960976,0.668403 ,0.7907452 ,0.4377144 ,0.87145853,0.75605077,0.37314144,0.3622036 ,0.4321453 ,0.8770253 ,0.10936793,0.0734281 ,0.2922192 ,0.5829591 ,0.5422962 ,0.84274834,0.48475483,0.23154257,0.20037153,0.27911612,0.30018023,0.23753181,0.98804647,0.61455756,0.90376633,0.8255312 ,0.21020697,0.6272272 diff --git a/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/2.txt b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/2.txt new file mode 100644 index 0000000..16561ef --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/2.txt @@ -0,0 +1 @@ +0.29736656,0.5712386 ,0.55447775,0.9014779 ,0.6208391 ,0.3413809 ,0.043885 ,0.5474101 ,0.8642339 ,0.05225753,0.36101478,0.15561381,0.776422 ,0.9997885 ,0.35188794,0.23418508,0.0882741 ,0.5797471 ,0.99945694,0.22190607,0.12337059,0.3701574 ,0.65161157,0.9830193 ,0.46270686,0.10077237,0.23681253,0.8734158 ,0.8358533 ,0.08817147,0.3845248 ,0.12799203,0.66830546,0.14838815,0.90201443,0.21123447 diff --git a/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/3.txt b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/3.txt new file mode 100644 index 0000000..deba38b --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/3.txt @@ -0,0 +1 @@ +0.92424273,0.35776526,0.0776509 ,0.93697083,0.6559925 ,0.78421926,0.7511033 ,0.71389145,0.52217877,0.41876563,0.3560251 ,0.5862293 ,0.53027606,0.32203177,0.24654935,0.55851364,0.35312092,0.38102064,0.21245371,0.87299466,0.94972914,0.54950166,0.3445233 ,0.98951054,0.37458083,0.3778964 ,0.64035404,0.10410193,0.18511558,0.1942945 ,0.07018933,0.6113747 ,0.38076922,0.08337755,0.98258 ,0.91440874 diff --git a/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/4.txt b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/4.txt new file mode 100644 index 0000000..78b783a --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/channel/uint8/4.txt @@ -0,0 +1 @@ +0.3790198 ,0.6347678 ,0.42544237,0.37033263,0.08057033,0.49041638,0.61705315,0.15411597,0.6455052 ,0.6857795 ,0.9613043 ,0.60357374,0.57679754,0.22550431,0.05105425,0.8641173 ,0.65559083,0.18274343,0.8963692 ,0.22369736,0.3133119 ,0.27507883,0.00539197,0.6846556 ,0.5969273 ,0.78488904,0.87746257,0.15459861,0.23133573,0.59048635,0.07172906,0.28935516,0.02084327,0.09926946,0.02687503,0.7306079 diff --git a/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/0.txt b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/0.txt new file mode 100644 index 0000000..25b600c --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/0.txt @@ -0,0 +1 @@ +0.641226 ,0.68639857,0.87044334,0.9448475 ,0.21544299,0.5202749 ,0.5077167 ,0.23931624,0.5712026 ,0.4167988 ,0.56711906,0.52392703,0.42762014,0.5277072 ,0.03028643,0.18017273,0.8823869 ,0.5752544 ,0.09368648,0.50277 ,0.784248 ,0.04220072,0.55217946,0.75145644,0.7957966 ,0.6563401 ,0.54975605,0.17231019,0.4219812 ,0.27839735,0.5850074 ,0.24070603,0.00957893,0.3669335 ,0.03722228,0.8705231 diff --git a/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/1.txt b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/1.txt new file mode 100644 index 0000000..caadfed --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/1.txt @@ -0,0 +1 @@ +0.76871806,0.65729177,0.946514 ,0.4308198 ,0.65200335,0.5745432 ,0.2990488 ,0.3156028 ,0.3218111 ,0.44709972,0.9411461 ,0.4828708 ,0.5707792 ,0.10645963,0.74497086,0.3563156 ,0.07986172,0.64869064,0.73329425,0.8848129 ,0.3027897 ,0.8753744 ,0.8884493 ,0.3606782 ,0.88617206,0.20232914,0.10251648,0.6366529 ,0.20422891,0.24426484,0.6952833 ,0.21889713,0.11477511,0.40650114,0.9637219 ,0.9751801 diff --git a/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/2.txt b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/2.txt new file mode 100644 index 0000000..bc4a494 --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/2.txt @@ -0,0 +1 @@ +0.5773043 ,0.6733178 ,0.22994593,0.32895002,0.74122405,0.6671442 ,0.1899878 ,0.35264668,0.31084946,0.3864719 ,0.7035006 ,0.46563607,0.44263086,0.2414678 ,0.7430625 ,0.72898006,0.9982008 ,0.8989132 ,0.45622516,0.17876478,0.9356994 ,0.85493064,0.73729265,0.9804242 ,0.8735895 ,0.14825071,0.33990774,0.76397645,0.14657325,0.2492199 ,0.43957144,0.20367876,0.43692476,0.28123745,0.24346785,0.21133597 diff --git a/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/3.txt b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/3.txt new file mode 100644 index 0000000..18f8666 --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/3.txt @@ -0,0 +1 @@ +0.74837255,0.7530814 ,0.05257462,0.06676125,0.26824346,0.05064487,0.23974492,0.5355457 ,0.97374374,0.38518724,0.3781766 ,0.7047476 ,0.95856845,0.09918232,0.36570287,0.5659468 ,0.8793284 ,0.7967468 ,0.99486005,0.11670698,0.42955273,0.25254622,0.06959745,0.5107888 ,0.88106513,0.3649466 ,0.7039582 ,0.8535825 ,0.3979168 ,0.9560912 ,0.17733434,0.69954944,0.35459924,0.28516313,0.75249106,0.7197228 diff --git a/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/4.txt b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/4.txt new file mode 100644 index 0000000..b51c5eb --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/InstanceNorm_001/layer/uint8/4.txt @@ -0,0 +1 @@ +0.73320377,0.33635676,0.05811058,0.7032399 ,0.26380542,0.99637365,0.36622 ,0.47471517,0.5940316 ,0.39782768,0.46486765,0.5167471 ,0.61612487,0.93076104,0.8955697 ,0.5320168 ,0.41166067,0.29174343,0.07476811,0.60023075,0.0961028 ,0.77073896,0.17360727,0.48763612,0.31430086,0.37943754,0.7456216 ,0.16767363,0.9368368 ,0.09397154,0.68992966,0.5829225 ,0.7521187 ,0.06086114,0.13137193,0.22886442 diff --git a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/0.txt b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/0.txt index 107491f..081a1e6 100644 --- a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/0.txt +++ b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/0.txt @@ -1 +1 @@ - 0.5590226 ,-0.2806683 ,-1.6237477 ,-0.9041292 ,-2.2877202 , 3.4275887 , 0.7413508 ,-2.4284103 ,-0.39940628, 2.431437 ,-3.681079 ,-0.24288087, 3.3011584 ,-4.9507365 , 0.63297826, 3.0742207 ,-4.407745 ,-3.1469536 , 0.28014645, 1.7506292 ,-2.2447422 ,-0.5647249 , 4.763762 ,-1.9554822 ,-1.0236452 , 1.4784483 ,-0.15040281, 3.009691 , 4.0685706 ,-4.3577633 , 3.9074588 , 3.3200462 , 0.7937705 ,-4.491444 ,-1.5227276 ,-4.907054 , 3.0078046 ,-3.3134713 ,-4.180262 , 0.42208448,-4.764361 , 1.7373432 ,-2.4944234 , 1.3338212 , 0.5318029 , 2.0201192 , 1.274291 ,-3.891372 +-1.9927613e+00,-1.7386111e+00, 4.0895696e+00, 3.7818990e+00, 1.9420158e+00, 2.8482721e+00, 1.9165717e+00, 3.0059583e+00, 1.8346788e+00,-1.9055414e-03, 4.9277787e+00,-2.2794118e+00, 4.4005270e+00, 4.9703922e+00,-4.5275192e+00,-4.0446317e-01,-4.9363256e+00, 4.9506269e+00, 5.5874938e-01, 3.9949589e+00,-3.8152415e-01,-4.1024357e-01,-3.8472393e+00, 4.2956004e+00, 4.8097472e+00, 1.7960385e+00, 1.6767026e+00,-2.2773645e+00, 2.6808765e+00,-3.7214172e+00, 4.0978761e+00, 3.6202488e+00,-3.3211513e+00, 3.6200387e+00,-3.6106458e+00,-3.9778764e+00, 3.8779631e+00,-4.8502750e+00,-2.1901150e+00, 3.1800017e+00, 4.6261444e+00, 3.5151103e+00, 2.8659137e-02, 4.5340648e+00, 1.9836371e+00,-2.1751235e+00,-4.6762753e+00,-3.6951694e+00 diff --git a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/1.txt b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/1.txt index f95a6c3..f6b31db 100644 --- a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/1.txt +++ b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/1.txt @@ -1 +1 @@ --2.5172353 , 1.8682998 , 2.6845884 , 1.8813597 ,-4.6693754 ,-3.2414548 ,-3.1801097 ,-1.5670214 , 1.9862102 , 3.857179 ,-3.0402668 ,-1.4183347 ,-2.7983398 ,-4.087585 ,-1.1274861 , 1.8738103 ,-2.563316 ,-2.973781 ,-0.872552 ,-4.4504313 ,-0.9188538 , 4.5734954 , 1.3559026 , 4.943204 ,-3.6803703 , 4.577067 ,-0.6116983 , 4.5055084 , 2.5480487 , 3.7308915 ,-0.3163238 ,-0.00772368, 3.0286303 ,-0.43645218, 0.87748104,-2.6953583 , 0.21743219, 2.431181 ,-1.2284794 , 0.35975334, 0.87034357,-2.5191767 , 4.030477 ,-1.2849646 ,-4.537441 ,-0.8822066 , 4.5059347 ,-0.9273924 +-4.7488093 , 4.805902 ,-0.29828382, 0.57486725,-4.864297 , 1.1832287 ,-1.7611881 ,-2.7058024 , 2.707353 ,-3.9832466 , 3.1243927 ,-4.795229 , 1.9835415 , 3.2291937 , 2.4303932 ,-3.556881 , 4.316894 ,-0.6444627 ,-3.8289468 , 4.012964 , 0.7878584 ,-1.8921386 , 2.779619 ,-3.762597 , 3.4239094 ,-0.9103423 ,-3.9791772 ,-2.5613685 ,-4.4910364 , 0.19411987, 4.6296096 ,-0.6827259 , 3.7645729 , 1.5309091 , 3.5163064 , 3.4726381 , 3.5372822 , 1.7671971 , 1.4374614 , 3.5783768 ,-2.4927518 , 3.9427729 , 2.431568 , 2.6959393 , 3.8100271 ,-2.099064 , 3.3663592 ,-2.0818436 diff --git a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/2.txt b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/2.txt index 106889e..acc01cb 100644 --- a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/2.txt +++ b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/2.txt @@ -1 +1 @@ - 4.523605 ,-2.1303053 , 2.7449381 ,-4.449816 ,-1.4482541 , 4.643309 ,-2.5644886 , 4.3115034 ,-4.7736797 ,-1.9451635 ,-2.1877592 , 2.3639698 ,-1.8480709 ,-4.560132 ,-0.40588248, 4.368528 ,-0.25666243, 1.1258887 , 2.33142 ,-3.8270295 ,-4.337086 ,-0.6709232 , 4.9283085 ,-3.5181348 , 2.225021 ,-0.0831629 , 2.0482597 , 3.161154 ,-0.49435407, 2.9382129 ,-1.248886 ,-3.7053974 , 1.6736145 ,-1.3524985 ,-1.4007242 ,-4.291275 ,-3.391911 , 4.803692 , 1.631321 , 0.13381048,-2.9587808 , 3.9878602 ,-3.3585925 , 4.6802793 ,-1.7605352 , 3.4168313 , 1.2318416 ,-4.40287 + 4.279912 ,-2.2746763 , 4.0609813 , 4.5353827 , 3.624241 ,-3.9593613 , 4.189409 ,-3.9370356 ,-2.7063863 ,-1.9987059 , 4.172294 ,-4.5454354 , 4.362368 , 2.2204642 ,-4.9866576 , 3.31571 , 0.12623785, 4.7834573 ,-1.3521448 ,-1.5408021 ,-4.6578984 ,-2.93307 ,-1.5684534 ,-1.6875995 ,-0.4278419 , 1.1314197 ,-2.9655704 ,-0.48032767,-1.9200082 , 1.3321692 , 0.87586147,-0.1761448 , 3.939337 ,-1.0270193 ,-4.807054 , 2.8373904 ,-1.1184337 ,-0.8979197 , 2.1442132 ,-2.8509672 ,-3.3741531 , 3.6592414 , 0.7632272 ,-4.11465 , 4.892313 , 4.715815 ,-4.6481915 , 0.24676175 diff --git a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/3.txt b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/3.txt index 488c348..0f0b7a9 100644 --- a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/3.txt +++ b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/3.txt @@ -1 +1 @@ - 1.249105 ,-3.2594535 ,-1.7899538 ,-4.804654 ,-2.0324056 ,-1.9959925 , 3.5215054 , 0.5371311 , 1.9365969 ,-3.130136 ,-2.3590457 ,-4.653209 ,-2.0184708 , 3.5759254 ,-1.3521014 , 1.910826 , 3.8221822 ,-2.8988552 , 0.6571995 , 1.0839036 , 3.5422468 , 2.4680734 , 0.6148754 ,-3.4008195 , 4.558109 , 2.0105803 , 0.58087206, 1.3398736 , 2.770545 , 0.29666626, 4.1851935 , 0.04321287, 2.7680604 , 4.5661645 , 4.0127945 ,-4.8027678 , 4.1711125 ,-0.24452859, 0.4101852 , 1.5963763 ,-2.8356924 , 1.2876563 , 0.90424466, 2.965566 ,-1.9058269 , 4.759825 ,-2.2063546 ,-1.1309439 +-2.0949495 ,-1.1370499 , 4.6457314 ,-2.243915 ,-1.7996464 , 1.2268789 ,-4.938172 ,-3.2802615 , 1.8788282 , 4.4162655 ,-4.8805113 , 3.1269526 , 3.2644348 , 0.89842725,-1.4484432 ,-0.28381723, 3.046261 ,-1.0718596 ,-3.996107 ,-4.9575796 ,-2.2279077 , 1.5326967 , 4.4588428 ,-2.042381 , 4.6604958 , 4.6422915 ,-1.097833 , 3.666126 , 0.4735639 ,-4.480704 ,-4.831033 ,-0.27288163, 4.588138 , 4.5297036 , 4.3675694 ,-1.6098841 ,-3.4147859 , 2.1168516 ,-1.9529305 ,-0.12548867, 3.4388335 ,-1.4071734 , 0.9507897 , 4.8206787 , 1.676873 ,-1.7102181 , 1.7746873 , 0.02711739 diff --git a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/4.txt b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/4.txt index a59688e..d23450d 100644 --- a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/4.txt +++ b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/int16/4.txt @@ -1 +1 @@ --3.0078897 , 1.6800234 , 4.350201 , 0.22538732, 2.9894316 ,-4.234071 , 2.733158 ,-3.8551323 , 3.9647048 , 1.4266169 , 0.78519976,-0.5334222 , 0.6681823 , 2.8409274 , 2.335872 ,-3.757666 ,-3.321705 , 2.9423573 , 1.3080943 , 1.0453726 , 3.222387 , 3.1813147 ,-1.8588669 ,-3.2523947 ,-4.4175825 , 3.7631783 ,-3.4176416 , 1.2141145 , 1.3725096 ,-1.2283872 ,-2.9829195 ,-3.6383085 ,-2.0126016 ,-3.7627625 , 4.916868 , 0.73052526,-0.02047114,-3.9506733 , 2.3569562 ,-4.247723 ,-1.8913685 , 1.7365774 , 4.59158 , 3.654596 ,-4.2133813 ,-4.6193404 ,-1.3968121 ,-3.580963 +-4.707647 ,-4.0921726 , 3.5813692 ,-4.71081 , 3.157816 ,-3.0034213 ,-0.21858999,-1.1736552 ,-1.6042249 ,-3.93102 ,-4.0407577 , 3.7350774 ,-4.9545655 ,-1.5413756 , 0.34996858, 2.0339615 , 0.99290746,-3.9916334 ,-4.149016 ,-3.2332835 , 3.6728513 , 2.4537466 ,-3.103485 ,-0.4829316 , 4.8046784 ,-1.753812 , 4.878712 ,-1.4039769 , 1.6640003 ,-1.2041731 , 0.8046477 , 0.9196048 ,-0.6475092 , 1.1409346 , 2.0324717 ,-0.04227797,-0.5379897 , 3.205104 , 3.3556423 , 4.8447986 ,-1.9695646 ,-2.6304977 ,-3.7261262 ,-4.725599 , 2.1162436 ,-0.5631174 ,-0.5820323 , 0.8398242 diff --git a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/0.txt b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/0.txt new file mode 100644 index 0000000..bcda22c --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/0.txt @@ -0,0 +1 @@ + 0.29413325,-0.5246354 , 2.5049045 , 4.9534087 , 0.9885207 ,-4.9603324 ,-2.534284 ,-1.2587626 ,-4.6054525 ,-4.0071754 , 3.204513 , 1.9254771 ,-3.0781755 ,-2.225973 , 3.3524523 , 3.817767 , 3.4921055 , 4.3435416 , 3.0849605 ,-1.4030998 ,-1.0506575 ,-0.42979953,-2.2500112 , 3.4057455 , 4.5414543 , 2.9366746 , 4.8639297 ,-0.1028097 , 2.3421814 , 0.6463296 ,-4.906506 ,-0.7544193 ,-4.0089574 , 2.3837643 ,-0.62171113,-3.349577 , 0.63758767,-3.6872568 ,-2.4398334 ,-1.1556609 ,-3.116043 ,-1.9698795 , 0.7246678 , 2.1801088 ,-2.5762403 , 2.5748649 ,-2.8637013 , 2.8755338 diff --git a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/1.txt b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/1.txt new file mode 100644 index 0000000..937e08f --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/1.txt @@ -0,0 +1 @@ +-3.5664022e+00, 3.7696166e+00,-2.0404069e+00,-3.2197843e+00, 2.0149478e-01, 4.1116104e+00, 1.9678035e+00,-7.5975507e-01,-2.1460054e+00, 4.6308274e+00,-1.8927828e+00, 3.0689645e+00,-7.0773923e-01,-6.7477709e-01,-1.6248076e+00, 2.7095401e+00, 2.9545853e+00, 8.5142839e-01,-2.7683893e-01,-2.0586762e+00,-3.5001924e+00,-1.7622359e+00, 2.2262762e+00,-4.0617161e+00,-2.4704919e+00,-3.6333869e+00, 2.3401244e+00,-4.6641917e+00,-4.0812837e-03, 1.1013873e+00, 1.4518824e-01, 2.4135842e+00, 4.1183419e+00, 3.0343807e+00,-3.7195799e-01,-9.7189492e-01,-3.0425618e+00, 4.6822820e+00,-1.7649661e+00, 3.9648254e+00,-3.1084957e+00,-7.3071235e-01,-5.1578474e-01,-3.5188673e+00,-4.7018051e+00,-4.1592669e+00,-3.5443991e-01, 1.3961188e+00 diff --git a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/2.txt b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/2.txt new file mode 100644 index 0000000..fb30491 --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/2.txt @@ -0,0 +1 @@ + 4.2618856 , 0.4364266 , 0.5258691 , 3.5147502 ,-4.025428 , 3.143039 , 1.3707066 , 4.7792606 , 1.1539228 , 3.785161 ,-1.9495047 , 2.7047534 , 0.5673139 ,-0.5191105 ,-2.5284607 , 4.076998 , 2.9433093 ,-2.1924984 , 1.1020935 ,-2.126009 , 0.7586875 , 1.1708144 ,-4.594603 ,-3.252912 ,-3.057344 , 3.8008513 ,-4.9164753 ,-4.560891 , 1.724639 ,-3.0877826 , 0.55354726,-3.969067 , 4.17461 ,-1.901139 ,-4.8903475 , 4.7866077 ,-1.3506653 ,-4.2624874 , 0.8842832 , 4.672003 ,-2.5649548 ,-3.6606123 ,-1.6794366 ,-2.0534387 ,-2.9902222 , 3.078469 , 2.846819 , 1.2788221 diff --git a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/3.txt b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/3.txt new file mode 100644 index 0000000..fb9d40a --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/3.txt @@ -0,0 +1 @@ +-2.6751792 ,-2.5436802 , 0.30533552, 1.0443643 ,-4.4327927 , 2.813772 ,-4.27514 , 2.5894637 , 2.8684394 ,-2.2010357 , 1.5827026 , 0.01609957, 0.38605672,-4.978118 ,-0.30794173, 0.7372266 ,-1.2931277 , 2.8435483 , 2.8204155 , 1.5801594 , 0.853025 , 1.0665054 ,-2.3281817 ,-4.2512784 , 2.379218 , 2.6335719 , 0.17575608,-2.7761426 ,-2.8164017 , 1.8392245 , 2.6495574 , 0.82702005, 3.8548648 ,-3.179834 , 0.25908127, 2.4930098 , 0.71019745,-3.193962 ,-1.1381371 ,-3.5847874 ,-1.3353258 , 2.942422 , 0.11944559,-3.0676606 , 3.534187 , 0.86664987,-1.4781127 , 4.8873277 diff --git a/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/4.txt b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/4.txt new file mode 100644 index 0000000..aeecd56 --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/PRelu_001/channel/uint8/4.txt @@ -0,0 +1 @@ + 4.2327642 , 4.644095 ,-2.8978996 , 4.39419 , 2.897952 ,-3.330613 ,-3.9131684 ,-1.4672462 ,-3.9219787 , 2.1286428 ,-4.313653 , 2.65426 ,-4.201722 , 2.5390174 ,-3.821772 ,-1.9420135 , 3.3508427 ,-1.2804624 , 4.899826 ,-4.165279 ,-0.38920662, 3.594253 ,-2.367396 , 3.8604352 , 0.40077925, 3.7654843 ,-2.7208197 , 3.4325044 ,-2.921729 , 2.0519714 ,-0.6181836 ,-0.12342291,-4.1059036 ,-3.653849 ,-3.5340316 ,-0.2782715 , 0.32330513, 3.360021 , 2.5673623 , 2.1614027 ,-4.438277 , 3.3010736 , 0.3992392 , 0.82871836,-2.8720777 , 0.29633927, 0.25286415,-4.191315 diff --git a/compiler/pota-quantization-value-test/test_record_minmax.sh b/compiler/pota-quantization-value-test/test_record_minmax.sh index acb7574..fa8f506 100755 --- a/compiler/pota-quantization-value-test/test_record_minmax.sh +++ b/compiler/pota-quantization-value-test/test_record_minmax.sh @@ -9,11 +9,11 @@ # work_dir : build directory of quantization-value-test (ex: build/compiler/quantization-value-test) SOURCE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -GEN_SCRIPT_PATH="${SOURCE_PATH}/gen_h5_explicit_inputs.py" COMPARE_SCRIPT_PATH="${SOURCE_PATH}/compare_tensors.py" CONFIG_PATH="$1"; shift BIN_PATH=$(dirname "${CONFIG_PATH}") TEST_INPUT_PATH="${SOURCE_PATH}/test_inputs" +GEN_SCRIPT_PATH="${BIN_PATH}/gen_h5_explicit_inputs.py" WORKDIR="$1"; shift source "${CONFIG_PATH}" @@ -48,7 +48,7 @@ while [ "$1" != "" ]; do # Generate h5 input data source "${VIRTUALENV}/bin/activate" "${VIRTUALENV}/bin/python" "${GEN_SCRIPT_PATH}" \ - --model "${WORKDIR}/${MODELNAME}.tflite" \ + --model "${WORKDIR}/${MODELNAME}.circle" \ --input "${TEST_INPUT_PATH}/${MODELNAME}/${GRANULARITY}/${DTYPE}" \ --output "${TESTCASE_FILE}.input.h5" diff --git a/compiler/tflchef/core/src/CustomOp/MaxPoolWithArgMax.cpp b/compiler/tflchef/core/src/CustomOp/MaxPoolWithArgMax.cpp index b1c92ec..13bf2e5 100644 --- a/compiler/tflchef/core/src/CustomOp/MaxPoolWithArgMax.cpp +++ b/compiler/tflchef/core/src/CustomOp/MaxPoolWithArgMax.cpp @@ -65,13 +65,13 @@ MaxPoolWithArgMaxChef::custom_value(flatbuffers::FlatBufferBuilder &fbb) const flex_buffers->Add(1); flex_buffers->EndVector(start, /*typed=*/true, /*fixed=*/false); auto output_type = operation.max_pool_with_argmax_options().output_type(); - assert(output_type == tflite::TensorType_INT64 || output_type == tflite::TensorType_INT32); + assert(output_type == tflchef::INT64 || output_type == tflchef::INT32); flex_buffers->Int("Targmax", output_type); std::string padding = operation.max_pool_with_argmax_options().padding() ? "VALID" : "SAME"; flex_buffers->String("padding", padding); flex_buffers->Bool("include_batch_in_index", operation.max_pool_with_argmax_options().include_batch_in_index()); - flex_buffers->Int("T", tflite::TensorType_FLOAT32); + flex_buffers->Int("T", tflchef::FLOAT32); flex_buffers->EndMap(map_start); flex_buffers->Finish(); diff --git a/compiler/tfldump/src/Dump.cpp b/compiler/tfldump/src/Dump.cpp index 8c8178f..20e1343 100644 --- a/compiler/tfldump/src/Dump.cpp +++ b/compiler/tfldump/src/Dump.cpp @@ -349,6 +349,7 @@ void dump_model(std::ostream &os, const tflite::Model *model) auto opcodes = reader.opcodes(); auto buffers = reader.buffers(); + auto metadata = reader.metadata(); // dump operator_codes os << "Operator Codes: [order] OpCodeName (OpCode Enum)" << std::endl; @@ -382,6 +383,17 @@ void dump_model(std::ostream &os, const tflite::Model *model) } os << std::endl; + // dump metadata + if (metadata != nullptr) + { + os << "metadata : B(index) name" << std::endl; + for (uint32_t i = 0; i < metadata->Length(); ++i) + { + os << "B(" << metadata->Get(i)->buffer() << ") " << metadata->Get(i)->name()->c_str(); + } + os << std::endl; + } + for (uint32_t sg = 0; sg < num_subgraph; ++sg) { reader.select_subgraph(sg); diff --git a/compiler/tfldump/src/OpPrinter.cpp b/compiler/tfldump/src/OpPrinter.cpp index 5d279632..c358480 100644 --- a/compiler/tfldump/src/OpPrinter.cpp +++ b/compiler/tfldump/src/OpPrinter.cpp @@ -694,6 +694,7 @@ OpPrinterRegistry::OpPrinterRegistry() // There is no Option for LOGISTIC // There is no Option for LOG_SOFTMAX _op_map[tflite::BuiltinOperator_MAX_POOL_2D] = make_unique(); + _op_map[tflite::BuiltinOperator_MEAN] = make_unique(); _op_map[tflite::BuiltinOperator_MIRROR_PAD] = make_unique(); _op_map[tflite::BuiltinOperator_MUL] = make_unique(); // There is no Option for NON_MAX_SUPPRESSION_V4 diff --git a/compiler/tfldump/src/Read.cpp b/compiler/tfldump/src/Read.cpp index f9782d9..856cc56 100644 --- a/compiler/tfldump/src/Read.cpp +++ b/compiler/tfldump/src/Read.cpp @@ -81,6 +81,7 @@ Reader::Reader(const tflite::Model *model) _version = model->version(); _subgraphs = model->subgraphs(); _buffers = model->buffers(); + _metadata = model->metadata(); auto opcodes = model->operator_codes(); for (const ::tflite::OperatorCode *opcode : *opcodes) diff --git a/compiler/tfldump/src/Read.h b/compiler/tfldump/src/Read.h index 7af2fa5..f835be1 100644 --- a/compiler/tfldump/src/Read.h +++ b/compiler/tfldump/src/Read.h @@ -52,6 +52,7 @@ private: using TFliteBuffers_t = flatbuffers::Vector>; using TFliteTensors_t = flatbuffers::Vector>; using TFliteOperators_t = flatbuffers::Vector>; + using TFliteMetadata_t = flatbuffers::Vector>; public: Reader(const tflite::Model *model); @@ -67,6 +68,7 @@ public: const TFliteOperators_t *operators() { return _operators; } const std::vector &inputs() const { return _inputs; } const std::vector &outputs() const { return _outputs; } + const TFliteMetadata_t *metadata() const { return _metadata; } uint32_t num_subgraph() const { return _subgraphs->Length(); } @@ -86,6 +88,7 @@ private: const TFliteBuffers_t *_buffers{nullptr}; const TFliteTensors_t *_tensors{nullptr}; const TFliteOperators_t *_operators{nullptr}; + const TFliteMetadata_t *_metadata{nullptr}; uint32_t _subgraph_index; std::string _subgraph_name; diff --git a/compiler/vconone/CMakeLists.txt b/compiler/vconone/CMakeLists.txt index 9055154..595bbfd 100644 --- a/compiler/vconone/CMakeLists.txt +++ b/compiler/vconone/CMakeLists.txt @@ -1,5 +1,5 @@ if (NOT VCONONE_VERSION) - set(VCONONE_VERSION 0x00000000000b0001) + set(VCONONE_VERSION 0x00000000000c0001) # NOTE order is [build patch minor major] # if VCONONE_VERSION is set with -D option, it will be cached # you may have to remove cache file if you remove -D option diff --git a/compute/.clang-format b/compute/.clang-format new file mode 120000 index 0000000..0ff66f3 --- /dev/null +++ b/compute/.clang-format @@ -0,0 +1 @@ +../.clang-format.8 \ No newline at end of file diff --git a/compute/ARMComputeEx/arm_compute/core/CL/CLKernelLibraryEx.h b/compute/ARMComputeEx/arm_compute/core/CL/CLKernelLibraryEx.h index d29886a..4a37178 100644 --- a/compute/ARMComputeEx/arm_compute/core/CL/CLKernelLibraryEx.h +++ b/compute/ARMComputeEx/arm_compute/core/CL/CLKernelLibraryEx.h @@ -255,14 +255,14 @@ private: cl::Device _device; /**< Underlying CL device. */ std::string _kernel_path; /**< Path to the kernels folder. */ mutable std::map - _programs_map; /**< Map with all already loaded program data. */ + _programs_map; /**< Map with all already loaded program data. */ mutable std::map - _built_programs_map; /**< Map with all already built program data. */ + _built_programs_map; /**< Map with all already built program data. */ static const std::map - _kernel_program_map; /**< Map that associates kernel names with programs. */ + _kernel_program_map; /**< Map that associates kernel names with programs. */ static const std::map - _program_source_map; /**< Contains sources for all programs. - Used for compile-time kernel inclusion. >*/ + _program_source_map; /**< Contains sources for all programs. + Used for compile-time kernel inclusion. >*/ }; } #endif /* __ARM_COMPUTE_CLKERNELLIBRARY_EX_H__ */ diff --git a/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLEmbeddingLookupKernel.h b/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLEmbeddingLookupKernel.h index a614d52..fb689f7 100644 --- a/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLEmbeddingLookupKernel.h +++ b/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLEmbeddingLookupKernel.h @@ -54,8 +54,8 @@ namespace arm_compute class ICLTensor; /** -* @brief Class to perform EmbeddingLookup operation with opencl kernel -*/ + * @brief Class to perform EmbeddingLookup operation with opencl kernel + */ class CLEmbeddingLookupKernel : public ICLKernel { public: diff --git a/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLHashtableLookupKernel.h b/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLHashtableLookupKernel.h index 99cfa61..96f8308 100644 --- a/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLHashtableLookupKernel.h +++ b/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLHashtableLookupKernel.h @@ -55,8 +55,8 @@ namespace arm_compute class ICLTensor; /** -* @brief Class to perform HashtableLookup operation with opencl kernel -*/ + * @brief Class to perform HashtableLookup operation with opencl kernel + */ class CLHashtableLookupKernel : public ICLKernel { public: diff --git a/compute/ARMComputeEx/arm_compute/core/NEON/kernels/NEOneHotKernel.h b/compute/ARMComputeEx/arm_compute/core/NEON/kernels/NEOneHotKernel.h index 99bb351..963d7b8 100644 --- a/compute/ARMComputeEx/arm_compute/core/NEON/kernels/NEOneHotKernel.h +++ b/compute/ARMComputeEx/arm_compute/core/NEON/kernels/NEOneHotKernel.h @@ -68,34 +68,37 @@ public: const char *name() const override { return "NEOneHotKernel"; } /** Initialise the kernel's inputs and outputs * - * @param[in] indices Indices tensor. Supported tensor rank: up to 3. Must be one of the - * following types: U32/S32 - * @param[in] depth The tensor for depth of the one hot dimension. Supported tensor rank: up to - * 3. Must be one of the following types: U32/S32 - * @param[in] on_value On value tensor. Supported tensor rank: only 1. Data type supported: - * U8/S8/U16/S16/F16/U32/S32/F32 - * @param[in] off_value Off value tensor. Supported tensor rank: only 1. Data type supported: Same - * as @p on_value - * @param[out] output Destination tensor. Data type supported: Same as @p on_value - * @param[in] axis (Optional) The axis to fill. Negative values wrap around. Defaults to -1. - * The value must be in range [-indices.rank , indices.rank) + * @param[in] indices Indices tensor. Supported tensor rank: up to 3. Must be one of the + * following types: U32/S32 + * @param[in] depth The tensor for depth of the one hot dimension. + * Supported tensor rank: up to 3. + * Must be one of the following types: U32/S32 + * @param[in] on_value On value tensor. Supported tensor rank: only 1. + * Data type supported: U8/S8/U16/S16/F16/U32/S32/F32 + * @param[in] off_value Off value tensor. Supported tensor rank: only 1. + * Data type supported: Same as @p on_value + * @param[out] output Destination tensor. Data type supported: Same as @p on_value + * @param[in] axis (Optional) The axis to fill. Negative values wrap around. + * Defaults to -1. + * The value must be in range [-indices.rank , indices.rank) */ void configure(const ITensor *indices, const ITensor *depth, const ITensor *on_value, const ITensor *off_value, ITensor *output, int axis = -1); /** Static function to check if given info will lead to a valid configuration of @ref - * NEOneHotKernel + * NEOneHotKernel * - * @param[in] indices Indices tensor info. Supported tensor rank: up to 3. Must be one of the - * following types: U32/S32 - * @param[in] depth The tensor info for depth of the one hot dimension. Supported tensor rank: - * up to 3. Must be one of the following types: U32/S32 - * @param[in] on_value On value tensor info. Supported tensor rank: only 1. Data type supported: - * U8/S8/U16/S16/F16/U32/S32/F32 - * @param[in] off_value Off value tensor info. Supported tensor rank: only 1. Data type supported: - * Same as @p on_value - * @param[out] output Destination tensor info. Data type supported: Same as @p on_value - * @param[in] axis (Optional) The axis to fill. Negative values wrap around. Defaults to -1. - * The value must be in range [-indices.rank , indices.rank) + * @param[in] indices Indices tensor info. Supported tensor rank: up to 3. + * Must be one of the following types: U32/S32 + * @param[in] depth The tensor info for depth of the one hot dimension. + * Supported tensor rank: up to 3. + * Must be one of the following types: U32/S32 + * @param[in] on_value On value tensor info. Supported tensor rank: only 1. + * Data type supported: U8/S8/U16/S16/F16/U32/S32/F32 + * @param[in] off_value Off value tensor info. Supported tensor rank: only 1. + * Data type supported: Same as @p on_value + * @param[out] output Destination tensor info. Data type supported: Same as @p on_value + * @param[in] axis (Optional) The axis to fill. Negative values wrap around. Defaults to -1. + * The value must be in range [-indices.rank , indices.rank) * * @return a status */ diff --git a/compute/ARMComputeEx/arm_compute/core/utils/misc/ShapeCalculatorEx.h b/compute/ARMComputeEx/arm_compute/core/utils/misc/ShapeCalculatorEx.h index 1e69f09..2aaab6b 100644 --- a/compute/ARMComputeEx/arm_compute/core/utils/misc/ShapeCalculatorEx.h +++ b/compute/ARMComputeEx/arm_compute/core/utils/misc/ShapeCalculatorEx.h @@ -72,10 +72,10 @@ namespace shape_calculator * @return the calculated shape */ inline TensorShape compute_transposeconv_upsampled_shape( - const ITensorInfo &input, const ITensorInfo &weights, const PadStrideInfo &info, - std::pair &out_dims, unsigned int invalid_right, - unsigned int invalid_bottom, unsigned int &pad_left, unsigned int &pad_right, - unsigned int &pad_top, unsigned int &pad_bottom) + const ITensorInfo &input, const ITensorInfo &weights, const PadStrideInfo &info, + std::pair &out_dims, unsigned int invalid_right, + unsigned int invalid_bottom, unsigned int &pad_left, unsigned int &pad_right, + unsigned int &pad_top, unsigned int &pad_bottom) { unsigned int sx = info.stride().first; unsigned int sy = info.stride().second; @@ -103,7 +103,7 @@ inline TensorShape compute_transposeconv_upsampled_shape( unsigned int padx_all_except_invallid = padx + info.pad_left() + info.pad_right() - invalid_right; unsigned int pady_all_except_invallid = - pady + info.pad_top() + info.pad_bottom() - invalid_bottom; + pady + info.pad_top() + info.pad_bottom() - invalid_bottom; pad_left = (padx_all_except_invallid + 1) / 2 - info.pad_left(); pad_right = pady_all_except_invallid / 2 - info.pad_right() + invalid_right; pad_top = (padx_all_except_invallid + 1) / 2 - info.pad_top(); @@ -135,7 +135,7 @@ compute_transposeconv_output_shape(const std::pair & const int width_idx = get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH); const int height_idx = get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT); const int channel_idx = - get_data_layout_dimension_index(data_layout, DataLayoutDimension::CHANNEL); + get_data_layout_dimension_index(data_layout, DataLayoutDimension::CHANNEL); const int batch_idx = get_data_layout_dimension_index(data_layout, DataLayoutDimension::BATCHES); TensorShape out_shape{input_shape}; @@ -160,7 +160,7 @@ inline TensorShape compute_depth_to_space_shape_ex(const ITensorInfo *input, int const int idx_width = get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH); const int idx_height = get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT); const int idx_channel = - get_data_layout_dimension_index(data_layout, DataLayoutDimension::CHANNEL); + get_data_layout_dimension_index(data_layout, DataLayoutDimension::CHANNEL); TensorShape output_shape{input->tensor_shape()}; output_shape.set(idx_width, input->dimension(idx_width) * block); diff --git a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLDirectTransposeConvLayer.h b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLDirectTransposeConvLayer.h index 409eaf5..026209f 100644 --- a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLDirectTransposeConvLayer.h +++ b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLDirectTransposeConvLayer.h @@ -106,22 +106,24 @@ public: CLDirectTransposeConvLayer &operator=(CLDirectTransposeConvLayer &&) = default; /** Set the input, weights, biases and output tensors. * - * @param[in,out] input Input tensor. 3 lower dimensions represent a single input, and an - * optional 4th dimension for batch of inputs. - * Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32. - * @param[in] weights The 4d weights with dimensions [width, height, IFM, OFM]. Data type - * supported: Same as @p input. - * @param[in] bias (Optional) The biases have one dimension. - * Data type supported: Should match @p input data type, except for - * input of QASYMM8 and QASYMM8_SIGNED type where biases should be of S32 type - * @param[out] output Output tensor. The output has the same number of dimensions as the - * @p input. - * @param[in] info Contains padding and policies to be used in the deconvolution, this - * is decribed in @ref PadStrideInfo. - * @param[in] invalid_right The number of zeros added to right edge of the output. - * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. - * @param[in] weights_info (Optional) Weights information needed for @ref CLConvolutionLayer, - * specifies if the weights tensor has been reshaped with @ref CLWeightsReshapeKernel. + * @param[in,out] input Input tensor. 3 lower dimensions represent a single input, + * and an optional 4th dimension for batch of inputs. + * Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32. + * @param[in] weights The 4d weights with dimensions [width, height, IFM, OFM]. + * Data type supported: Same as @p input. + * @param[in] bias (Optional) The biases have one dimension. + * Data type supported: Should match @p input data type, + * except for input of QASYMM8 and QASYMM8_SIGNED type + * where biases should be of S32 type + * @param[out] output Output tensor. + * The output has the same number of dimensions as the @p input. + * @param[in] info Contains padding and policies to be used in the deconvolution, + * this is decribed in @ref PadStrideInfo. + * @param[in] invalid_right The number of zeros added to right edge of the output. + * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. + * @param[in] weights_info (Optional) Weights information needed for + * @ref CLConvolutionLayer, specifies if the weights tensor has been reshaped with + * @ref CLWeightsReshapeKernel. * */ void configure(ICLTensor *input, ICLTensor *weights, const ICLTensor *bias, ICLTensor *output, @@ -130,23 +132,24 @@ public: /** Set the input, weights, biases and output tensors. * * @param[in] compile_context The compile context to be used. - * @param[in,out] input Input tensor. 3 lower dimensions represent a single input, and - * an optional 4th dimension for batch of inputs. + * @param[in,out] input Input tensor. 3 lower dimensions represent a single input, + * and an optional 4th dimension for batch of inputs. * Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32. - * @param[in] weights The 4d weights with dimensions [width, height, IFM, OFM]. Data - * type supported: Same as @p input. + * @param[in] weights The 4d weights with dimensions [width, height, IFM, OFM]. + * Data type supported: Same as @p input. * @param[in] bias (Optional) The biases have one dimension. * Data type supported: Should match @p input data type, except for - * input of QASYMM8 and QASYMM8_SIGNED type where biases should be of S32 type + * input of QASYMM8 and QASYMM8_SIGNED type + * where biases should be of S32 type * @param[out] output Output tensor. The output has the same number of dimensions as - * the @p input. + * the @p input. * @param[in] info Contains padding and policies to be used in the deconvolution, - * this is decribed in @ref PadStrideInfo. - * @param[in] invalid_right The number of zeros added to right edge of the output. - * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. - * @param[in] weights_info (Optional) Weights information needed for @ref - * CLConvolutionLayer, specifies if the weights tensor has been reshaped with @ref - * CLWeightsReshapeKernel. + * this is decribed in @ref PadStrideInfo. + * @param[in] invalid_right The number of zeros added to right edge of the output. + * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. + * @param[in] weights_info (Optional) Weights information needed for + * @ref CLConvolutionLayer, specifies if the weights tensor has + * been reshaped with @ref CLWeightsReshapeKernel. * */ void configure(const CLCompileContext &compile_context, ICLTensor *input, ICLTensor *weights, @@ -154,24 +157,26 @@ public: unsigned int invalid_right, unsigned int invalid_bottom, const WeightsInfo &weights_info = WeightsInfo()); /** Static function to check if given info will lead to a valid configuration of @ref - * CLDirectTransposeConvLayer + * CLDirectTransposeConvLayer * - * @param[in] input Input tensor info. 3 lower dimensions represent a single input, and an - * optional 4th dimension for batch of inputs. - * Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32. - * @param[in] weights The 4d weights info with dimensions [width, height, IFM, OFM]. Data - * type supported: Same as @p input. - * @param[in] bias (Optional) The biases have one dimension. - * Data type supported: Should match @p input data type, except for input - * of QASYMM8 and QASYMM8_SIGNED type where biases should be of S32 type - * @param[in] output Output tensor info. The output has the same number of dimensions as the - * @p input. - * @param[in] info Contains padding and policies to be used in the deconvolution, this is - * decribed in @ref PadStrideInfo. - * @param[in] invalid_right The number of zeros added to right edge of the output. - * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. - * @param[in] weights_info (Optional) Weights information needed for @ref CLConvolutionLayer, - * specifies if the weights tensor has been reshaped with @ref CLWeightsReshapeKernel. + * @param[in] input Input tensor info. 3 lower dimensions represent a single input, + * and an optional 4th dimension for batch of inputs. + * Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32. + * @param[in] weights The 4d weights info with dimensions [width, height, IFM, OFM]. + * Data type supported: Same as @p input. + * @param[in] bias (Optional) The biases have one dimension. + * Data type supported: Should match @p input data type, + * except for input of QASYMM8 and QASYMM8_SIGNED type + * where biases should be of S32 type + * @param[in] output Output tensor info. The output has the same number of dimensions + * as the @p input. + * @param[in] info Contains padding and policies to be used in the deconvolution, + * this is decribed in @ref PadStrideInfo. + * @param[in] invalid_right The number of zeros added to right edge of the output. + * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. + * @param[in] weights_info (Optional) Weights information needed for @ref CLConvolutionLayer, + * specifies if the weights tensor has been reshaped + * with @ref CLWeightsReshapeKernel. * * @return a status */ diff --git a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLFullyConnectedLayerEx.h b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLFullyConnectedLayerEx.h index e65a646..f27e991 100644 --- a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLFullyConnectedLayerEx.h +++ b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLFullyConnectedLayerEx.h @@ -216,7 +216,7 @@ private: CLConvertFullyConnectedWeights _convert_weights; weights_transformations::CLConvertFullyConnectedWeightsManaged _convert_weights_managed; weights_transformations::CLFullyConnectedLayerReshapeWeightsExManaged - _reshape_weights_managed_function; + _reshape_weights_managed_function; CLFlattenLayer _flatten_layer; CLFullyConnectedLayerReshapeWeightsEx _reshape_weights_function; CLGEMM _mm_gemm; diff --git a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLFullyConnectedReshapingLayer.h b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLFullyConnectedReshapingLayer.h index 289ab16..bdb1686 100644 --- a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLFullyConnectedReshapingLayer.h +++ b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLFullyConnectedReshapingLayer.h @@ -43,8 +43,8 @@ public: public: CLFullyConnectedReshapingLayer(std::shared_ptr memory_manager = nullptr) - : _input(nullptr), _weights(nullptr), _biases(nullptr), _output(nullptr), _cl_buffer{}, - _memory_manager{memory_manager}, _cl_fc{nullptr}, _cl_reshape{}, _needs_reshape(false) + : _input(nullptr), _weights(nullptr), _biases(nullptr), _output(nullptr), _cl_buffer{}, + _memory_manager{memory_manager}, _cl_fc{nullptr}, _cl_reshape{}, _needs_reshape(false) { // DO NOTHING } diff --git a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLGatherEx.h b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLGatherEx.h index b01ec42..167554c 100644 --- a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLGatherEx.h +++ b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLGatherEx.h @@ -66,7 +66,7 @@ public: * @param[out] output The output tensor, Data types supported: same as @p input. * @param[in] axis (Optional) The axis in @p input to gather @p indices from. Defaults to 0 * @return N/A - */ + */ void configure(const ICLTensor *input, const ICLTensor *indices, ICLTensor *output, int axis = 0); /** diff --git a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLTransposeConvLayer.h b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLTransposeConvLayer.h index 5fb102e..5b27d36 100644 --- a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLTransposeConvLayer.h +++ b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLTransposeConvLayer.h @@ -63,20 +63,22 @@ public: /** Set the input, weights, biases and output tensors. * - * @param[in,out] input Input tensor. 3 lower dimensions represent a single input, and an - * optional 4th dimension for batch of inputs. Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32. - * @param[in] weights The 4d weights with dimensions [width, height, IFM, OFM]. Data type - * supported: Same as @p input. - * @param[in] bias (Optional) The biases have one dimension. Data type supported: Same - * as @p input. - * @param[out] output Output tensor. The output has the same number of dimensions as the - * @p input. - * @param[in] deconv_info Contains padding and policies to be used in the deconvolution, this - * is described in @ref PadStrideInfo. - * @param[in] invalid_right The number of zeros added to right edge of the output. - * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. - * @param[in] weights_info (Optional) Weights information needed for @ref CLConvolutionLayer, - * specifies if the weights tensor has been reshaped with @ref CLWeightsReshapeKernel. + * @param[in,out] input Input tensor. 3 lower dimensions represent a single input, + * and an optional 4th dimension for batch of inputs. + * Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32. + * @param[in] weights The 4d weights with dimensions [width, height, IFM, OFM]. + * Data type supported: Same as @p input. + * @param[in] bias (Optional) The biases have one dimension. + * Data type supported: Same as @p input. + * @param[out] output Output tensor. The output has the same number of dimensions + * as the @p input. + * @param[in] deconv_info Contains padding and policies to be used in the deconvolution, + * this is described in @ref PadStrideInfo. + * @param[in] invalid_right The number of zeros added to right edge of the output. + * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. + * @param[in] weights_info (Optional) Weights information needed for + * @ref CLConvolutionLayer, specifies if the weights tensor has + * been reshaped with @ref CLWeightsReshapeKernel. * */ void configure(ICLTensor *input, ICLTensor *weights, const ICLTensor *bias, ICLTensor *output, @@ -85,22 +87,22 @@ public: /** Set the input, weights, biases and output tensors. * * @param[in] compile_context The compile context to be used. - * @param[in,out] input Input tensor. 3 lower dimensions represent a single input, and - * an optional 4th dimension for batch of inputs. Data types supported: - * QASYMM8_SIGNED/QASYMM8/F16/F32. - * @param[in] weights The 4d weights with dimensions [width, height, IFM, OFM]. Data - * type supported: Same as @p input. - * @param[in] bias (Optional) The biases have one dimension. Data type supported: - * Same as @p input. - * @param[out] output Output tensor. The output has the same number of dimensions as - * the @p input. + * @param[in,out] input Input tensor. 3 lower dimensions represent a single input, + * and an optional 4th dimension for batch of inputs. + * Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32. + * @param[in] weights The 4d weights with dimensions [width, height, IFM, OFM]. + * Data type supported: Same as @p input. + * @param[in] bias (Optional) The biases have one dimension. + * Data type supported: Same as @p input. + * @param[out] output Output tensor. The output has the same number of dimensions + * as the @p input. * @param[in] deconv_info Contains padding and policies to be used in the deconvolution, - * this is described in @ref PadStrideInfo. - * @param[in] invalid_right The number of zeros added to right edge of the output. - * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. - * @param[in] weights_info (Optional) Weights information needed for @ref - * CLConvolutionLayer, specifies if the weights tensor has been reshaped with @ref - * CLWeightsReshapeKernel. + * this is described in @ref PadStrideInfo. + * @param[in] invalid_right The number of zeros added to right edge of the output. + * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. + * @param[in] weights_info (Optional) Weights information needed for + * @ref CLConvolutionLayer, specifies if the weights tensor has + * been reshaped with @ref CLWeightsReshapeKernel. * */ void configure(const CLCompileContext &compile_context, ICLTensor *input, ICLTensor *weights, @@ -108,22 +110,24 @@ public: unsigned int invalid_right, unsigned int invalid_bottom, const WeightsInfo &weights_info = WeightsInfo()); /** Static function to check if given info will lead to a valid configuration of @ref - * CLTransposeConvLayer + * CLTransposeConvLayer * - * @param[in] input Input tensor info. 3 lower dimensions represent a single input, and an - * optional 4th dimension for batch of inputs. Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32. - * @param[in] weights The 4d weights info with dimensions [width, height, IFM, OFM]. Data - * type supported: Same as @p input. - * @param[in] bias (Optional) The biases have one dimension. Data type supported: Same as - * @p input. - * @param[in] output Output tensor info. The output has the same number of dimensions as the - * @p input. - * @param[in] deconv_info Contains padding and policies to be used in the deconvolution, this is - * described in @ref PadStrideInfo. - * @param[in] invalid_right The number of zeros added to right edge of the output. - * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. - * @param[in] weights_info (Optional) Weights information needed for @ref CLConvolutionLayer, - * specifies if the weights tensor has been reshaped with @ref CLWeightsReshapeKernel. + * @param[in] input Input tensor info. 3 lower dimensions represent a single input, + * and an optional 4th dimension for batch of inputs. + * Data types supported: QASYMM8_SIGNED/QASYMM8/F16/F32. + * @param[in] weights The 4d weights info with dimensions [width, height, IFM, OFM]. + * Data type supported: Same as @p input. + * @param[in] bias (Optional) The biases have one dimension. + * Data type supported: Same as @p input. + * @param[in] output Output tensor info. The output has the same number of dimensions + * as the @p input. + * @param[in] deconv_info Contains padding and policies to be used in the deconvolution, + * this is described in @ref PadStrideInfo. + * @param[in] invalid_right The number of zeros added to right edge of the output. + * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. + * @param[in] weights_info (Optional) Weights information needed for @ref CLConvolutionLayer, + * specifies if the weights tensor has been reshaped with + * @ref CLWeightsReshapeKernel. * * @return a status */ diff --git a/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NEFullyConnectedReshapingLayer.h b/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NEFullyConnectedReshapingLayer.h index 18cb61b..e34b4dc 100644 --- a/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NEFullyConnectedReshapingLayer.h +++ b/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NEFullyConnectedReshapingLayer.h @@ -43,8 +43,8 @@ public: public: NEFullyConnectedReshapingLayer(std::shared_ptr memory_manager = nullptr) - : _memory_manager{memory_manager}, _input(nullptr), _weights(nullptr), _biases(nullptr), - _output(nullptr), _neon_buffer{}, _neon_fc{nullptr}, _neon_reshape{}, _needs_reshape(false) + : _memory_manager{memory_manager}, _input(nullptr), _weights(nullptr), _biases(nullptr), + _output(nullptr), _neon_buffer{}, _neon_fc{nullptr}, _neon_reshape{}, _needs_reshape(false) { // DO NOTHING } diff --git a/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NEOneHot.h b/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NEOneHot.h index b2ea627..1a68f80 100644 --- a/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NEOneHot.h +++ b/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NEOneHot.h @@ -66,19 +66,20 @@ public: void configure(const ITensor *indices, const ITensor *depth, const ITensor *on_value, const ITensor *off_value, ITensor *output, int axis = -1); /** Static function to check if given info will lead to a valid configuration of @ref - * NEOneHotKernel + * NEOneHotKernel * - * @param[in] indices Indices tensor info. Supported tensor rank: up to 3. Must be one of the - * following types: U32/S32 - * @param[in] depth The tensor info for depth of the one hot dimension. Supported tensor rank: - * up to 3. Must be one of the following types: U32/S32 - * @param[in] on_value On value tensor info. Supported tensor rank: only 1. Data type supported: - * U8/S8/U16/S16/F16/U32/S32/F32 - * @param[in] off_value Off value tensor info. Supported tensor rank: only 1. Data type supported: - * Same as @p on_value - * @param[out] output Destination tensor info. Data type supported: Same as @p on_value - * @param[in] axis (Optional) The axis to fill. Negative values wrap around. Defaults to -1. - * The value must be in range [-indices.rank , indices.rank) + * @param[in] indices Indices tensor info. Supported tensor rank: up to 3. + * Must be one of the following types: U32/S32 + * @param[in] depth The tensor info for depth of the one hot dimension. + * Supported tensor rank: up to 3. + * Must be one of the following types: U32/S32 + * @param[in] on_value On value tensor info. Supported tensor rank: only 1. + * Data type supported: U8/S8/U16/S16/F16/U32/S32/F32 + * @param[in] off_value Off value tensor info. Supported tensor rank: only 1. + * Data type supported: Same as @p on_value + * @param[out] output Destination tensor info. Data type supported: Same as @p on_value + * @param[in] axis (Optional) The axis to fill. Negative values wrap around. Defaults to -1. + * The value must be in range [-indices.rank , indices.rank) * * @return a status */ diff --git a/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NETransposeConvLayer.h b/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NETransposeConvLayer.h index 24ff5da..7a08dae 100644 --- a/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NETransposeConvLayer.h +++ b/compute/ARMComputeEx/arm_compute/runtime/NEON/functions/NETransposeConvLayer.h @@ -110,39 +110,42 @@ public: /** Set the input, weights, biases and output tensors. * - * @param[in,out] input Input tensor. 3 lower dimensions represent a single input, and an - * optional 4th dimension for batch of inputs. Data types supported: F32/F16/QASYMM8/QASYMM8_SIGNED. - * @param[in] weights The 4d weights with dimensions [width, height, IFM, OFM]. Data type - * supported: Same as @p input. - * @param[in] bias Optional, ignored if NULL. The biases have one dimension. Data type - * supported: Data types supported: S32 for QASYMM8 and QASYMM8_SIGNED input, F32 for F32 input, F16 - * for F16 input. - * @param[out] output Output tensor. The output has the same number of dimensions as the @p - * input. - * @param[in] info Contains padding and policies to be used in the deconvolution, this is - * decribed in @ref PadStrideInfo. - * @param[in] invalid_right The number of zeros added to right edge of the output. - * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. + * @param[in,out] input Input tensor. 3 lower dimensions represent a single input, + * and an optional 4th dimension for batch of inputs. + * Data types supported: F32/F16/QASYMM8/QASYMM8_SIGNED. + * @param[in] weights The 4d weights with dimensions [width, height, IFM, OFM]. + * Data type supported: Same as @p input. + * @param[in] bias Optional, ignored if NULL. The biases have one dimension. + * Data type supported: Data types supported: S32 for QASYMM8 and + * QASYMM8_SIGNED input, F32 for F32 input, F16 for F16 input. + * @param[out] output Output tensor. The output has the same number of dimensions as + * the @p input. + * @param[in] info Contains padding and policies to be used in the deconvolution, + * this is decribed in @ref PadStrideInfo. + * @param[in] invalid_right The number of zeros added to right edge of the output. + * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. * */ void configure(ITensor *input, const ITensor *weights, const ITensor *bias, ITensor *output, const PadStrideInfo &info, unsigned int invalid_right, unsigned int invalid_bottom); /** Static function to check if given info will lead to a valid configuration of @ref - * NETransposeConvLayer + * NETransposeConvLayer * - * @param[in] input Input tensor info. 3 lower dimensions represent a single input, and an - * optional 4th dimension for batch of inputs. Data types supported: F32/F16/QASYMM8/QASYMM8_SIGNED. - * @param[in] weights The 4d weights info with dimensions [width, height, IFM, OFM]. Data type - * supported: Same as @p input. - * @param[in] bias (Optional) The biases have one dimension. Data type supported: Data types - * supported: S32 for QASYMM8 and QASYMM8_SIGNED input, F32 for F32 input, F16 for F16 input. - * @param[in] output Output tensor info. The output has the same number of dimensions as the @p - * input. - * @param[in] info Contains padding and policies to be used in the deconvolution, this is - * decribed in @ref PadStrideInfo. - * @param[in] innvalid_right The number of zeros added to right edge of the output. - * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. + * @param[in] input Input tensor info. 3 lower dimensions represent a single input, + * and an optional 4th dimension for batch of inputs. + * Data types supported: F32/F16/QASYMM8/QASYMM8_SIGNED. + * @param[in] weights The 4d weights info with dimensions [width, height, IFM, OFM]. + * Data type supported: Same as @p input. + * @param[in] bias (Optional) The biases have one dimension. + * Data types supported: S32 for QASYMM8 and QASYMM8_SIGNED input, + * F32 for F32 input, F16 for F16 input. + * @param[in] output Output tensor info. The output has the same number of dimensions as + * the @p input. + * @param[in] info Contains padding and policies to be used in the deconvolution, + * this is decribed in @ref PadStrideInfo. + * @param[in] innvalid_right The number of zeros added to right edge of the output. + * @param[in] invalid_bottom The number of zeros added to bottom edge of the output. * * @return a status */ diff --git a/compute/ARMComputeEx/src/core/CL/CLKernelLibrary.cpp b/compute/ARMComputeEx/src/core/CL/CLKernelLibrary.cpp index 81d0cb7..1a8ff3e 100644 --- a/compute/ARMComputeEx/src/core/CL/CLKernelLibrary.cpp +++ b/compute/ARMComputeEx/src/core/CL/CLKernelLibrary.cpp @@ -54,123 +54,123 @@ using namespace arm_compute; const std::map CLKernelLibraryEx::_kernel_program_map = { - // ARMComputeEx kernels - {"arg_min_max_ex_x", "arg_min_max_ex.cl"}, - {"arg_min_max_ex_y", "arg_min_max_ex.cl"}, - {"arg_min_max_ex_z", "arg_min_max_ex.cl"}, - {"arg_min_max_ex_w", "arg_min_max_ex.cl"}, - {"binary_logical_op", "binary_logical_op.cl"}, - {"cast_bool", "cast.cl"}, - {"embedding_lookup", "embedding_lookup.cl"}, - {"gather_ex", "gather_ex.cl"}, - {"gather_ex_1d", "gather_ex.cl"}, - {"gather_ex_1d_out", "gather_ex.cl"}, - {"gemmlowp_mm_midgard_ex", "gemmlowp_ex.cl"}, - {"hashtable_lookup", "hashtable_lookup.cl"}, - {"instance_normalization_ex", "instance_normalization_ex.cl"}, - {"multiply_scale_factor", "multiply_scale_factor.cl"}, - {"neg_tensor", "neg_tensor.cl"}, - {"one_hot", "one_hot.cl"}, - {"one_hot_only_on_value", "one_hot.cl"}, - {"quantization_symm8", "quantization_symm8.cl"}, - {"reduce_min_max", "reduce_operation.cl"}, - {"reduce_sum_mean", "reduce_operation.cl"}, - {"topkv2_init", "topkv2.cl"}, - {"topkv2_find_first_negative", "topkv2.cl"}, - {"topkv2_reorder_negatives", "topkv2.cl"}, - {"topkv2_store", "topkv2.cl"}, - {"radixsort_histogram", "topkv2_radixsort.cl"}, - {"radixsort_scanhistograms", "topkv2_radixsort.cl"}, - {"radixsort_pastehistograms", "topkv2_radixsort.cl"}, - {"radixsort_reorder", "topkv2_radixsort.cl"}, - {"topkv2_quicksort", "topkv2_quicksort.cl"}, - {"scale_factor_symm8", "scale_factor.cl"}, + // ARMComputeEx kernels + {"arg_min_max_ex_x", "arg_min_max_ex.cl"}, + {"arg_min_max_ex_y", "arg_min_max_ex.cl"}, + {"arg_min_max_ex_z", "arg_min_max_ex.cl"}, + {"arg_min_max_ex_w", "arg_min_max_ex.cl"}, + {"binary_logical_op", "binary_logical_op.cl"}, + {"cast_bool", "cast.cl"}, + {"embedding_lookup", "embedding_lookup.cl"}, + {"gather_ex", "gather_ex.cl"}, + {"gather_ex_1d", "gather_ex.cl"}, + {"gather_ex_1d_out", "gather_ex.cl"}, + {"gemmlowp_mm_midgard_ex", "gemmlowp_ex.cl"}, + {"hashtable_lookup", "hashtable_lookup.cl"}, + {"instance_normalization_ex", "instance_normalization_ex.cl"}, + {"multiply_scale_factor", "multiply_scale_factor.cl"}, + {"neg_tensor", "neg_tensor.cl"}, + {"one_hot", "one_hot.cl"}, + {"one_hot_only_on_value", "one_hot.cl"}, + {"quantization_symm8", "quantization_symm8.cl"}, + {"reduce_min_max", "reduce_operation.cl"}, + {"reduce_sum_mean", "reduce_operation.cl"}, + {"topkv2_init", "topkv2.cl"}, + {"topkv2_find_first_negative", "topkv2.cl"}, + {"topkv2_reorder_negatives", "topkv2.cl"}, + {"topkv2_store", "topkv2.cl"}, + {"radixsort_histogram", "topkv2_radixsort.cl"}, + {"radixsort_scanhistograms", "topkv2_radixsort.cl"}, + {"radixsort_pastehistograms", "topkv2_radixsort.cl"}, + {"radixsort_reorder", "topkv2_radixsort.cl"}, + {"topkv2_quicksort", "topkv2_quicksort.cl"}, + {"scale_factor_symm8", "scale_factor.cl"}, }; const std::map CLKernelLibraryEx::_program_source_map = { #ifdef EMBEDDED_KERNELS - { - "arg_min_max_ex.cl", + { + "arg_min_max_ex.cl", #include "./cl_kernels/arg_min_max_ex.clembed" - }, - { - "cast.cl", + }, + { + "cast.cl", #include "./cl_kernels/cast.clembed" - }, - { - "embedding_lookup.cl", + }, + { + "embedding_lookup.cl", #include "./cl_kernels/embedding_lookup.clembed" - }, - { - "gather_ex.cl", + }, + { + "gather_ex.cl", #include "./cl_kernels/gather_ex.clembed" - }, - { - "gemmlowp_ex.cl", + }, + { + "gemmlowp_ex.cl", #include "./cl_kernels/gemmlowp_ex.clembed" - }, - { - "hashtable_lookup.cl", + }, + { + "hashtable_lookup.cl", #include "./cl_kernels/hashtable_lookup.clembed" - }, - { - "helpers.h", + }, + { + "helpers.h", #include "./cl_kernels/helpers.hembed" - }, - { - "helpers_asymm.h", + }, + { + "helpers_asymm.h", #include "./cl_kernels/helpers_asymm.hembed" - }, - { - "instance_normalization_ex.cl", + }, + { + "instance_normalization_ex.cl", #include "./cl_kernels/instance_normalization_ex.clembed" - }, - { - "binary_logical_op.cl", + }, + { + "binary_logical_op.cl", #include "./cl_kernels/binary_logical_op.clembed" - }, - { - "multiply_scale_factor.cl", + }, + { + "multiply_scale_factor.cl", #include "./cl_kernels/multiply_scale_factor.clembed" - }, - { - "neg_tensor.cl", + }, + { + "neg_tensor.cl", #include "./cl_kernels/neg_tensor.clembed" - }, - { - "one_hot.cl", + }, + { + "one_hot.cl", #include "./cl_kernels/one_hot.clembed" - }, - { - "quantization_symm8.cl", + }, + { + "quantization_symm8.cl", #include "./cl_kernels/quantization_symm8.clembed" - }, - { - "reduce_operation.cl", + }, + { + "reduce_operation.cl", #include "./cl_kernels/reduce_operation.clembed" - }, - { - "scale_factor.cl", + }, + { + "scale_factor.cl", #include "./cl_kernels/scale_factor.clembed" - }, - { - "topkv2.cl", + }, + { + "topkv2.cl", #include "./cl_kernels/topkv2.clembed" - }, - { - "topkv2_radixsort.cl", + }, + { + "topkv2_radixsort.cl", #include "./cl_kernels/topkv2_radixsort.clembed" - }, - { - "topkv2_quicksort.cl", + }, + { + "topkv2_quicksort.cl", #include "./cl_kernels/topkv2_quicksort.clembed" - }, + }, #endif /* EMBEDDED_KERNELS */ }; CLKernelLibraryEx::CLKernelLibraryEx() - : _context(), _device(), _kernel_path("."), _programs_map(), _built_programs_map() + : _context(), _device(), _kernel_path("."), _programs_map(), _built_programs_map() { opencl_is_available(); // Make sure the OpenCL symbols are initialised *before* the // CLKernelLibraryEx is built @@ -337,8 +337,8 @@ size_t CLKernelLibraryEx::max_local_workgroup_size(const cl::Kernel &kernel) con size_t err = kernel.getWorkGroupInfo(_device, CL_KERNEL_WORK_GROUP_SIZE, &result); ARM_COMPUTE_ERROR_ON_MSG( - err != 0, - "clGetKernelWorkGroupInfo failed to return the maximum workgroup size for the kernel"); + err != 0, + "clGetKernelWorkGroupInfo failed to return the maximum workgroup size for the kernel"); ARM_COMPUTE_UNUSED(err); return result; diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/arg_min_max_ex.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/arg_min_max_ex.cl index 0a014d1..135cacf 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/arg_min_max_ex.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/arg_min_max_ex.cl @@ -119,15 +119,15 @@ inline DATA_TYPE_OUTPUT arg_idx_min(__global const DATA_TYPE *input, const int x in.s01234567 = select(in.s89abcdef, in.s01234567, idx_sel); res.s01234567 = select(res.s89abcdef, res.s01234567, CONVERT(idx_sel, int8)); - idx_sel.s0123 = (in.s0123 < in.s4567) || - (in.s0123 == in.s4567 && - CONVERT((res.s0123 < res.s4567), VEC_DATA_TYPE(DATA_TYPE_SELECT, 4))); + idx_sel.s0123 = + (in.s0123 < in.s4567) || + (in.s0123 == in.s4567 && CONVERT((res.s0123 < res.s4567), VEC_DATA_TYPE(DATA_TYPE_SELECT, 4))); in.s0123 = select(in.s4567, in.s0123, idx_sel.s0123); res.s0123 = select(res.s4567, res.s0123, CONVERT(idx_sel.s0123, int4)); idx_sel.s01 = - (in.s01 < in.s23) || - (in.s01 == in.s23 && CONVERT((res.s01 < res.s23), VEC_DATA_TYPE(DATA_TYPE_SELECT, 2))); + (in.s01 < in.s23) || + (in.s01 == in.s23 && CONVERT((res.s01 < res.s23), VEC_DATA_TYPE(DATA_TYPE_SELECT, 2))); in.s01 = select(in.s23, in.s01, idx_sel.s01); res.s01 = select(res.s23, res.s01, CONVERT(idx_sel.s01, int2)); @@ -204,15 +204,15 @@ inline DATA_TYPE_OUTPUT arg_idx_max(__global const DATA_TYPE *input, const int x in.s01234567 = select(in.s89abcdef, in.s01234567, idx_sel); res.s01234567 = select(res.s89abcdef, res.s01234567, CONVERT(idx_sel, int8)); - idx_sel.s0123 = (in.s0123 > in.s4567) || - (in.s0123 == in.s4567 && - CONVERT((res.s0123 < res.s4567), VEC_DATA_TYPE(DATA_TYPE_SELECT, 4))); + idx_sel.s0123 = + (in.s0123 > in.s4567) || + (in.s0123 == in.s4567 && CONVERT((res.s0123 < res.s4567), VEC_DATA_TYPE(DATA_TYPE_SELECT, 4))); in.s0123 = select(in.s4567, in.s0123, idx_sel.s0123); res.s0123 = select(res.s4567, res.s0123, CONVERT(idx_sel.s0123, int4)); idx_sel.s01 = - (in.s01 > in.s23) || - (in.s01 == in.s23 && CONVERT((res.s01 < res.s23), VEC_DATA_TYPE(DATA_TYPE_SELECT, 2))); + (in.s01 > in.s23) || + (in.s01 == in.s23 && CONVERT((res.s01 < res.s23), VEC_DATA_TYPE(DATA_TYPE_SELECT, 2))); in.s01 = select(in.s23, in.s01, idx_sel.s01); res.s01 = select(res.s23, res.s01, CONVERT(idx_sel.s01, int2)); @@ -296,22 +296,21 @@ __kernel void arg_min_max_ex_x(IMAGE_DECLARATION(src), const uint x_idx = get_global_id(0); const uint y_idx = get_global_id(1); const __global DATA_TYPE *src_in_row = - (const __global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + - y_idx * src_step_y); + (const __global DATA_TYPE *)(src_ptr + src_offset_first_element_in_bytes + y_idx * src_step_y); for (unsigned int y = 0; y < get_local_size(1); ++y) { #if defined(ARG_MAX) #if defined(PREV_OUTPUT) - local_results[lid] = arg_idx_max_prev_out( - src_in_row, (__global DATA_TYPE_OUTPUT *)offset(&prev_res, 0, y), x_idx); + local_results[lid] = + arg_idx_max_prev_out(src_in_row, (__global DATA_TYPE_OUTPUT *)offset(&prev_res, 0, y), x_idx); #else // !defined(PREV_OUTPUT) local_results[lid] = arg_idx_max((__global DATA_TYPE *)offset(&src, 0, y), x_idx); #endif // defined(PREV_OUTPUT) #else // defined(ARG_MIN) #if defined(PREV_OUTPUT) - local_results[lid] = arg_idx_min_prev_out( - src_in_row, (__global DATA_TYPE_OUTPUT *)offset(&prev_res, 0, y), x_idx); + local_results[lid] = + arg_idx_min_prev_out(src_in_row, (__global DATA_TYPE_OUTPUT *)offset(&prev_res, 0, y), x_idx); #else // !defined(PREV_OUTPUT) local_results[lid] = arg_idx_min((__global DATA_TYPE *)offset(&src, 0, y), x_idx); #endif // defined(PREV_OUTPUT) @@ -334,12 +333,12 @@ __kernel void arg_min_max_ex_x(IMAGE_DECLARATION(src), DATA_TYPE tmp1 = *(src_in_row + local_results[lid + i]); #if defined(ARG_MAX) condition_check3 = - ((tmp0 == tmp1) && (local_results[lid + i] < local_results[lid])) || (tmp0 < tmp1); + ((tmp0 == tmp1) && (local_results[lid + i] < local_results[lid])) || (tmp0 < tmp1); local_results[lid] = select(local_results[lid], local_results[lid + i], condition_check3); #else // defined(ARG_MIN) local_results[lid] = select( - local_results[lid], local_results[lid + i], - ((tmp0 == tmp1) && (local_results[lid + i] < local_results[lid])) || (tmp0 > tmp1)); + local_results[lid], local_results[lid + i], + ((tmp0 == tmp1) && (local_results[lid + i] < local_results[lid])) || (tmp0 > tmp1)); #endif // defined(ARG_MAX) || defined(ARG_MIN) } barrier(CLK_LOCAL_MEM_FENCE); @@ -403,7 +402,7 @@ __kernel void arg_min_max_ex_y(IMAGE_DECLARATION(src), IMAGE_DECLARATION(output) { VEC_DATA_TYPE(DATA_TYPE, 16) in = - CONVERT(vload16(0, (__global DATA_TYPE *)offset(&src, 0, y)), VEC_DATA_TYPE(DATA_TYPE, 16)); + CONVERT(vload16(0, (__global DATA_TYPE *)offset(&src, 0, y)), VEC_DATA_TYPE(DATA_TYPE, 16)); VEC_DATA_TYPE(DATA_TYPE_OUTPUT, 16) cond_conv = CONVERT(CONDITION_TO_USE(in, res), VEC_DATA_TYPE(DATA_TYPE_OUTPUT, 16)); diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/binary_logical_op.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/binary_logical_op.cl index e249663..f8b5bbe 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/binary_logical_op.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/binary_logical_op.cl @@ -111,14 +111,14 @@ __kernel void binary_logical_op(TENSOR3D_DECLARATION(input1), TENSOR3D_DECLARATI #if OP_CODE == 1 // LOGICAL AND VSTORE(VEC_SIZE) (CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input1.ptr) && - VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input2.ptr), + VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input2.ptr), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)), 0, (__global DATA_TYPE *)output.ptr); #elif OP_CODE == 2 // LOGICAL OR VSTORE(VEC_SIZE) (CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input1.ptr) || - VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input2.ptr), + VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)input2.ptr), VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)), 0, (__global DATA_TYPE *)output.ptr); diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/embedding_lookup.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/embedding_lookup.cl index 92e5dfb..5ebc78d 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/embedding_lookup.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/embedding_lookup.cl @@ -117,15 +117,15 @@ __kernel void embedding_lookup(TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION // lookup ids for based on the tensor dimensions int lup_id[4] = {0}; - lup_id[0] = (NUM_DIMS == 1) ? *((__global int *)vector_offset(&lups, get_global_id(0))) - : get_global_id(0); - lup_id[1] = (NUM_DIMS == 2) ? *((__global int *)vector_offset(&lups, get_global_id(1))) - : get_global_id(1); + lup_id[0] = + (NUM_DIMS == 1) ? *((__global int *)vector_offset(&lups, get_global_id(0))) : get_global_id(0); + lup_id[1] = + (NUM_DIMS == 2) ? *((__global int *)vector_offset(&lups, get_global_id(1))) : get_global_id(1); lup_id[2] = (NUM_DIMS == 3) ? *((__global int *)vector_offset(&lups, get_global_id(2))) : get_global_id(2) % DEPTH_OUT; lup_id[3] = (NUM_DIMS == 4) - ? *((__global int *)vector_offset(&lups, get_global_id(2) / DEPTH_OUT)) - : get_global_id(2) / DEPTH_OUT; + ? *((__global int *)vector_offset(&lups, get_global_id(2) / DEPTH_OUT)) + : get_global_id(2) / DEPTH_OUT; in.ptr += input_offset_first_element_in_bytes + lup_id[0] * input_step_x + lup_id[1] * input_step_y + lup_id[2] * input_step_z + lup_id[3] * input_step_w; diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/gemmlowp_ex.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/gemmlowp_ex.cl index 80ba73d..85fc09d 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/gemmlowp_ex.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/gemmlowp_ex.cl @@ -41,7 +41,7 @@ #include "helpers.h" #if defined(NUM_ELEMS_PROCESSED_PER_THREAD_X) && defined(NUM_ELEMS_PROCESSED_PER_THREAD_Y) && \ - defined(COLS_A) + defined(COLS_A) #define VECTOR_CHAR VEC_DATA_TYPE(char, NUM_ELEMS_PROCESSED_PER_THREAD_X) #define VECTOR_INT VEC_DATA_TYPE(int, NUM_ELEMS_PROCESSED_PER_THREAD_X) #define VECTOR_FLOAT VEC_DATA_TYPE(float, NUM_ELEMS_PROCESSED_PER_THREAD_X) @@ -117,7 +117,7 @@ __kernel void gemmlowp_mm_midgard_ex(IMAGE_DECLARATION(src0), IMAGE_DECLARATION( , uint dst_cross_plane_pad #endif // REINTERPRET_OUTPUT_AS_3D - ) +) { int idx = get_global_id(0) * NUM_ELEMS_PROCESSED_PER_THREAD_X; @@ -208,9 +208,9 @@ __kernel void gemmlowp_mm_midgard_ex(IMAGE_DECLARATION(src0), IMAGE_DECLARATION( #endif // NUM_ELEMS_PROCESSED_PER_THREAD_Y > 4 // Load values from matrix B VECTOR_CHAR b0 = - VLOAD(NUM_ELEMS_PROCESSED_PER_THREAD_X)(0, (__global char *)(src1_ptr + src_addr.s1)); + VLOAD(NUM_ELEMS_PROCESSED_PER_THREAD_X)(0, (__global char *)(src1_ptr + src_addr.s1)); VECTOR_CHAR b1 = VLOAD(NUM_ELEMS_PROCESSED_PER_THREAD_X)( - 0, (__global char *)(src1_ptr + src_addr.s1 + src1_stride_y)); + 0, (__global char *)(src1_ptr + src_addr.s1 + src1_stride_y)); // Accumulate acc0 += CONVERT(b0, VECTOR_INT) * (VECTOR_INT)a0.s0; @@ -251,7 +251,7 @@ __kernel void gemmlowp_mm_midgard_ex(IMAGE_DECLARATION(src0), IMAGE_DECLARATION( #endif // NUM_ELEMS_PROCESSED_PER_THREAD_Y > 4 // Load values from matrix B VECTOR_CHAR b0 = - VLOAD(NUM_ELEMS_PROCESSED_PER_THREAD_X)(0, (__global char *)(src1_ptr + src_addr.s1)); + VLOAD(NUM_ELEMS_PROCESSED_PER_THREAD_X)(0, (__global char *)(src1_ptr + src_addr.s1)); // Accumulate acc0 += CONVERT(b0, VECTOR_INT) * (VECTOR_INT)a0; diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/hashtable_lookup.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/hashtable_lookup.cl index a4f7dbd..3ace1fd 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/hashtable_lookup.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/hashtable_lookup.cl @@ -115,15 +115,15 @@ __kernel void hashtable_lookup(TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION int lup_id[4] = {0}; - lup_id[0] = (NUM_DIMS == 1) ? *((__global int *)vector_offset(&lups, get_global_id(0))) - : get_global_id(0); - lup_id[1] = (NUM_DIMS == 2) ? *((__global int *)vector_offset(&lups, get_global_id(1))) - : get_global_id(1); + lup_id[0] = + (NUM_DIMS == 1) ? *((__global int *)vector_offset(&lups, get_global_id(0))) : get_global_id(0); + lup_id[1] = + (NUM_DIMS == 2) ? *((__global int *)vector_offset(&lups, get_global_id(1))) : get_global_id(1); lup_id[2] = (NUM_DIMS == 3) ? *((__global int *)vector_offset(&lups, get_global_id(2))) : get_global_id(2) % DEPTH_OUT; lup_id[3] = (NUM_DIMS == 4) - ? *((__global int *)vector_offset(&lups, get_global_id(2) / DEPTH_OUT)) - : get_global_id(2) / DEPTH_OUT; + ? *((__global int *)vector_offset(&lups, get_global_id(2) / DEPTH_OUT)) + : get_global_id(2) / DEPTH_OUT; if (lup_id[NUM_DIMS - 1] < 0) { diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/helpers.h b/compute/ARMComputeEx/src/core/CL/cl_kernels/helpers.h index e07a25e..4a3bc13 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/helpers.h +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/helpers.h @@ -49,7 +49,7 @@ #endif // defined(ARM_COMPUTE_OPENCL_DOT8_ENABLED) && defined(cl_arm_integer_dot_product_int8) #if defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && \ - defined(cl_arm_integer_dot_product_accumulate_int8) + defined(cl_arm_integer_dot_product_accumulate_int8) #pragma OPENCL EXTENSION cl_arm_integer_dot_product_accumulate_int8 : enable #endif // defined(ARM_COMPUTE_OPENCL_DOT8_ACC_ENABLED) && // defined(cl_arm_integer_dot_product_accumulate_int8) @@ -288,21 +288,21 @@ #define VECTOR_DECLARATION(name) \ __global uchar *name##_ptr, uint name##_stride_x, uint name##_step_x, \ - uint name##_offset_first_element_in_bytes + uint name##_offset_first_element_in_bytes #define IMAGE_DECLARATION(name) \ __global uchar *name##_ptr, uint name##_stride_x, uint name##_step_x, uint name##_stride_y, \ - uint name##_step_y, uint name##_offset_first_element_in_bytes + uint name##_step_y, uint name##_offset_first_element_in_bytes #define TENSOR3D_DECLARATION(name) \ __global uchar *name##_ptr, uint name##_stride_x, uint name##_step_x, uint name##_stride_y, \ - uint name##_step_y, uint name##_stride_z, uint name##_step_z, \ - uint name##_offset_first_element_in_bytes + uint name##_step_y, uint name##_stride_z, uint name##_step_z, \ + uint name##_offset_first_element_in_bytes #define TENSOR4D_DECLARATION(name) \ __global uchar *name##_ptr, uint name##_stride_x, uint name##_step_x, uint name##_stride_y, \ - uint name##_step_y, uint name##_stride_z, uint name##_step_z, uint name##_stride_w, \ - uint name##_step_w, uint name##_offset_first_element_in_bytes + uint name##_step_y, uint name##_stride_z, uint name##_step_z, uint name##_stride_w, \ + uint name##_step_w, uint name##_offset_first_element_in_bytes #define CONVERT_TO_VECTOR_STRUCT(name) \ update_vector_workitem_ptr(name##_ptr, name##_offset_first_element_in_bytes, name##_stride_x, \ @@ -406,9 +406,9 @@ inline Vector update_vector_workitem_ptr(__global uchar *ptr, uint offset_first_ uint stride_x, uint step_x) { Vector vector = { - .ptr = ptr, - .offset_first_element_in_bytes = offset_first_element_in_bytes, - .stride_x = stride_x, + .ptr = ptr, + .offset_first_element_in_bytes = offset_first_element_in_bytes, + .stride_x = stride_x, }; vector.ptr += vector.offset_first_element_in_bytes + get_global_id(0) * step_x; return vector; @@ -436,7 +436,7 @@ inline Image update_image_workitem_ptr(__global uchar *ptr, uint offset_first_el .stride_x = stride_x, .stride_y = stride_y}; img.ptr += - img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; + img.offset_first_element_in_bytes + get_global_id(0) * step_x + get_global_id(1) * step_y; return img; } diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/helpers_asymm.h b/compute/ARMComputeEx/src/core/CL/cl_kernels/helpers_asymm.h index 5f1b3f9..d7f1d08 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/helpers_asymm.h +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/helpers_asymm.h @@ -100,16 +100,16 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) * * @return quantized values */ -#define QUANTIZE_IMPL(type, size) \ - inline VEC_DATA_TYPE(type, size) \ - quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ - { \ - VEC_DATA_TYPE(float, size) \ - out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ - VEC_DATA_TYPE(type, size) \ - res = CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), \ - VEC_DATA_TYPE(type, size)); \ - return res; \ +#define QUANTIZE_IMPL(type, size) \ + inline VEC_DATA_TYPE(type, size) \ + quantize_##type##size(VEC_DATA_TYPE(float, size) input, float offset, float scale) \ + { \ + VEC_DATA_TYPE(float, size) \ + out_f32 = input / (VEC_DATA_TYPE(float, size))(scale) + (VEC_DATA_TYPE(float, size))(offset); \ + VEC_DATA_TYPE(type, size) \ + res = \ + CONVERT_SAT(CONVERT_DOWN_RTE(out_f32, VEC_DATA_TYPE(int, size)), VEC_DATA_TYPE(type, size)); \ + return res; \ } /** Dequantize a vector of values to floating-point @@ -119,11 +119,11 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) * * @return dequantized values in floating point */ -#define DEQUANTIZE_IMPL(type, size) \ - inline VEC_DATA_TYPE(float, size) \ - dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ - { \ - return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ +#define DEQUANTIZE_IMPL(type, size) \ + inline VEC_DATA_TYPE(float, size) \ + dequantize_##type##size(VEC_DATA_TYPE(type, size) input, float offset, float scale) \ + { \ + return (CONVERT(input, VEC_DATA_TYPE(float, size)) - offset) * scale; \ } /** Correctly-rounded-to-nearest division by a power-of-two. @@ -134,7 +134,7 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) */ #define ASYMM_ROUNDING_DIVIDE_BY_POW2_IMPL(size) \ inline VEC_DATA_TYPE(int, size) asymm_rounding_divide_by_POW2_##size( \ - VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ + VEC_DATA_TYPE(int, size) x, VEC_DATA_TYPE(int, size) exponent) \ { \ const VEC_DATA_TYPE(int, size) zero = (VEC_DATA_TYPE(int, size))0; \ const VEC_DATA_TYPE(int, size) one = (VEC_DATA_TYPE(int, size))1; \ @@ -152,32 +152,32 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) * * @return Product of two fixed-point numbers. */ -#define ASYMM_MULT_IMPL(size) \ - inline VEC_DATA_TYPE(int, size) \ - asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ - { \ - VEC_DATA_TYPE(int, size) \ - overflow = a == b && a == INT_MIN; \ - VEC_DATA_TYPE(long, size) \ - a_64 = convert_long##size(a); \ - VEC_DATA_TYPE(long, size) \ - b_64 = convert_long##size(b); \ - VEC_DATA_TYPE(long, size) \ - ab_64 = a_64 * b_64; \ - /* Revert COMPMID-907 */ \ - VEC_DATA_TYPE(long, size) \ - mask1 = 1 << 30; \ - VEC_DATA_TYPE(long, size) \ - mask2 = 1 - (1 << 30); \ - VEC_DATA_TYPE(long, size) \ - is_positive_or_zero = ab_64 >= 0; \ - VEC_DATA_TYPE(long, size) \ - nudge = select(mask2, mask1, is_positive_or_zero); \ - VEC_DATA_TYPE(long, size) \ - mask = 1ll << 31; \ - VEC_DATA_TYPE(int, size) \ - ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ - return select(ab_x2_high32, INT_MAX, overflow); \ +#define ASYMM_MULT_IMPL(size) \ + inline VEC_DATA_TYPE(int, size) \ + asymm_mult##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ + { \ + VEC_DATA_TYPE(int, size) \ + overflow = a == b && a == INT_MIN; \ + VEC_DATA_TYPE(long, size) \ + a_64 = convert_long##size(a); \ + VEC_DATA_TYPE(long, size) \ + b_64 = convert_long##size(b); \ + VEC_DATA_TYPE(long, size) \ + ab_64 = a_64 * b_64; \ + /* Revert COMPMID-907 */ \ + VEC_DATA_TYPE(long, size) \ + mask1 = 1 << 30; \ + VEC_DATA_TYPE(long, size) \ + mask2 = 1 - (1 << 30); \ + VEC_DATA_TYPE(long, size) \ + is_positive_or_zero = ab_64 >= 0; \ + VEC_DATA_TYPE(long, size) \ + nudge = select(mask2, mask1, is_positive_or_zero); \ + VEC_DATA_TYPE(long, size) \ + mask = 1ll << 31; \ + VEC_DATA_TYPE(int, size) \ + ab_x2_high32 = convert_int##size((ab_64 + nudge) / mask); \ + return select(ab_x2_high32, INT_MAX, overflow); \ } /** Calculates \f$ exp(x) \f$ for x in [-1/4, 0). @@ -186,32 +186,32 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) * * @return Result in fixed-point format Q0. */ -#define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ - inline VEC_DATA_TYPE(int, size) \ - asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) \ - a) \ - { \ - const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ - const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ - const int k_fractional_bits = 31; \ - VEC_DATA_TYPE(int, size) \ - x = a + (1 << (k_fractional_bits - 3)); \ - VEC_DATA_TYPE(int, size) \ - x2 = ASYMM_MULT(x, x, size); \ - VEC_DATA_TYPE(int, size) \ - x3 = ASYMM_MULT(x2, x, size); \ - VEC_DATA_TYPE(int, size) \ - x4 = ASYMM_MULT(x2, x2, size); \ - VEC_DATA_TYPE(int, size) \ - x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ - VEC_DATA_TYPE(int, size) \ - x4_over_24_plus_x3_over_6_plus_x2 = \ - ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ - VEC_DATA_TYPE(int, size) \ - x4_over_24_plus_x3_over_6_plus_x2_over_2 = \ - ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ - return constant_term + \ - ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ +#define ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL_IMPL(size) \ + inline VEC_DATA_TYPE(int, size) \ + asymm_exp_on_interval_between_negative_one_quarter_and_0_excl##size(VEC_DATA_TYPE(int, size) \ + a) \ + { \ + const VEC_DATA_TYPE(int, size) constant_term = 1895147668; \ + const VEC_DATA_TYPE(int, size) constant_1_over_3 = 715827883; \ + const int k_fractional_bits = 31; \ + VEC_DATA_TYPE(int, size) \ + x = a + (1 << (k_fractional_bits - 3)); \ + VEC_DATA_TYPE(int, size) \ + x2 = ASYMM_MULT(x, x, size); \ + VEC_DATA_TYPE(int, size) \ + x3 = ASYMM_MULT(x2, x, size); \ + VEC_DATA_TYPE(int, size) \ + x4 = ASYMM_MULT(x2, x2, size); \ + VEC_DATA_TYPE(int, size) \ + x4_over_4 = ASYMM_ROUNDING_DIVIDE_BY_POW2(x4, 2, size); \ + VEC_DATA_TYPE(int, size) \ + x4_over_24_plus_x3_over_6_plus_x2 = \ + ASYMM_MULT((x4_over_4 + x3), constant_1_over_3, size) + x2; \ + VEC_DATA_TYPE(int, size) \ + x4_over_24_plus_x3_over_6_plus_x2_over_2 = \ + ASYMM_ROUNDING_DIVIDE_BY_POW2(x4_over_24_plus_x3_over_6_plus_x2, 1, size); \ + return constant_term + \ + ASYMM_MULT(constant_term, x + x4_over_24_plus_x3_over_6_plus_x2_over_2, size); \ } /** Each bit of the result is set to the corresponding bit of either then_val or @@ -263,15 +263,15 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) #define EXP_BARREL_SHIFTER_IMPL(size) \ inline VEC_DATA_TYPE(int, size) exp_barrel_shifter##size( \ - VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, \ - int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ + VEC_DATA_TYPE(int, size) result, int exponent, int fp_multiplier, int k_integer_bits, \ + int k_fractional_bits, VEC_DATA_TYPE(int, size) remainder) \ { \ if (k_integer_bits > exponent) \ { \ const int k_shift_amount = k_integer_bits > exponent ? k_fractional_bits + exponent : 0; \ return ASYMM_SELECT_USING_MASK( \ - ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ - ASYMM_MULT(result, fp_multiplier, size), result, size); \ + ASYMM_MASK_IF_NON_ZERO(remainder & (1 << k_shift_amount), size), \ + ASYMM_MULT(result, fp_multiplier, size), result, size); \ } \ \ return result; \ @@ -285,7 +285,7 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) */ #define ASYMM_EXP_ON_NEGATIVE_VALUES_IMPL(size) \ inline VEC_DATA_TYPE(int, size) \ - asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ + asymm_exp_on_negative_values##size(VEC_DATA_TYPE(int, size) a, int k_integer_bits) \ { \ const int k_fractional_bits = 31 - k_integer_bits; \ VEC_DATA_TYPE(int, size) \ @@ -298,7 +298,7 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) a_mod_quarter_minus_one_quarter_scaled = a_mod_quarter_minus_one_quarter << k_integer_bits; \ VEC_DATA_TYPE(int, size) \ result = ASYMM_EXP_ON_INTERVAL_BETWEEN_NEGATIVE_ONE_QUARTER_AND_0_EXCL( \ - a_mod_quarter_minus_one_quarter_scaled, size); \ + a_mod_quarter_minus_one_quarter_scaled, size); \ VEC_DATA_TYPE(int, size) \ remainder = a_mod_quarter_minus_one_quarter - a; \ \ @@ -312,10 +312,10 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) remainder, size); \ result = EXP_BARREL_SHIFTER(result, +2, 39332535, k_integer_bits, k_fractional_bits, \ remainder, size); \ - result = EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, \ - size); \ result = \ - EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ + EXP_BARREL_SHIFTER(result, +3, 720401, k_integer_bits, k_fractional_bits, remainder, size); \ + result = \ + EXP_BARREL_SHIFTER(result, +4, 242, k_integer_bits, k_fractional_bits, remainder, size); \ \ if (k_integer_bits > 5) \ { \ @@ -335,27 +335,27 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) * * @return Arithmetic left or right shift. */ -#define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ - inline VEC_DATA_TYPE(int, size) \ - asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ - { \ - if (exponent < 0) \ - { \ - return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ - } \ - \ - const VEC_DATA_TYPE(int, size) min = INT_MIN; \ - const VEC_DATA_TYPE(int, size) max = INT_MAX; \ - int threshold = ((1 << (31 - exponent)) - 1); \ - VEC_DATA_TYPE(int, size) \ - positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ - VEC_DATA_TYPE(int, size) \ - negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ - VEC_DATA_TYPE(int, size) \ - result = x << exponent; \ - result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ - result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ - return result; \ +#define ASYMM_SATURATING_ROUNDING_MULT_BY_POW2_IMPL(size) \ + inline VEC_DATA_TYPE(int, size) \ + asymm_saturating_rounding_mult_by_pow2##size(VEC_DATA_TYPE(int, size) x, int exponent) \ + { \ + if (exponent < 0) \ + { \ + return ASYMM_ROUNDING_DIVIDE_BY_POW2(x, -exponent, size); \ + } \ + \ + const VEC_DATA_TYPE(int, size) min = INT_MIN; \ + const VEC_DATA_TYPE(int, size) max = INT_MAX; \ + int threshold = ((1 << (31 - exponent)) - 1); \ + VEC_DATA_TYPE(int, size) \ + positive_mask = ASYMM_MASK_IF_NON_ZERO(x > threshold, size); \ + VEC_DATA_TYPE(int, size) \ + negative_mask = ASYMM_MASK_IF_NON_ZERO(x < -threshold, size); \ + VEC_DATA_TYPE(int, size) \ + result = x << exponent; \ + result = ASYMM_SELECT_USING_MASK(positive_mask, max, result, size); \ + result = ASYMM_SELECT_USING_MASK(negative_mask, min, result, size); \ + return result; \ } /** Calculates (a+b)/2, rounded to the nearest integer. @@ -365,21 +365,21 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) * * @return (a+b)/2, rounded to the nearest integer. */ -#define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ - inline VEC_DATA_TYPE(int, size) \ - asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ - { \ - VEC_DATA_TYPE(long, size) \ - a64 = convert_long##size(a); \ - VEC_DATA_TYPE(long, size) \ - b64 = convert_long##size(b); \ - VEC_DATA_TYPE(long, size) \ - sum = a64 + b64; \ - const VEC_DATA_TYPE(long, size) one = 1; \ - const VEC_DATA_TYPE(long, size) minus_one = -1; \ - VEC_DATA_TYPE(long, size) \ - sign = select(minus_one, one, sum >= 0); \ - return convert_int##size((sum + sign) / 2); \ +#define ASYMM_ROUNDING_HALF_SUM_IMPL(size) \ + inline VEC_DATA_TYPE(int, size) \ + asymm_rounding_half_sum##size(VEC_DATA_TYPE(int, size) a, VEC_DATA_TYPE(int, size) b) \ + { \ + VEC_DATA_TYPE(long, size) \ + a64 = convert_long##size(a); \ + VEC_DATA_TYPE(long, size) \ + b64 = convert_long##size(b); \ + VEC_DATA_TYPE(long, size) \ + sum = a64 + b64; \ + const VEC_DATA_TYPE(long, size) one = 1; \ + const VEC_DATA_TYPE(long, size) minus_one = -1; \ + VEC_DATA_TYPE(long, size) \ + sign = select(minus_one, one, sum >= 0); \ + return convert_int##size((sum + sign) / 2); \ } /** Calculates \f$ 1 / (1 + x) \f$ for x in (0, 1). @@ -390,7 +390,7 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) */ #define ASYMM_ONE_OVER_ONE_PLUS_X_FOR_X_IN_0_1_IMPL(size) \ inline VEC_DATA_TYPE(int, size) \ - asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ + asymm_one_over_one_plus_x_for_x_in_0_1##size(VEC_DATA_TYPE(int, size) a) \ { \ const VEC_DATA_TYPE(int, size) Q0_one = INT_MAX; \ const VEC_DATA_TYPE(int, size) Q2_one = 1 << (31 - 2); \ @@ -462,14 +462,14 @@ inline float dequantize_qasymm8_signed(char input, float offset, float scale) #define ASYMM_RESCALE(value, src_integer_bits, dst_integer_bits, size) \ asymm_rescale##size(value, src_integer_bits, dst_integer_bits) -#define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ - inline VEC_DATA_TYPE(int, size) \ - multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ - { \ - const int left_shift = shift > 0 ? shift : 0; \ - const int right_shift = shift > 0 ? 0 : -shift; \ - return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), \ - right_shift, size); \ +#define MULTIPLY_BY_QUANTIZED_MULTIPLIER_IMPL(size) \ + inline VEC_DATA_TYPE(int, size) \ + multiply_by_quantized_multiplier##size(VEC_DATA_TYPE(int, size) input, int qmul, int shift) \ + { \ + const int left_shift = shift > 0 ? shift : 0; \ + const int right_shift = shift > 0 ? 0 : -shift; \ + return ASYMM_ROUNDING_DIVIDE_BY_POW2(ASYMM_MULT(input * (1 << left_shift), qmul, size), \ + right_shift, size); \ } #define MULTIPLY_BY_QUANTIZED_MULTIPLIER(input, qmul, shift, size) \ multiply_by_quantized_multiplier##size(input, qmul, shift) diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/instance_normalization_ex.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/instance_normalization_ex.cl index 0148426..96a2431 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/instance_normalization_ex.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/instance_normalization_ex.cl @@ -41,7 +41,7 @@ #include "helpers.h" #if defined(VEC_SIZE) && defined(DATA_TYPE) && defined(EPSILON) && defined(DIM_X) && \ - defined(DIM_Y) && defined(DIM_Z) + defined(DIM_Y) && defined(DIM_Z) /** This function normalizes the input 2D tensor across the first dimension with respect to mean and * standard deviation of the same dimension. * @@ -108,14 +108,14 @@ __kernel void instance_normalization_ex(TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output) #endif /* IN_PLACE */ #ifdef GAMMA - , + , VECTOR_DECLARATION(gamma) #endif // GAMMA #ifdef BETA - , + , VECTOR_DECLARATION(beta) #endif // BETA - ) +) { Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT_NO_STEP(input, 0); #ifndef IN_PLACE @@ -213,12 +213,12 @@ __kernel void instance_normalization_ex(TENSOR4D_DECLARATION(input), for (int i_h = 0; i_h < DIM_Z; ++i_h) { __global DATA_TYPE *input_address = - (__global DATA_TYPE *)tensor4D_offset(&in, ch, i_w, i_h, batch); + (__global DATA_TYPE *)tensor4D_offset(&in, ch, i_w, i_h, batch); #ifdef IN_PLACE __global DATA_TYPE *output_address = input_address; #else /* !IN_PLACE */ __global DATA_TYPE *output_address = - (__global DATA_TYPE *)tensor4D_offset(&out, ch, i_w, i_h, batch); + (__global DATA_TYPE *)tensor4D_offset(&out, ch, i_w, i_h, batch); #endif /* IN_PLACE */ *(output_address) = (*(input_address)-mean) * multip + beta; } @@ -231,12 +231,12 @@ __kernel void instance_normalization_ex(TENSOR4D_DECLARATION(input), for (; x <= (DIM_X - VEC_SIZE); x += VEC_SIZE) { __global DATA_TYPE *input_address = - (__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch); + (__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch); #ifdef IN_PLACE __global DATA_TYPE *output_address = input_address; #else /* !IN_PLACE */ __global DATA_TYPE *output_address = - (__global DATA_TYPE *)tensor4D_offset(&out, x, y, ch, batch); + (__global DATA_TYPE *)tensor4D_offset(&out, x, y, ch, batch); #endif /* IN_PLACE */ VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE) @@ -251,12 +251,12 @@ __kernel void instance_normalization_ex(TENSOR4D_DECLARATION(input), for (; x < DIM_X; ++x) { __global DATA_TYPE *input_address = - (__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch); + (__global DATA_TYPE *)tensor4D_offset(&in, x, y, ch, batch); #ifdef IN_PLACE __global DATA_TYPE *output_address = input_address; #else /* !IN_PLACE */ __global DATA_TYPE *output_address = - (__global DATA_TYPE *)tensor4D_offset(&out, x, y, ch, batch); + (__global DATA_TYPE *)tensor4D_offset(&out, x, y, ch, batch); #endif /* IN_PLACE */ *(output_address) = (*(input_address)-mean) * multip + beta; } diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/multiply_scale_factor.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/multiply_scale_factor.cl index 3943fc4..abbfbd2 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/multiply_scale_factor.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/multiply_scale_factor.cl @@ -114,8 +114,8 @@ __kernel void multiply_scale_factor(IMAGE_DECLARATION(input), VECTOR_DECLARATION (val, 0, (__global DATA_TYPE *)output.ptr); #else // !defined(VEC_SIZE) || !defined(LAST_ACCESSED_X) *((__global DATA_TYPE *)(output.ptr)) = - ((DATA_TYPE)(*((__global int *)(input.ptr)))) * - *(((__global DATA_TYPE *)(scale_ptr)) + get_global_id(1)) * (DATA_TYPE)(multiplier); + ((DATA_TYPE)(*((__global int *)(input.ptr)))) * + *(((__global DATA_TYPE *)(scale_ptr)) + get_global_id(1)) * (DATA_TYPE)(multiplier); #endif // defined(VEC_SIZE) && defined(LAST_ACCESSED_X) } diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/one_hot.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/one_hot.cl index c274aba..784a8d6 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/one_hot.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/one_hot.cl @@ -206,16 +206,16 @@ __kernel void one_hot_only_on_value(TENSOR3D_DECLARATION(indices), VECTOR_DECLAR #if AXIS == 0 *(__global DATA_TYPE *)tensor4D_offset(&output, index, px, py, pz) = - *((__global const DATA_TYPE *)on_value_ptr); + *((__global const DATA_TYPE *)on_value_ptr); #elif AXIS == 1 *(__global DATA_TYPE *)tensor4D_offset(&output, px, index, py, pz) = - *((__global const DATA_TYPE *)on_value_ptr); + *((__global const DATA_TYPE *)on_value_ptr); #elif AXIS == 2 *(__global DATA_TYPE *)tensor4D_offset(&output, px, py, index, pz) = - *((__global const DATA_TYPE *)on_value_ptr); + *((__global const DATA_TYPE *)on_value_ptr); #elif AXIS == 3 *(__global DATA_TYPE *)tensor4D_offset(&output, px, py, pz, index) = - *((__global const DATA_TYPE *)on_value_ptr); + *((__global const DATA_TYPE *)on_value_ptr); #endif // AXIS } diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/pixelwise_mul_quantized.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/pixelwise_mul_quantized.cl index 76fda90..532000e 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/pixelwise_mul_quantized.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/pixelwise_mul_quantized.cl @@ -138,7 +138,7 @@ __kernel void pixelwise_mul_qasymm8(TENSOR3D_DECLARATION(in1), TENSOR3D_DECLARAT // Multiply with a multiplier smaller than 1 out_val = - ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(out_val, RESULT_MULT_INT, RESULT_SHIFT, 16); + ASYMM_MULT_BY_QUANT_MULTIPLIER_LESS_THAN_ONE(out_val, RESULT_MULT_INT, RESULT_SHIFT, 16); out_val += (VEC_DATA_TYPE(int, 16))(RESULT_OFFSET); VEC_DATA_TYPE(uchar, 16) res = CONVERT(out_val, VEC_DATA_TYPE(uchar, 16)); diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/quantization_symm8.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/quantization_symm8.cl index 4ae9adb..c829f26 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/quantization_symm8.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/quantization_symm8.cl @@ -116,7 +116,7 @@ __kernel void quantization_symm8(IMAGE_DECLARATION(input), VECTOR_DECLARATION(sc // Create scale vector const VEC_DATA_TYPE(DATA_TYPE_IN, VEC_SIZE) vscale = - *(((__global DATA_TYPE_IN *)(scale_ptr)) + get_global_id(1)); + *(((__global DATA_TYPE_IN *)(scale_ptr)) + get_global_id(1)); // Quantize VEC_DATA_TYPE(int, VEC_SIZE) @@ -127,10 +127,10 @@ __kernel void quantization_symm8(IMAGE_DECLARATION(input), VECTOR_DECLARATION(sc (CONVERT(res, VEC_DATA_TYPE(DATA_TYPE_OUT, VEC_SIZE)), 0, (__global DATA_TYPE_OUT *)output.ptr); #else //! defined(VEC_SIZE) || !defined(LAST_ACCESSED_X) *((__global DATA_TYPE_OUT *)(output.ptr)) = (DATA_TYPE_OUT)CLAMP( - CONVERT_RTE((*(__global DATA_TYPE_IN *)input.ptr) / - (*(((__global DATA_TYPE_IN *)(scale_ptr)) + get_global_id(1))), - int), - MIN_QUANT_VAL, MAX_QUANT_VAL); + CONVERT_RTE((*(__global DATA_TYPE_IN *)input.ptr) / + (*(((__global DATA_TYPE_IN *)(scale_ptr)) + get_global_id(1))), + int), + MIN_QUANT_VAL, MAX_QUANT_VAL); #endif // defined(VEC_SIZE) && defined(LAST_ACCESSED_X) } #endif // defined(VEC_SIZE) && defined(DATA_TYPE_IN) && defined(DATA_TYPE_OUT) diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/reduce_operation.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/reduce_operation.cl index 832ac12..d0ef31b 100644 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/reduce_operation.cl +++ b/compute/ARMComputeEx/src/core/CL/cl_kernels/reduce_operation.cl @@ -100,12 +100,14 @@ __kernel void reduce_min_max(TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(o Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT(output, DEPTH_OUT); int indices[4] = { - get_global_id(0), get_global_id(1), get_global_id(2) % DEPTH_OUT, - get_global_id(2) / DEPTH_OUT, + get_global_id(0), + get_global_id(1), + get_global_id(2) % DEPTH_OUT, + get_global_id(2) / DEPTH_OUT, }; DATA_TYPE value = - *((__global DATA_TYPE *)tensor4D_offset(&in, indices[0], indices[1], indices[2], indices[3])); + *((__global DATA_TYPE *)tensor4D_offset(&in, indices[0], indices[1], indices[2], indices[3])); for (int i = 1; i < dim; ++i) { indices[axis] = i; @@ -186,16 +188,18 @@ __kernel void reduce_sum_mean(TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION( Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT(output, DEPTH_OUT); int indices[4] = { - get_global_id(0), get_global_id(1), get_global_id(2) % DEPTH_OUT, - get_global_id(2) / DEPTH_OUT, + get_global_id(0), + get_global_id(1), + get_global_id(2) % DEPTH_OUT, + get_global_id(2) / DEPTH_OUT, }; DATA_TYPE sum_value = (DATA_TYPE)0; for (int i = 0; i < dim; ++i) { indices[axis] = i; - sum_value += *( - (__global DATA_TYPE *)tensor4D_offset(&in, indices[0], indices[1], indices[2], indices[3])); + sum_value += + *((__global DATA_TYPE *)tensor4D_offset(&in, indices[0], indices[1], indices[2], indices[3])); } #if OP_CODE == 3 // REDUCE_SUM diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLArgMinMaxLayerKernelEx.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLArgMinMaxLayerKernelEx.cpp index 047004d..45307fa 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLArgMinMaxLayerKernelEx.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLArgMinMaxLayerKernelEx.cpp @@ -63,10 +63,11 @@ Status validate_arguments(const ITensorInfo *input, const ITensorInfo *prev_outp { ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input, output); ARM_COMPUTE_RETURN_ERROR_ON_F16_UNSUPPORTED(input); - ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(input, 1, DataType::QASYMM8, DataType::S32, + ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(input, 1, DataType::QASYMM8, + DataType::QASYMM8_SIGNED, DataType::S32, DataType::F16, DataType::F32); ARM_COMPUTE_RETURN_ERROR_ON_MSG(op != ReductionOperation::ARG_IDX_MAX && - op != ReductionOperation::ARG_IDX_MIN, + op != ReductionOperation::ARG_IDX_MIN, "Only ARG_IDX_MAX and ARG_IDX_MIN are supported"); ARM_COMPUTE_RETURN_ERROR_ON_MSG(axis >= TensorShape::num_max_dimensions, "Reduction axis greater than max number of dimensions"); @@ -101,13 +102,13 @@ std::tuple validate_and_configure_window(ITensorInfo *input, output_shape.set(axis, 1); DataType output_data_type = (prev_output != nullptr) ? (prev_output->data_type()) : DataType::S32; auto_init_if_empty(*output, input->clone() - ->set_tensor_shape(output_shape) - .set_data_type(output_data_type) - .reset_padding() - .set_is_resizable(true)); + ->set_tensor_shape(output_shape) + .set_data_type(output_data_type) + .reset_padding() + .set_is_resizable(true)); - Window win = calculate_max_window((prev_output != nullptr) ? (*prev_output) : (*input), - Steps(vector_size)); + Window win = + calculate_max_window((prev_output != nullptr) ? (*prev_output) : (*input), Steps(vector_size)); bool window_changed = false; switch (axis) @@ -137,15 +138,15 @@ std::tuple validate_and_configure_window(ITensorInfo *input, } Status err = (window_changed) - ? ARM_COMPUTE_CREATE_ERROR(ErrorCode::RUNTIME_ERROR, "Insufficient Padding!") - : Status{}; + ? ARM_COMPUTE_CREATE_ERROR(ErrorCode::RUNTIME_ERROR, "Insufficient Padding!") + : Status{}; return std::make_tuple(err, win); } } // namespace CLArgMinMaxLayerKernelEx::CLArgMinMaxLayerKernelEx() - : _input(nullptr), _prev_output(nullptr), _output(nullptr), _reduction_axis(0), - _op(ReductionOperation::ARG_IDX_MAX) + : _input(nullptr), _prev_output(nullptr), _output(nullptr), _reduction_axis(0), + _op(ReductionOperation::ARG_IDX_MAX) { } @@ -155,11 +156,11 @@ void CLArgMinMaxLayerKernelEx::configure(const ICLTensor *input, const ICLTensor { ARM_COMPUTE_ERROR_ON_NULLPTR(input, output); ARM_COMPUTE_ERROR_THROW_ON( - validate_arguments(input->info(), (prev_output != nullptr) ? prev_output->info() : nullptr, - output->info(), axis, op)); + validate_arguments(input->info(), (prev_output != nullptr) ? prev_output->info() : nullptr, + output->info(), axis, op)); auto win_config = validate_and_configure_window( - input->info(), (prev_output != nullptr) ? prev_output->info() : nullptr, output->info(), axis, - op); + input->info(), (prev_output != nullptr) ? prev_output->info() : nullptr, output->info(), axis, + op); ARM_COMPUTE_ERROR_THROW_ON(std::get<0>(win_config)); _input = input; @@ -213,7 +214,7 @@ void CLArgMinMaxLayerKernelEx::configure(const ICLTensor *input, const ICLTensor ARM_COMPUTE_ERROR("Not supported"); } _kernel = static_cast(CLKernelLibraryEx::get().create_kernel( - "arg_min_max_ex_" + kernel_axis_name, build_opts.options())); + "arg_min_max_ex_" + kernel_axis_name, build_opts.options())); // Configure kernel window ICLKernel::configure_internal(std::get<1>(win_config), lws_hint); @@ -225,8 +226,8 @@ Status CLArgMinMaxLayerKernelEx::validate(const ITensorInfo *input, const ITenso { ARM_COMPUTE_RETURN_ON_ERROR(validate_arguments(input, prev_output, output, axis, op)); ARM_COMPUTE_RETURN_ON_ERROR(std::get<0>(validate_and_configure_window( - input->clone().get(), (prev_output != nullptr) ? prev_output->clone().get() : nullptr, - output->clone().get(), axis, op))); + input->clone().get(), (prev_output != nullptr) ? prev_output->clone().get() : nullptr, + output->clone().get(), axis, op))); return Status{}; } diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLBinaryLogicalOpKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLBinaryLogicalOpKernel.cpp index fbc76f5..ffa2c5a 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLBinaryLogicalOpKernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLBinaryLogicalOpKernel.cpp @@ -55,7 +55,7 @@ Status validate_parameters(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) { const TensorShape &out_shape = - TensorShape::broadcast_shape(input1->tensor_shape(), input2->tensor_shape()); + TensorShape::broadcast_shape(input1->tensor_shape(), input2->tensor_shape()); ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(input1, 1, DataType::U8, DataType::QASYMM8); ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(input2, 1, DataType::U8, DataType::QASYMM8); @@ -68,15 +68,15 @@ Status validate_parameters(const ITensorInfo *input1, const ITensorInfo *input2, ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(output, 1, DataType::U8, DataType::QASYMM8); ARM_COMPUTE_RETURN_ERROR_ON_MSG( - detail::have_different_dimensions(out_shape, output->tensor_shape(), 0), - "Wrong shape for output"); + detail::have_different_dimensions(out_shape, output->tensor_shape(), 0), + "Wrong shape for output"); } return Status{}; } } // namespace CLBinaryLogicalOpKernel::CLBinaryLogicalOpKernel() - : _input1(nullptr), _input2(nullptr), _output(nullptr) + : _input1(nullptr), _input2(nullptr), _output(nullptr) { } @@ -111,13 +111,13 @@ void CLBinaryLogicalOpKernel::configure(const ICLTensor *input1, const ICLTensor build_opts.emplace(("-DOP_CODE=" + support::cpp11::to_string(op_code))); build_opts.emplace( - ("-DVEC_SIZE=" + support::cpp11::to_string(num_elems_processed_per_iteration))); + ("-DVEC_SIZE=" + support::cpp11::to_string(num_elems_processed_per_iteration))); _kernel = - static_cast(CLKernelLibraryEx::get().create_kernel(kernel_name, build_opts)); + static_cast(CLKernelLibraryEx::get().create_kernel(kernel_name, build_opts)); const std::pair broadcast_pair = - ITensorInfo::broadcast_shape_and_valid_region(*input1->info(), *input2->info()); + ITensorInfo::broadcast_shape_and_valid_region(*input1->info(), *input2->info()); const ValidRegion &valid_region = broadcast_pair.second; @@ -130,8 +130,8 @@ void CLBinaryLogicalOpKernel::configure(const ICLTensor *input1, const ICLTensor AccessWindowHorizontal output_access(output->info(), 0, num_elems_processed_per_iteration); update_window_and_padding(win_input1, input1_access) || - update_window_and_padding(win_input2, input2_access) || - update_window_and_padding(win, output_access); + update_window_and_padding(win_input2, input2_access) || + update_window_and_padding(win, output_access); output_access.set_valid_region(win, valid_region); @@ -151,7 +151,7 @@ void CLBinaryLogicalOpKernel::run(const Window &window, cl::CommandQueue &queue) if (std::min(in_shape1.total_size(), in_shape2.total_size()) > 1) { can_collapse = - (std::min(in_shape1.num_dimensions(), in_shape2.num_dimensions()) > Window::DimZ); + (std::min(in_shape1.num_dimensions(), in_shape2.num_dimensions()) > Window::DimZ); for (size_t d = Window::DimZ; can_collapse && (d < out_shape.num_dimensions()); d++) { can_collapse = (in_shape1[d] == in_shape2[d]); @@ -160,13 +160,13 @@ void CLBinaryLogicalOpKernel::run(const Window &window, cl::CommandQueue &queue) bool has_collapsed = false; Window collapsed = - can_collapse ? window.collapse_if_possible(ICLKernel::window(), Window::DimZ, &has_collapsed) - : window; + can_collapse ? window.collapse_if_possible(ICLKernel::window(), Window::DimZ, &has_collapsed) + : window; const TensorShape &in_shape1_collapsed = - has_collapsed ? in_shape1.collapsed_from(Window::DimZ) : in_shape1; + has_collapsed ? in_shape1.collapsed_from(Window::DimZ) : in_shape1; const TensorShape &in_shape2_collapsed = - has_collapsed ? in_shape2.collapsed_from(Window::DimZ) : in_shape2; + has_collapsed ? in_shape2.collapsed_from(Window::DimZ) : in_shape2; Window slice = collapsed.first_slice_window_3D(); Window slice_input1 = slice.broadcast_if_dimension_le_one(in_shape1_collapsed); @@ -189,9 +189,9 @@ void CLBinaryLogicalOpKernel::run(const Window &window, cl::CommandQueue &queue) BorderSize CLBinaryLogicalOpKernel::border_size() const { const unsigned int replicateSize = - _output->info()->dimension(0) - - std::min(_input1->info()->dimension(0), _input2->info()->dimension(0)); + _output->info()->dimension(0) - + std::min(_input1->info()->dimension(0), _input2->info()->dimension(0)); const unsigned int border = - std::min(num_elems_processed_per_iteration - 1U, replicateSize); + std::min(num_elems_processed_per_iteration - 1U, replicateSize); return BorderSize(0, border, 0, 0); } diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLCastBoolKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLCastBoolKernel.cpp index 6e0bcde..3f2ae35 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLCastBoolKernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLCastBoolKernel.cpp @@ -103,7 +103,7 @@ void CLCastBoolKernel::configure(const ICLTensor *input, ICLTensor *output) // Create kernel const std::string kernel_name = "cast_bool"; _kernel = static_cast( - CLKernelLibraryEx::get().create_kernel(kernel_name, build_opts.options())); + CLKernelLibraryEx::get().create_kernel(kernel_name, build_opts.options())); // Configure kernel ICLSimple2DKernel::configure(input, output, num_elems_processed_per_iteration); diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLEmbeddingLookupKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLEmbeddingLookupKernel.cpp index 67aaf2d..e4c617c 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLEmbeddingLookupKernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLEmbeddingLookupKernel.cpp @@ -61,14 +61,14 @@ std::pair validate_and_configure_window(ITensorInfo *input, ITen input_access.set_valid_region(win, output->valid_region()); Status err = (window_changed) - ? ARM_COMPUTE_CREATE_ERROR(ErrorCode::RUNTIME_ERROR, "Insufficient Padding!") - : Status{}; + ? ARM_COMPUTE_CREATE_ERROR(ErrorCode::RUNTIME_ERROR, "Insufficient Padding!") + : Status{}; return std::make_pair(err, win); } } // namespace CLEmbeddingLookupKernel::CLEmbeddingLookupKernel() - : _input(nullptr), _output(nullptr), _lookups(nullptr) + : _input(nullptr), _output(nullptr), _lookups(nullptr) { } @@ -77,8 +77,8 @@ Status CLEmbeddingLookupKernel::validate(const ITensorInfo *input, const ITensor { ARM_COMPUTE_ERROR_ON_NULLPTR(input, output, lookups); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN( - input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, - DataType::U32, DataType::S32, DataType::F16, DataType::F32); + input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, + DataType::U32, DataType::S32, DataType::F16, DataType::F32); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(lookups, 1, DataType::S32); ARM_COMPUTE_ERROR_ON_MISMATCHING_DATA_TYPES(input, output); @@ -108,8 +108,8 @@ void CLEmbeddingLookupKernel::configure(const ICLTensor *input, ICLTensor *outpu build_opts.emplace("-DNUM_DIMS=" + support::cpp11::to_string(_input->info()->num_dimensions())); // Create kernel - _kernel = static_cast( - CLKernelLibraryEx::get().create_kernel(kernel_name.str(), build_opts)); + _kernel = + static_cast(CLKernelLibraryEx::get().create_kernel(kernel_name.str(), build_opts)); // Configure kernel window auto win_config = validate_and_configure_window(input->info(), output->info()); diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLGatherExKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLGatherExKernel.cpp index 3bfe3e4..8b58852 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLGatherExKernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLGatherExKernel.cpp @@ -62,15 +62,15 @@ inline Status validate_arguments(const ITensorInfo *input, const ITensorInfo *in ARM_COMPUTE_RETURN_ERROR_ON(actual_axis >= input->num_dimensions()); ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(output); ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN( - input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, - DataType::U32, DataType::S32, DataType::F16, DataType::F32); + input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, + DataType::U32, DataType::S32, DataType::F16, DataType::F32); if (output->total_size() != 0) { ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(input, output); ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_QUANTIZATION_INFO(input, output); TensorShape output_shape = arm_compute::misc::shape_calculator::compute_gather_shape_ex( - input->tensor_shape(), indices->tensor_shape(), actual_axis); + input->tensor_shape(), indices->tensor_shape(), actual_axis); ARM_COMPUTE_RETURN_ERROR_ON(output_shape.total_size() != output->tensor_shape().total_size()); } @@ -86,7 +86,7 @@ std::pair validate_and_configure_window(ITensorInfo *input, ITen const uint32_t actual_axis = wrap_around(axis, static_cast(input->num_dimensions())); std::unique_ptr output_info = input->clone(); output_info->set_tensor_shape(arm_compute::misc::shape_calculator::compute_gather_shape_ex( - input->tensor_shape(), indices->tensor_shape(), actual_axis)); + input->tensor_shape(), indices->tensor_shape(), actual_axis)); // Output auto initialization if not yet initialized auto_init_if_empty((*output), output_info->tensor_shape(), 1, input->data_type()); @@ -100,7 +100,7 @@ std::pair validate_and_configure_window(ITensorInfo *input, ITen } // namespace CLGatherExKernel::CLGatherExKernel() - : _input(nullptr), _indices(nullptr), _output(nullptr), _axis(0) + : _input(nullptr), _indices(nullptr), _output(nullptr), _axis(0) { } @@ -109,11 +109,11 @@ void CLGatherExKernel::configure(const ICLTensor *input, const ICLTensor *indice { ARM_COMPUTE_ERROR_ON_NULLPTR(input, output, indices); ARM_COMPUTE_ERROR_THROW_ON( - validate_arguments(input->info(), indices->info(), output->info(), axis)); + validate_arguments(input->info(), indices->info(), output->info(), axis)); // Configure kernel window auto win_config = - validate_and_configure_window(input->info(), indices->info(), output->info(), axis); + validate_and_configure_window(input->info(), indices->info(), output->info(), axis); ARM_COMPUTE_ERROR_THROW_ON(win_config.first); _input = input; @@ -133,7 +133,7 @@ void CLGatherExKernel::configure(const ICLTensor *input, const ICLTensor *indice // Create kernel _kernel = static_cast( - CLKernelLibraryEx::get().create_kernel("gather_ex", build_opts.options())); + CLKernelLibraryEx::get().create_kernel("gather_ex", build_opts.options())); ICLKernel::configure_internal(win_config.second); } @@ -144,7 +144,7 @@ Status CLGatherExKernel::validate(const ITensorInfo *input, const ITensorInfo *i ARM_COMPUTE_RETURN_ON_ERROR(validate_and_configure_window(input->clone().get(), indices->clone().get(), output->clone().get(), axis) - .first); + .first); return Status{}; } diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLHashtableLookupKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLHashtableLookupKernel.cpp index 930e7c9..f0a761b 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLHashtableLookupKernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLHashtableLookupKernel.cpp @@ -61,8 +61,8 @@ std::pair validate_and_configure_window(ITensorInfo *input, ITen input_access.set_valid_region(win, output->valid_region()); Status err = (window_changed) - ? ARM_COMPUTE_CREATE_ERROR(ErrorCode::RUNTIME_ERROR, "Insufficient Padding!") - : Status{}; + ? ARM_COMPUTE_CREATE_ERROR(ErrorCode::RUNTIME_ERROR, "Insufficient Padding!") + : Status{}; return std::make_pair(err, win); } } // namespace @@ -78,8 +78,8 @@ Status CLHashtableLookupKernel::validate(const ITensorInfo *lookups, const ITens { ARM_COMPUTE_ERROR_ON_NULLPTR(lookups, keys, input, output, hits); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN( - input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, - DataType::U32, DataType::S32, DataType::F16, DataType::F32); + input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, + DataType::U32, DataType::S32, DataType::F16, DataType::F32); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(lookups, 1, DataType::S32); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(keys, 1, DataType::S32); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(hits, 1, DataType::U8, DataType::QASYMM8); @@ -102,7 +102,7 @@ void CLHashtableLookupKernel::configure(const ICLTensor *lookups, const ICLTenso const ICLTensor *input, ICLTensor *output, ICLTensor *hits) { ARM_COMPUTE_ERROR_THROW_ON( - validate(lookups->info(), keys->info(), input->info(), output->info(), hits->info())); + validate(lookups->info(), keys->info(), input->info(), output->info(), hits->info())); _lookups = lookups; _keys = keys; @@ -113,7 +113,7 @@ void CLHashtableLookupKernel::configure(const ICLTensor *lookups, const ICLTenso // Make _lookup_indices tensor _lookup_indices = support::cpp14::make_unique(); _lookup_indices->allocator()->init( - TensorInfo(lookups->info()->tensor_shape(), lookups->info()->num_channels(), DataType::S32)); + TensorInfo(lookups->info()->tensor_shape(), lookups->info()->num_channels(), DataType::S32)); _lookup_indices->allocator()->allocate(); // Set kernel build options @@ -127,8 +127,8 @@ void CLHashtableLookupKernel::configure(const ICLTensor *lookups, const ICLTenso build_opts.emplace("-DNUM_DIMS=" + support::cpp11::to_string(_input->info()->num_dimensions())); // Create kernel - _kernel = static_cast( - CLKernelLibraryEx::get().create_kernel(kernel_name.str(), build_opts)); + _kernel = + static_cast(CLKernelLibraryEx::get().create_kernel(kernel_name.str(), build_opts)); // Configure kernel window auto win_config = validate_and_configure_window(input->info(), output->info()); @@ -148,7 +148,7 @@ void CLHashtableLookupKernel::run(const Window &window, cl::CommandQueue &queue) // Set values of hits const int32_t *lookups_buf = - reinterpret_cast(const_cast(_lookups)->buffer()); + reinterpret_cast(const_cast(_lookups)->buffer()); const int32_t *keys_buf = reinterpret_cast(const_cast(_keys)->buffer()); uint8_t *hits_buf = reinterpret_cast(_hits->buffer()); int32_t *lookup_indices_buf = reinterpret_cast(_lookup_indices->buffer()); diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLInstanceNormalizationLayerKernelEx.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLInstanceNormalizationLayerKernelEx.cpp index 61c14d2..dab6480 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLInstanceNormalizationLayerKernelEx.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLInstanceNormalizationLayerKernelEx.cpp @@ -94,8 +94,8 @@ std::tuple validate_and_configure_window(ITensorInfo *input, ITe } // namespace CLInstanceNormalizationLayerKernelEx::CLInstanceNormalizationLayerKernelEx() - : _input(nullptr), _output(nullptr), _gamma(nullptr), _beta(nullptr), _epsilon(1e-12), - _run_in_place(false) + : _input(nullptr), _output(nullptr), _gamma(nullptr), _beta(nullptr), _epsilon(1e-12), + _run_in_place(false) { } @@ -132,7 +132,7 @@ void CLInstanceNormalizationLayerKernelEx::configure(ICLTensor *input, ICLTensor // Create kernel _kernel = static_cast( - CLKernelLibraryEx::get().create_kernel("instance_normalization_ex", build_opts.options())); + CLKernelLibraryEx::get().create_kernel("instance_normalization_ex", build_opts.options())); // Configure kernel window auto win_config = validate_and_configure_window(_input->info(), _output->info()); @@ -147,7 +147,7 @@ Status CLInstanceNormalizationLayerKernelEx::validate(const ITensorInfo *input, { ARM_COMPUTE_RETURN_ON_ERROR(validate_arguments(input, output, gamma, beta, epsilon)); ARM_COMPUTE_RETURN_ON_ERROR(std::get<0>(validate_and_configure_window( - input->clone().get(), (output == nullptr ? input->clone().get() : output->clone().get())))); + input->clone().get(), (output == nullptr ? input->clone().get() : output->clone().get())))); return Status{}; } diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLMultiplyScaleFactorKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLMultiplyScaleFactorKernel.cpp index 6b27c99..1d4b141 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLMultiplyScaleFactorKernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLMultiplyScaleFactorKernel.cpp @@ -99,7 +99,7 @@ std::tuple validate_and_configure_window(const ITensorInfo *inpu } // namespace CLMultiplyScaleFactorKernel::CLMultiplyScaleFactorKernel() - : _input(nullptr), _scale_factor(nullptr), _output(nullptr), _multiplier(1.f) + : _input(nullptr), _scale_factor(nullptr), _output(nullptr), _multiplier(1.f) { } @@ -108,7 +108,7 @@ void CLMultiplyScaleFactorKernel::configure(const ICLTensor *input, const ICLTen { ARM_COMPUTE_ERROR_ON_NULLPTR(input, output); ARM_COMPUTE_ERROR_THROW_ON( - validate_arguments(input->info(), scale_factor->info(), output->info())); + validate_arguments(input->info(), scale_factor->info(), output->info())); _input = input; _scale_factor = scale_factor; @@ -123,9 +123,9 @@ void CLMultiplyScaleFactorKernel::configure(const ICLTensor *input, const ICLTen Window win = calculate_max_window(*output->info()); if (multi_access_x) { - win.set(Window::DimX, - Window::Dimension(win.x().start(), ceil_to_multiple(win.x().end(), vec_size_x), - vec_size_x)); + win.set( + Window::DimX, + Window::Dimension(win.x().start(), ceil_to_multiple(win.x().end(), vec_size_x), vec_size_x)); } ICLKernel::configure_internal(win); @@ -134,11 +134,11 @@ void CLMultiplyScaleFactorKernel::configure(const ICLTensor *input, const ICLTen build_opts.add_option("-DVEC_SIZE=" + support::cpp11::to_string(vec_size_x)); build_opts.add_option("-DDATA_TYPE=" + get_cl_type_from_data_type(output->info()->data_type())); build_opts.add_option_if( - multi_access_x, "-DLAST_ACCESSED_X=" + - support::cpp11::to_string(std::max(output_width_x - vec_size_x, 0))); + multi_access_x, "-DLAST_ACCESSED_X=" + + support::cpp11::to_string(std::max(output_width_x - vec_size_x, 0))); _kernel = static_cast( - CLKernelLibraryEx::get().create_kernel("multiply_scale_factor", build_opts.options())); + CLKernelLibraryEx::get().create_kernel("multiply_scale_factor", build_opts.options())); } Status CLMultiplyScaleFactorKernel::validate(const ITensorInfo *input, @@ -147,7 +147,7 @@ Status CLMultiplyScaleFactorKernel::validate(const ITensorInfo *input, { ARM_COMPUTE_RETURN_ON_ERROR(validate_arguments(input, scale_factor, output)); ARM_COMPUTE_RETURN_ON_ERROR( - std::get<0>(validate_and_configure_window(input->clone().get(), output->clone().get()))); + std::get<0>(validate_and_configure_window(input->clone().get(), output->clone().get()))); return Status{}; } diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLNegKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLNegKernel.cpp index 643c8b1..ee633d4 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLNegKernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLNegKernel.cpp @@ -80,9 +80,9 @@ void CLNegKernel::configure(const ICLTensor *input, ICLTensor *output) std::set build_opts; build_opts.emplace(("-DDATA_TYPE=" + get_cl_type_from_data_type(input->info()->data_type()))); build_opts.emplace( - ("-DVEC_SIZE=" + support::cpp11::to_string(num_elems_processed_per_iteration))); + ("-DVEC_SIZE=" + support::cpp11::to_string(num_elems_processed_per_iteration))); _kernel = - static_cast(CLKernelLibraryEx::get().create_kernel("neg_tensor", build_opts)); + static_cast(CLKernelLibraryEx::get().create_kernel("neg_tensor", build_opts)); // Configure window Window win = calculate_max_window(*input->info(), Steps(num_elems_processed_per_iteration)); diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLOneHotKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLOneHotKernel.cpp index 35d70d6..0b8e7cc 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLOneHotKernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLOneHotKernel.cpp @@ -65,7 +65,7 @@ inline Status validate_arguments(const ITensorInfo *indices, const ITensorInfo * { ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(on_value, output); TensorShape output_shape = arm_compute::misc::shape_calculator::compute_onehot_shape_ex( - indices->tensor_shape(), static_cast(depth), actual_axis); + indices->tensor_shape(), static_cast(depth), actual_axis); ARM_COMPUTE_RETURN_ERROR_ON(output_shape.total_size() != output->tensor_shape().total_size()); } return Status{}; @@ -79,7 +79,7 @@ std::pair validate_and_configure_window(ITensorInfo *indices, const uint32_t actual_axis = wrap_around(axis, static_cast(output->num_dimensions())); // Output auto initialization if not yet initialized TensorShape output_shape = arm_compute::misc::shape_calculator::compute_onehot_shape_ex( - indices->tensor_shape(), static_cast(depth), actual_axis); + indices->tensor_shape(), static_cast(depth), actual_axis); auto_init_if_empty((*output), output_shape, 1, on_value->data_type()); // Create window Window win = calculate_max_window(*output, Steps()); @@ -88,8 +88,8 @@ std::pair validate_and_configure_window(ITensorInfo *indices, } } // namespace CLOneHotKernel::CLOneHotKernel() - : _indices(nullptr), _on_value(nullptr), _off_value(nullptr), _output(nullptr), - _is_off_value_memset(false) + : _indices(nullptr), _on_value(nullptr), _off_value(nullptr), _output(nullptr), + _is_off_value_memset(false) { } void CLOneHotKernel::configure(const ICLTensor *indices, const ICLTensor *on_value, @@ -114,10 +114,10 @@ void CLOneHotKernel::configure_common(const ICLTensor *indices, const ICLTensor ICLTensor *output, int depth, int axis) { ARM_COMPUTE_ERROR_THROW_ON( - validate_arguments(indices->info(), on_value->info(), output->info(), depth, axis)); + validate_arguments(indices->info(), on_value->info(), output->info(), depth, axis)); // Configure kernel window auto win_config = - validate_and_configure_window(indices->info(), on_value->info(), output->info(), depth, axis); + validate_and_configure_window(indices->info(), on_value->info(), output->info(), depth, axis); ARM_COMPUTE_ERROR_THROW_ON(win_config.first); if (_is_off_value_memset) { @@ -131,7 +131,7 @@ void CLOneHotKernel::configure_common(const ICLTensor *indices, const ICLTensor // Set build options CLBuildOptions build_opts; build_opts.add_option("-DDATA_TYPE=" + get_cl_unsigned_type_from_element_size( - data_size_from_type(on_value->info()->data_type()))); + data_size_from_type(on_value->info()->data_type()))); build_opts.add_option("-DAXIS=" + support::cpp11::to_string(actual_axis)); build_opts.add_option("-DDEPTH=" + support::cpp11::to_string(depth)); build_opts.add_option("-DOUTPUT_DIM_Z=" + @@ -139,7 +139,7 @@ void CLOneHotKernel::configure_common(const ICLTensor *indices, const ICLTensor // Create kernel const std::string kernel_name = _is_off_value_memset ? "one_hot_only_on_value" : "one_hot"; _kernel = static_cast( - CLKernelLibraryEx::get().create_kernel(kernel_name, build_opts.options())); + CLKernelLibraryEx::get().create_kernel(kernel_name, build_opts.options())); ICLKernel::configure_internal(win_config.second); } Status CLOneHotKernel::validate(const ITensorInfo *indices, const ITensorInfo *on_value, @@ -153,7 +153,7 @@ Status CLOneHotKernel::validate(const ITensorInfo *indices, const ITensorInfo *o ARM_COMPUTE_RETURN_ON_ERROR(validate_and_configure_window(indices->clone().get(), on_value->clone().get(), output->clone().get(), depth, axis) - .first); + .first); return Status{}; } Status CLOneHotKernel::validate(const ITensorInfo *indices, const ITensorInfo *on_value, @@ -163,7 +163,7 @@ Status CLOneHotKernel::validate(const ITensorInfo *indices, const ITensorInfo *o ARM_COMPUTE_RETURN_ON_ERROR(validate_and_configure_window(indices->clone().get(), on_value->clone().get(), output->clone().get(), depth, axis) - .first); + .first); return Status{}; } void CLOneHotKernel::run(const Window &window, cl::CommandQueue &queue) diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLQuantizationSymmetricKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLQuantizationSymmetricKernel.cpp index 1a7a18c..b417a71 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLQuantizationSymmetricKernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLQuantizationSymmetricKernel.cpp @@ -87,9 +87,9 @@ std::pair validate_and_configure_window(ITensorInfo *input, ITen if (multi_access_x) { - win.set(Window::DimX, - Window::Dimension(win.x().start(), ceil_to_multiple(win.x().end(), vec_size_x), - vec_size_x)); + win.set( + Window::DimX, + Window::Dimension(win.x().start(), ceil_to_multiple(win.x().end(), vec_size_x), vec_size_x)); } Coordinates coord; @@ -101,7 +101,7 @@ std::pair validate_and_configure_window(ITensorInfo *input, ITen } // namespace CLQuantizationSymmetricKernel::CLQuantizationSymmetricKernel() - : _input(nullptr), _scale_factor(nullptr), _output(nullptr) + : _input(nullptr), _scale_factor(nullptr), _output(nullptr) { } @@ -110,7 +110,7 @@ void CLQuantizationSymmetricKernel::configure(const ICLTensor *input, const ICLT { ARM_COMPUTE_ERROR_ON_NULLPTR(input, scale_factor, output); ARM_COMPUTE_ERROR_THROW_ON( - validate_arguments(input->info(), scale_factor->info(), output->info())); + validate_arguments(input->info(), scale_factor->info(), output->info())); _input = input; _scale_factor = scale_factor; @@ -132,11 +132,11 @@ void CLQuantizationSymmetricKernel::configure(const ICLTensor *input, const ICLT build_opts.add_option("-DDATA_TYPE_OUT=" + get_cl_type_from_data_type(output->info()->data_type())); build_opts.add_option_if( - multi_access_x, "-DLAST_ACCESSED_X=" + - support::cpp11::to_string(std::max(input_width_x - vec_size_x, 0))); + multi_access_x, + "-DLAST_ACCESSED_X=" + support::cpp11::to_string(std::max(input_width_x - vec_size_x, 0))); _kernel = static_cast( - CLKernelLibraryEx::get().create_kernel("quantization_symm8", build_opts.options())); + CLKernelLibraryEx::get().create_kernel("quantization_symm8", build_opts.options())); } Status CLQuantizationSymmetricKernel::validate(const ITensorInfo *input, @@ -145,7 +145,7 @@ Status CLQuantizationSymmetricKernel::validate(const ITensorInfo *input, { ARM_COMPUTE_RETURN_ON_ERROR(validate_arguments(input, scale_factor, output)); ARM_COMPUTE_RETURN_ON_ERROR( - validate_and_configure_window(input->clone().get(), output->clone().get()).first); + validate_and_configure_window(input->clone().get(), output->clone().get()).first); return Status{}; } diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLReduceOperationKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLReduceOperationKernel.cpp index 3fbebf2..3906009 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLReduceOperationKernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLReduceOperationKernel.cpp @@ -145,7 +145,7 @@ void CLReduceOperationKernel::configure(const ICLTensor *input, ICLTensor *outpu // Create kernel _kernel = - static_cast(CLKernelLibraryEx::get().create_kernel(kernel_name, build_opts)); + static_cast(CLKernelLibraryEx::get().create_kernel(kernel_name, build_opts)); // Configure kernel window Window win = calculate_max_window(*output_info, Steps()); diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLScaleFactorSymm8Kernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLScaleFactorSymm8Kernel.cpp index 8d8853c..4a63744 100644 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLScaleFactorSymm8Kernel.cpp +++ b/compute/ARMComputeEx/src/core/CL/kernels/CLScaleFactorSymm8Kernel.cpp @@ -94,8 +94,8 @@ std::tuple validate_and_configure_window(ITensorInfo *input, ITe output_access.set_valid_region(win, ValidRegion(Coordinates(), output->tensor_shape())); Status err = (window_changed) - ? ARM_COMPUTE_CREATE_ERROR(ErrorCode::RUNTIME_ERROR, "Insufficient Padding!") - : Status{}; + ? ARM_COMPUTE_CREATE_ERROR(ErrorCode::RUNTIME_ERROR, "Insufficient Padding!") + : Status{}; return std::make_tuple(err, win); } } // namespace @@ -115,7 +115,7 @@ void CLScaleFactorSymm8Kernel::configure(const ICLTensor *input, ICLTensor *outp // Create kernel _kernel = static_cast( - CLKernelLibraryEx::get().create_kernel("scale_factor_symm8", build_opts)); + CLKernelLibraryEx::get().create_kernel("scale_factor_symm8", build_opts)); auto win_config = validate_and_configure_window(input->info(), output->info()); @@ -128,7 +128,7 @@ Status CLScaleFactorSymm8Kernel::validate(const ITensorInfo *input, const ITenso { ARM_COMPUTE_RETURN_ON_ERROR(validate_arguments(input, output)); ARM_COMPUTE_RETURN_ON_ERROR( - std::get<0>(validate_and_configure_window(input->clone().get(), output->clone().get()))); + std::get<0>(validate_and_configure_window(input->clone().get(), output->clone().get()))); return Status{}; } diff --git a/compute/ARMComputeEx/src/core/NEON/NEElementwiseOperationFuncs.cpp b/compute/ARMComputeEx/src/core/NEON/NEElementwiseOperationFuncs.cpp index dfe5d59..c88bef6 100644 --- a/compute/ARMComputeEx/src/core/NEON/NEElementwiseOperationFuncs.cpp +++ b/compute/ARMComputeEx/src/core/NEON/NEElementwiseOperationFuncs.cpp @@ -53,12 +53,12 @@ namespace using namespace arm_compute; template void elementwise_op_templ( - const ITensor *in1, const ITensor *in2, ITensor *out, const Window &window, - OutputScalarType (*scalar_func)(const InputScalarType &, const InputScalarType &), - int (*broadcast_func)(int, int, int, const InputScalarType *, const InputScalarType &, - OutputScalarType *, const bool), - int (*neon_func)(int, int, int, const InputScalarType *, const InputScalarType *, - OutputScalarType *)) + const ITensor *in1, const ITensor *in2, ITensor *out, const Window &window, + OutputScalarType (*scalar_func)(const InputScalarType &, const InputScalarType &), + int (*broadcast_func)(int, int, int, const InputScalarType *, const InputScalarType &, + OutputScalarType *, const bool), + int (*neon_func)(int, int, int, const InputScalarType *, const InputScalarType *, + OutputScalarType *)) { // Create input windows Window input1_win = window.broadcast_if_dimension_le_one(in1->info()->tensor_shape()); @@ -88,26 +88,26 @@ void elementwise_op_templ( Iterator non_broadcast_input(non_broadcast_tensor, non_broadcast_win); Iterator output(out, win); - execute_window_loop(win, - [&](const Coordinates &) { - auto output_ptr = reinterpret_cast(output.ptr()); - const auto non_broadcast_input_ptr = - reinterpret_cast(non_broadcast_input.ptr()); - const InputScalarType broadcast_value = - *reinterpret_cast(broadcast_input.ptr()); - - int x = (*broadcast_func)(window_start_x, window_end_x, window_step_x, - non_broadcast_input_ptr, broadcast_value, - output_ptr, !is_broadcast_input_2); - for (; x < window_end_x; ++x) - { - const auto a = *(non_broadcast_input_ptr + x); - *(output_ptr + x) = - (*scalar_func)(!is_broadcast_input_2 ? broadcast_value : a, - !is_broadcast_input_2 ? a : broadcast_value); - } - }, - broadcast_input, non_broadcast_input, output); + execute_window_loop( + win, + [&](const Coordinates &) { + auto output_ptr = reinterpret_cast(output.ptr()); + const auto non_broadcast_input_ptr = + reinterpret_cast(non_broadcast_input.ptr()); + const InputScalarType broadcast_value = + *reinterpret_cast(broadcast_input.ptr()); + + int x = + (*broadcast_func)(window_start_x, window_end_x, window_step_x, non_broadcast_input_ptr, + broadcast_value, output_ptr, !is_broadcast_input_2); + for (; x < window_end_x; ++x) + { + const auto a = *(non_broadcast_input_ptr + x); + *(output_ptr + x) = (*scalar_func)(!is_broadcast_input_2 ? broadcast_value : a, + !is_broadcast_input_2 ? a : broadcast_value); + } + }, + broadcast_input, non_broadcast_input, output); } else { @@ -119,24 +119,23 @@ void elementwise_op_templ( Iterator input2(in2, input2_win); Iterator output(out, win); - execute_window_loop(win, - [&](const Coordinates &) { - auto output_ptr = reinterpret_cast(output.ptr()); - const auto input1_ptr = - reinterpret_cast(input1.ptr()); - const auto input2_ptr = - reinterpret_cast(input2.ptr()); - - int x = (*neon_func)(window_start_x, window_end_x, window_step_x, - input1_ptr, input2_ptr, output_ptr); - for (; x < window_end_x; ++x) - { - const auto a = *(input1_ptr + x); - const auto b = *(input2_ptr + x); - *(output_ptr + x) = (*scalar_func)(a, b); - } - }, - input1, input2, output); + execute_window_loop( + win, + [&](const Coordinates &) { + auto output_ptr = reinterpret_cast(output.ptr()); + const auto input1_ptr = reinterpret_cast(input1.ptr()); + const auto input2_ptr = reinterpret_cast(input2.ptr()); + + int x = (*neon_func)(window_start_x, window_end_x, window_step_x, input1_ptr, input2_ptr, + output_ptr); + for (; x < window_end_x; ++x) + { + const auto a = *(input1_ptr + x); + const auto b = *(input2_ptr + x); + *(output_ptr + x) = (*scalar_func)(a, b); + } + }, + input1, input2, output); } } diff --git a/compute/ARMComputeEx/src/core/NEON/kernels/NEBinaryLogicalOperationKernel.cpp b/compute/ARMComputeEx/src/core/NEON/kernels/NEBinaryLogicalOperationKernel.cpp index 32d7d62..a8464af 100644 --- a/compute/ARMComputeEx/src/core/NEON/kernels/NEBinaryLogicalOperationKernel.cpp +++ b/compute/ARMComputeEx/src/core/NEON/kernels/NEBinaryLogicalOperationKernel.cpp @@ -103,8 +103,10 @@ template inline uint8x16x4_t elementwise_logic_op(const uint8x16x4_t &a, const uint8x16x4_t &b) { uint8x16x4_t out = {{ - elementwise_logic_op(a.val[0], b.val[0]), elementwise_logic_op(a.val[1], b.val[1]), - elementwise_logic_op(a.val[2], b.val[2]), elementwise_logic_op(a.val[3], b.val[3]), + elementwise_logic_op(a.val[0], b.val[0]), + elementwise_logic_op(a.val[1], b.val[1]), + elementwise_logic_op(a.val[2], b.val[2]), + elementwise_logic_op(a.val[3], b.val[3]), }}; return out; } @@ -160,8 +162,8 @@ void elementwise_logic_op(const ITensor *in1, const ITensor *in2, ITensor *out, } std::function configure_func( - const ITensor *input1, const ITensor *input2, ITensor *output, - std::map map_function) + const ITensor *input1, const ITensor *input2, ITensor *output, + std::map map_function) { std::string function_to_call("op_"); function_to_call += string_from_data_type(input1->info()->data_type()) + "_"; @@ -184,8 +186,8 @@ std::function configure_logic_func(const ITensor *input1, const ITensor *input2, ITensor *output) { static std::map map_function = { - {"op_U8_U8_U8", &elementwise_logic_op}, - {"op_QASYMM8_QASYMM8_QASYMM8", &elementwise_logic_op}}; + {"op_U8_U8_U8", &elementwise_logic_op}, + {"op_QASYMM8_QASYMM8_QASYMM8", &elementwise_logic_op}}; return configure_func(input1, input2, output, map_function); } @@ -223,7 +225,7 @@ Status NEBinaryLogicalOperationKernel::validate_arguments(const ITensorInfo &inp ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(&input1, &input2); const TensorShape out_shape = - TensorShape::broadcast_shape(input1.tensor_shape(), input2.tensor_shape()); + TensorShape::broadcast_shape(input1.tensor_shape(), input2.tensor_shape()); ARM_COMPUTE_RETURN_ERROR_ON_MSG(out_shape.total_size() == 0, "Inputs are not broadcast compatible"); @@ -232,8 +234,8 @@ Status NEBinaryLogicalOperationKernel::validate_arguments(const ITensorInfo &inp if (output.total_size() > 0) { ARM_COMPUTE_RETURN_ERROR_ON_MSG( - detail::have_different_dimensions(out_shape, output.tensor_shape(), 0), - "Wrong shape for output"); + detail::have_different_dimensions(out_shape, output.tensor_shape(), 0), + "Wrong shape for output"); } return Status{}; diff --git a/compute/ARMComputeEx/src/core/NEON/kernels/NECastBoolKernel.cpp b/compute/ARMComputeEx/src/core/NEON/kernels/NECastBoolKernel.cpp index 12017e5..f935596 100644 --- a/compute/ARMComputeEx/src/core/NEON/kernels/NECastBoolKernel.cpp +++ b/compute/ARMComputeEx/src/core/NEON/kernels/NECastBoolKernel.cpp @@ -129,125 +129,125 @@ void NECastBoolKernel::run(const Window &window, const ThreadInfo &info) case DataType::S8: { /* Conversion U8 -> S8 */ - execute_window_loop(win, - [&](const Coordinates &) { - const auto input_ptr = reinterpret_cast(input.ptr()); - const auto output_ptr = reinterpret_cast(output.ptr()); - - int x = window_start_x; - for (; x <= (window_end_x - window_step_x); x += window_step_x) - { - const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); - - vst1q_s8(output_ptr + x, vreinterpretq_s8_u8(vandq_u8( - texels_u8, vdupq_n_u8(true_val)))); - } - - // Compute left-over elements - for (; x < window_end_x; ++x) - { - *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); - } - }, - input, output); + execute_window_loop( + win, + [&](const Coordinates &) { + const auto input_ptr = reinterpret_cast(input.ptr()); + const auto output_ptr = reinterpret_cast(output.ptr()); + + int x = window_start_x; + for (; x <= (window_end_x - window_step_x); x += window_step_x) + { + const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); + + vst1q_s8(output_ptr + x, + vreinterpretq_s8_u8(vandq_u8(texels_u8, vdupq_n_u8(true_val)))); + } + + // Compute left-over elements + for (; x < window_end_x; ++x) + { + *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); + } + }, + input, output); break; } case DataType::S16: { /* Up-conversion U8 -> S16 */ execute_window_loop( - win, - [&](const Coordinates &) { - const auto input_ptr = reinterpret_cast(input.ptr()); - const auto output_ptr = reinterpret_cast(output.ptr()); - - int x = window_start_x; - for (; x <= (window_end_x - window_step_x); x += window_step_x) - { - const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); - - const int16x8x2_t texels = { - {vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_low_u8(texels_u8), mask_bool))), - vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_high_u8(texels_u8), mask_bool)))}}; - - vst1q_s16(output_ptr + x, texels.val[0]); - vst1q_s16(output_ptr + x + 8, texels.val[1]); - } - - // Compute left-over elements - for (; x < window_end_x; ++x) - { - *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); - } - }, - input, output); + win, + [&](const Coordinates &) { + const auto input_ptr = reinterpret_cast(input.ptr()); + const auto output_ptr = reinterpret_cast(output.ptr()); + + int x = window_start_x; + for (; x <= (window_end_x - window_step_x); x += window_step_x) + { + const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); + + const int16x8x2_t texels = { + {vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_low_u8(texels_u8), mask_bool))), + vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_high_u8(texels_u8), mask_bool)))}}; + + vst1q_s16(output_ptr + x, texels.val[0]); + vst1q_s16(output_ptr + x + 8, texels.val[1]); + } + + // Compute left-over elements + for (; x < window_end_x; ++x) + { + *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); + } + }, + input, output); break; } case DataType::S32: { /* Up-conversion U8 -> S32 */ execute_window_loop( - win, - [&](const Coordinates &) { - const auto input_ptr = reinterpret_cast(input.ptr()); - const auto output_ptr = reinterpret_cast(output.ptr()); - - int x = window_start_x; - for (; x <= (window_end_x - window_step_x); x += window_step_x) - { - const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); - - const int16x8x2_t texels = { - {vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_low_u8(texels_u8), mask_bool))), - vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_high_u8(texels_u8), mask_bool)))}}; - - vst1q_s32(output_ptr + x, vmovl_s16(vget_low_s16(texels.val[0]))); - vst1q_s32(output_ptr + x + 4, vmovl_s16(vget_high_s16(texels.val[0]))); - vst1q_s32(output_ptr + x + 8, vmovl_s16(vget_low_s16(texels.val[1]))); - vst1q_s32(output_ptr + x + 12, vmovl_s16(vget_high_s16(texels.val[1]))); - } - - // Compute left-over elements - for (; x < window_end_x; ++x) - { - *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); - } - }, - input, output); + win, + [&](const Coordinates &) { + const auto input_ptr = reinterpret_cast(input.ptr()); + const auto output_ptr = reinterpret_cast(output.ptr()); + + int x = window_start_x; + for (; x <= (window_end_x - window_step_x); x += window_step_x) + { + const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); + + const int16x8x2_t texels = { + {vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_low_u8(texels_u8), mask_bool))), + vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_high_u8(texels_u8), mask_bool)))}}; + + vst1q_s32(output_ptr + x, vmovl_s16(vget_low_s16(texels.val[0]))); + vst1q_s32(output_ptr + x + 4, vmovl_s16(vget_high_s16(texels.val[0]))); + vst1q_s32(output_ptr + x + 8, vmovl_s16(vget_low_s16(texels.val[1]))); + vst1q_s32(output_ptr + x + 12, vmovl_s16(vget_high_s16(texels.val[1]))); + } + + // Compute left-over elements + for (; x < window_end_x; ++x) + { + *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); + } + }, + input, output); break; } case DataType::F32: { /* Up-conversion U8 -> F32 */ execute_window_loop( - win, - [&](const Coordinates &) { - const auto input_ptr = reinterpret_cast(input.ptr()); - const auto output_ptr = reinterpret_cast(output.ptr()); - - int x = window_start_x; - for (; x <= (window_end_x - window_step_x); x += window_step_x) - { - const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); - - const int16x8x2_t texels = { - {vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_low_u8(texels_u8), mask_bool))), - vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_high_u8(texels_u8), mask_bool)))}}; - vst1q_f32(output_ptr + x, vcvtq_f32_s32(vmovl_s16(vget_low_s16(texels.val[0])))); - vst1q_f32(output_ptr + x + 4, vcvtq_f32_s32(vmovl_s16(vget_high_s16(texels.val[0])))); - vst1q_f32(output_ptr + x + 8, vcvtq_f32_s32(vmovl_s16(vget_low_s16(texels.val[1])))); - vst1q_f32(output_ptr + x + 12, - vcvtq_f32_s32(vmovl_s16(vget_high_s16(texels.val[1])))); - } - - // Compute left-over elements - for (; x < window_end_x; ++x) - { - auto in = static_cast(*(input_ptr + x) & true_val); - *(output_ptr + x) = static_cast(in); - } - }, - input, output); + win, + [&](const Coordinates &) { + const auto input_ptr = reinterpret_cast(input.ptr()); + const auto output_ptr = reinterpret_cast(output.ptr()); + + int x = window_start_x; + for (; x <= (window_end_x - window_step_x); x += window_step_x) + { + const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); + + const int16x8x2_t texels = { + {vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_low_u8(texels_u8), mask_bool))), + vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_high_u8(texels_u8), mask_bool)))}}; + vst1q_f32(output_ptr + x, vcvtq_f32_s32(vmovl_s16(vget_low_s16(texels.val[0])))); + vst1q_f32(output_ptr + x + 4, vcvtq_f32_s32(vmovl_s16(vget_high_s16(texels.val[0])))); + vst1q_f32(output_ptr + x + 8, vcvtq_f32_s32(vmovl_s16(vget_low_s16(texels.val[1])))); + vst1q_f32(output_ptr + x + 12, vcvtq_f32_s32(vmovl_s16(vget_high_s16(texels.val[1])))); + } + + // Compute left-over elements + for (; x < window_end_x; ++x) + { + auto in = static_cast(*(input_ptr + x) & true_val); + *(output_ptr + x) = static_cast(in); + } + }, + input, output); break; } #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC @@ -255,86 +255,87 @@ void NECastBoolKernel::run(const Window &window, const ThreadInfo &info) { /* Up-conversion U8 -> F16 */ execute_window_loop( - win, - [&](const Coordinates &) { - const auto input_ptr = reinterpret_cast(input.ptr()); - const auto output_ptr = reinterpret_cast(output.ptr()); - - int x = window_start_x; - for (; x <= (window_end_x - window_step_x); x += window_step_x) - { - const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); - - const int16x8x2_t texels = { - {vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_low_u8(texels_u8), mask_bool))), - vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_high_u8(texels_u8), mask_bool)))}}; - vst1q_f16(output_ptr + x, vcvtq_f16_s16(texels.val[0])); - vst1q_f16(output_ptr + x + 8, vcvtq_f16_s16(texels.val[1])); - } - - // Compute left-over elements - for (; x < window_end_x; ++x) - { - *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); - } - }, - input, output); + win, + [&](const Coordinates &) { + const auto input_ptr = reinterpret_cast(input.ptr()); + const auto output_ptr = reinterpret_cast(output.ptr()); + + int x = window_start_x; + for (; x <= (window_end_x - window_step_x); x += window_step_x) + { + const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); + + const int16x8x2_t texels = { + {vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_low_u8(texels_u8), mask_bool))), + vreinterpretq_s16_u16(vmovl_u8(vand_u8(vget_high_u8(texels_u8), mask_bool)))}}; + vst1q_f16(output_ptr + x, vcvtq_f16_s16(texels.val[0])); + vst1q_f16(output_ptr + x + 8, vcvtq_f16_s16(texels.val[1])); + } + + // Compute left-over elements + for (; x < window_end_x; ++x) + { + *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); + } + }, + input, output); break; } #endif // __ARM_FEATURE_FP16_VECTOR_ARITHMETIC case DataType::U8: { /* Conversion U8 -> S8 */ - execute_window_loop(win, - [&](const Coordinates &) { - const auto input_ptr = reinterpret_cast(input.ptr()); - const auto output_ptr = reinterpret_cast(output.ptr()); - - int x = window_start_x; - for (; x <= (window_end_x - window_step_x); x += window_step_x) - { - const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); - - vst1q_u8(output_ptr + x, vandq_u8(texels_u8, vdupq_n_u8(true_val))); - } - - // Compute left-over elements - for (; x < window_end_x; ++x) - { - *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); - } - }, - input, output); + execute_window_loop( + win, + [&](const Coordinates &) { + const auto input_ptr = reinterpret_cast(input.ptr()); + const auto output_ptr = reinterpret_cast(output.ptr()); + + int x = window_start_x; + for (; x <= (window_end_x - window_step_x); x += window_step_x) + { + const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); + + vst1q_u8(output_ptr + x, vandq_u8(texels_u8, vdupq_n_u8(true_val))); + } + + // Compute left-over elements + for (; x < window_end_x; ++x) + { + *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); + } + }, + input, output); break; } case DataType::U16: { /* Up-conversion U8 -> U16 */ execute_window_loop( - win, - [&](const Coordinates &) { - const auto input_ptr = reinterpret_cast(input.ptr()); - const auto output_ptr = reinterpret_cast(output.ptr()); - - int x = window_start_x; - for (; x <= (window_end_x - window_step_x); x += window_step_x) - { - const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); - - const uint16x8x2_t texels = {{vmovl_u8(vand_u8(vget_low_u8(texels_u8), mask_bool)), - vmovl_u8(vand_u8(vget_high_u8(texels_u8), mask_bool))}}; - - vst1q_u16(output_ptr + x, texels.val[0]); - vst1q_u16(output_ptr + x + 8, texels.val[1]); - } - - // Compute left-over elements - for (; x < window_end_x; ++x) - { - *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); - } - }, - input, output); + win, + [&](const Coordinates &) { + const auto input_ptr = reinterpret_cast(input.ptr()); + const auto output_ptr = reinterpret_cast(output.ptr()); + + int x = window_start_x; + for (; x <= (window_end_x - window_step_x); x += window_step_x) + { + const uint8x16_t texels_u8 = vld1q_u8(input_ptr + x); + + const uint16x8x2_t texels = {{vmovl_u8(vand_u8(vget_low_u8(texels_u8), mask_bool)), + vmovl_u8(vand_u8(vget_high_u8(texels_u8), mask_bool))}}; + + vst1q_u16(output_ptr + x, texels.val[0]); + vst1q_u16(output_ptr + x + 8, texels.val[1]); + } + + // Compute left-over elements + for (; x < window_end_x; ++x) + { + *(output_ptr + x) = static_cast(*(input_ptr + x) & true_val); + } + }, + input, output); break; } default: diff --git a/compute/ARMComputeEx/src/core/NEON/kernels/NEEmbeddingLookupKernel.cpp b/compute/ARMComputeEx/src/core/NEON/kernels/NEEmbeddingLookupKernel.cpp index 091d38c..e3a77c6 100644 --- a/compute/ARMComputeEx/src/core/NEON/kernels/NEEmbeddingLookupKernel.cpp +++ b/compute/ARMComputeEx/src/core/NEON/kernels/NEEmbeddingLookupKernel.cpp @@ -50,7 +50,7 @@ using namespace arm_compute; NEEmbeddingLookupKernel::NEEmbeddingLookupKernel() - : _input(nullptr), _lookups(nullptr), _output(nullptr) + : _input(nullptr), _lookups(nullptr), _output(nullptr) { } @@ -79,8 +79,8 @@ Status NEEmbeddingLookupKernel::validate(const arm_compute::ITensorInfo *input, { ARM_COMPUTE_ERROR_ON_NULLPTR(input, output, lookups); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN( - input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, - DataType::U32, DataType::S32, DataType::F16, DataType::F32); + input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, + DataType::U32, DataType::S32, DataType::F16, DataType::F32); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(lookups, 1, DataType::S32); ARM_COMPUTE_ERROR_ON(input->num_dimensions() < 2 && input->num_dimensions() > 4); @@ -119,16 +119,17 @@ void NEEmbeddingLookupKernel::run(const Window &window, const ThreadInfo &info) { Iterator output_it(_output, out_slice); - execute_window_loop(out_slice, - [&](const Coordinates &id) { - const int32_t lookup = *reinterpret_cast( - _lookups->ptr_to_element(Coordinates{id[lookup_dim]})); - Coordinates input_id{id}; - input_id.set(lookup_dim, lookup); - memcpy(output_it.ptr(), _input->ptr_to_element(input_id), - _output->info()->dimension(0) * _output->info()->element_size()); - }, - output_it); + execute_window_loop( + out_slice, + [&](const Coordinates &id) { + const int32_t lookup = + *reinterpret_cast(_lookups->ptr_to_element(Coordinates{id[lookup_dim]})); + Coordinates input_id{id}; + input_id.set(lookup_dim, lookup); + memcpy(output_it.ptr(), _input->ptr_to_element(input_id), + _output->info()->dimension(0) * _output->info()->element_size()); + }, + output_it); } while (window.slide_window_slice_4D(out_slice)); } diff --git a/compute/ARMComputeEx/src/core/NEON/kernels/NEGatherKernelEx.cpp b/compute/ARMComputeEx/src/core/NEON/kernels/NEGatherKernelEx.cpp index 93963a5..c9f0799 100644 --- a/compute/ARMComputeEx/src/core/NEON/kernels/NEGatherKernelEx.cpp +++ b/compute/ARMComputeEx/src/core/NEON/kernels/NEGatherKernelEx.cpp @@ -71,7 +71,7 @@ template void validate_indices(const ITensor *indices) } // namespace NEGatherKernelEx::NEGatherKernelEx() - : _input{}, _indices{}, _axis{}, _indices_rank{}, _output{}, _func{} + : _input{}, _indices{}, _axis{}, _indices_rank{}, _output{}, _func{} { } @@ -85,36 +85,35 @@ inline void NEGatherKernelEx::gather_0_axis(const Window &window, const ThreadIn Iterator output_it(_output, window); execute_window_loop( - window, - [&](const Coordinates &id) { - Coordinates gather_id(id); - gather_id.collapse(_indices_rank); - - U new_index; - switch (_indices_rank) - { - case 1: - new_index = *(reinterpret_cast(_indices->ptr_to_element(Coordinates(id[0])))); - break; - case 2: - new_index = - *(reinterpret_cast(_indices->ptr_to_element(Coordinates(id[0], id[1])))); - break; - case 3: - new_index = *( - reinterpret_cast(_indices->ptr_to_element(Coordinates(id[0], id[1], id[2])))); - break; - default: - ARM_COMPUTE_ERROR("Wrong num of dimensions"); - break; - } - - gather_id.set(0, new_index); - - std::copy_n(_input->ptr_to_element(gather_id), _output->info()->element_size(), - output_it.ptr()); - }, - output_it); + window, + [&](const Coordinates &id) { + Coordinates gather_id(id); + gather_id.collapse(_indices_rank); + + U new_index; + switch (_indices_rank) + { + case 1: + new_index = *(reinterpret_cast(_indices->ptr_to_element(Coordinates(id[0])))); + break; + case 2: + new_index = *(reinterpret_cast(_indices->ptr_to_element(Coordinates(id[0], id[1])))); + break; + case 3: + new_index = + *(reinterpret_cast(_indices->ptr_to_element(Coordinates(id[0], id[1], id[2])))); + break; + default: + ARM_COMPUTE_ERROR("Wrong num of dimensions"); + break; + } + + gather_id.set(0, new_index); + + std::copy_n(_input->ptr_to_element(gather_id), _output->info()->element_size(), + output_it.ptr()); + }, + output_it); } template @@ -130,37 +129,36 @@ void NEGatherKernelEx::gather_n_axis(const Window &window, const ThreadInfo &inf Iterator output_it(_output, output_window); execute_window_loop( - output_window, - [&](const Coordinates &id) { - Coordinates gather_id(id); - gather_id.collapse(_indices_rank, _axis); - - U new_index; - switch (_indices_rank) - { - case 1: - new_index = *(reinterpret_cast(_indices->ptr_to_element(Coordinates(id[_axis])))); - break; - case 2: - new_index = *(reinterpret_cast( - _indices->ptr_to_element(Coordinates(id[_axis], id[_axis + 1])))); - break; - case 3: - new_index = *(reinterpret_cast( - _indices->ptr_to_element(Coordinates(id[_axis], id[_axis + 1], id[_axis + 2])))); - break; - default: - ARM_COMPUTE_ERROR("Wrong num of dimensions"); - break; - } - - gather_id.set(_axis, new_index); - - std::copy_n(_input->ptr_to_element(gather_id), - _input->info()->dimension(0) * _output->info()->element_size(), - output_it.ptr()); - }, - output_it); + output_window, + [&](const Coordinates &id) { + Coordinates gather_id(id); + gather_id.collapse(_indices_rank, _axis); + + U new_index; + switch (_indices_rank) + { + case 1: + new_index = *(reinterpret_cast(_indices->ptr_to_element(Coordinates(id[_axis])))); + break; + case 2: + new_index = *( + reinterpret_cast(_indices->ptr_to_element(Coordinates(id[_axis], id[_axis + 1])))); + break; + case 3: + new_index = *(reinterpret_cast( + _indices->ptr_to_element(Coordinates(id[_axis], id[_axis + 1], id[_axis + 2])))); + break; + default: + ARM_COMPUTE_ERROR("Wrong num of dimensions"); + break; + } + + gather_id.set(_axis, new_index); + + std::copy_n(_input->ptr_to_element(gather_id), + _input->info()->dimension(0) * _output->info()->element_size(), output_it.ptr()); + }, + output_it); } void NEGatherKernelEx::configure(const ITensor *input, const ITensor *indices, ITensor *output, @@ -170,8 +168,8 @@ void NEGatherKernelEx::configure(const ITensor *input, const ITensor *indices, I ARM_COMPUTE_ERROR_ON(indices->info()->num_dimensions() > 3); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(indices, 1, DataType::U32, DataType::S32); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN( - input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, - DataType::U32, DataType::S32, DataType::F16, DataType::F32); + input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, + DataType::U32, DataType::S32, DataType::F16, DataType::F32); _input = input; _indices = indices; @@ -217,7 +215,7 @@ void NEGatherKernelEx::configure(const ITensor *input, const ITensor *indices, I } // Output auto initialization if not yet initialized TensorShape output_shape = arm_compute::misc::shape_calculator::compute_gather_shape_ex( - input->info()->tensor_shape(), indices->info()->tensor_shape(), _axis); + input->info()->tensor_shape(), indices->info()->tensor_shape(), _axis); auto_init_if_empty(*output->info(), output_shape, 1, input->info()->data_type()); // Create window @@ -243,15 +241,15 @@ Status NEGatherKernelEx::validate(const ITensorInfo *input, const ITensorInfo *i ARM_COMPUTE_RETURN_ERROR_ON(0 > axis || axis >= static_cast(input->num_dimensions())); ARM_COMPUTE_RETURN_ERROR_ON_CPU_F16_UNSUPPORTED(input); ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN( - input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, - DataType::U32, DataType::S32, DataType::F16, DataType::F32); + input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, + DataType::U32, DataType::S32, DataType::F16, DataType::F32); if (output->total_size() != 0) { ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(input, output); ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_QUANTIZATION_INFO(input, output); TensorShape output_shape = arm_compute::misc::shape_calculator::compute_gather_shape_ex( - input->tensor_shape(), indices->tensor_shape(), axis); + input->tensor_shape(), indices->tensor_shape(), axis); ARM_COMPUTE_RETURN_ERROR_ON(output_shape.total_size() != output->tensor_shape().total_size()); } diff --git a/compute/ARMComputeEx/src/core/NEON/kernels/NEHashtableLookupKernel.cpp b/compute/ARMComputeEx/src/core/NEON/kernels/NEHashtableLookupKernel.cpp index 30787c0..52b40e7 100644 --- a/compute/ARMComputeEx/src/core/NEON/kernels/NEHashtableLookupKernel.cpp +++ b/compute/ARMComputeEx/src/core/NEON/kernels/NEHashtableLookupKernel.cpp @@ -57,7 +57,7 @@ constexpr size_t NOT_HIT = 0xFFFFFFFF; } // namespace NEHashtableLookupKernel::NEHashtableLookupKernel() - : _lookups(nullptr), _keys(nullptr), _input(nullptr), _output(nullptr), _hits{nullptr} + : _lookups(nullptr), _keys(nullptr), _input(nullptr), _output(nullptr), _hits{nullptr} { } @@ -66,7 +66,7 @@ void NEHashtableLookupKernel::configure(const ITensor *lookups, const ITensor *k { ARM_COMPUTE_ERROR_ON_NULLPTR(lookups, keys, input, output, hits); ARM_COMPUTE_ERROR_THROW_ON( - validate(lookups->info(), keys->info(), input->info(), output->info(), hits->info())); + validate(lookups->info(), keys->info(), input->info(), output->info(), hits->info())); _lookups = lookups; _keys = keys; @@ -92,8 +92,8 @@ Status NEHashtableLookupKernel::validate(const ITensorInfo *lookups, const ITens { ARM_COMPUTE_ERROR_ON_NULLPTR(lookups, keys, input, output, hits); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN( - input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, - DataType::U32, DataType::S32, DataType::F16, DataType::F32); + input, 1, DataType::U8, DataType::S8, DataType::QASYMM8, DataType::U16, DataType::S16, + DataType::U32, DataType::S32, DataType::F16, DataType::F32); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(lookups, 1, DataType::S32); ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(keys, 1, DataType::S32); @@ -134,8 +134,8 @@ void NEHashtableLookupKernel::run(const Window &window, const ThreadInfo &info) const size_t lookup_dim = _output->info()->num_dimensions() - 1; const int const_0 = _output->info()->data_type() == DataType::QASYMM8 - ? _output->info()->quantization_info().uniform().offset - : 0; + ? _output->info()->quantization_info().uniform().offset + : 0; std::unordered_map key_index_map; for (size_t n = 0; n < _keys->info()->dimension(0); ++n) @@ -174,24 +174,24 @@ void NEHashtableLookupKernel::run(const Window &window, const ThreadInfo &info) { Iterator output_it(_output, out_slice); - execute_window_loop(out_slice, - [&](const Coordinates &id) { - const auto lookup = lookup_indices.at(id[lookup_dim]); - if (lookup == NOT_HIT) - { - memset(output_it.ptr(), const_0, - _output->info()->dimension(0) * _output->info()->element_size()); - } - else - { - Coordinates input_id{id}; - input_id.set(lookup_dim, lookup); - memcpy(output_it.ptr(), _input->ptr_to_element(input_id), - _output->info()->dimension(0) * _output->info()->element_size()); - } - - }, - output_it); + execute_window_loop( + out_slice, + [&](const Coordinates &id) { + const auto lookup = lookup_indices.at(id[lookup_dim]); + if (lookup == NOT_HIT) + { + memset(output_it.ptr(), const_0, + _output->info()->dimension(0) * _output->info()->element_size()); + } + else + { + Coordinates input_id{id}; + input_id.set(lookup_dim, lookup); + memcpy(output_it.ptr(), _input->ptr_to_element(input_id), + _output->info()->dimension(0) * _output->info()->element_size()); + } + }, + output_it); } while (window.slide_window_slice_4D(out_slice)); } diff --git a/compute/ARMComputeEx/src/core/NEON/kernels/NEInstanceNormalizationLayerKernelEx.cpp b/compute/ARMComputeEx/src/core/NEON/kernels/NEInstanceNormalizationLayerKernelEx.cpp index 49adf14..4dc0f55 100644 --- a/compute/ARMComputeEx/src/core/NEON/kernels/NEInstanceNormalizationLayerKernelEx.cpp +++ b/compute/ARMComputeEx/src/core/NEON/kernels/NEInstanceNormalizationLayerKernelEx.cpp @@ -63,7 +63,7 @@ void instance_normalization_nchw(ITensor *input, ITensor *output, ITensor *gamma { /** NEON vector tag type. */ using ExactTagType = - typename wrapper::traits::neon_bitvector_tag_t; + typename wrapper::traits::neon_bitvector_tag_t; // Clear X/Y dimensions on execution window as we handle the planes manually Window win = window; @@ -73,107 +73,107 @@ void instance_normalization_nchw(ITensor *input, ITensor *output, ITensor *gamma constexpr int window_step_x = 16 / sizeof(T); const unsigned int elements_plane = input->info()->dimension(0) * output->info()->dimension(1); const auto channel_idx = - get_data_layout_dimension_index(input->info()->data_layout(), DataLayoutDimension::CHANNEL); + get_data_layout_dimension_index(input->info()->data_layout(), DataLayoutDimension::CHANNEL); Iterator input_it(input, win); execute_window_loop( - win, - [&](const Coordinates &id) { - Window win_plane = window; - win_plane.set(Window::DimX, Window::Dimension(0, 1, 1)); - win_plane.set(Window::DimZ, Window::Dimension(id[2], id[2] + 1, 1)); - win_plane.set(3, Window::Dimension(id[3], id[3] + 1, 1)); - - Iterator input_plane_it(input, win_plane); - Iterator output_plane_it(output, win_plane); - - auto sum_h_w = static_cast(0.f); - auto sum_squares_h_w = static_cast(0.f); - - execute_window_loop( - win_plane, - [&](const Coordinates &) { - const auto input_ptr = reinterpret_cast(input_plane_it.ptr()); - - auto vec_sum_h_w = wrapper::vdup_n(static_cast(0.f), ExactTagType{}); - auto vec_sum_squares_h_w = wrapper::vdup_n(static_cast(0.f), ExactTagType{}); - - // Compute S elements per iteration - int x = window.x().start(); - for (; x <= (window.x().end() - window_step_x); x += window_step_x) - { - auto vec_input_val = wrapper::vloadq(input_ptr + x); - vec_sum_h_w = wrapper::vadd(vec_sum_h_w, vec_input_val); - vec_sum_squares_h_w = - wrapper::vadd(vec_sum_squares_h_w, wrapper::vmul(vec_input_val, vec_input_val)); - } - - auto vec2_sum_h_w = - wrapper::vpadd(wrapper::vgethigh(vec_sum_h_w), wrapper::vgetlow(vec_sum_h_w)); - auto vec2_sum_squares_h_w = wrapper::vpadd(wrapper::vgethigh(vec_sum_squares_h_w), - wrapper::vgetlow(vec_sum_squares_h_w)); - for (int i = 0; i < window_step_x / 4; ++i) - { - vec2_sum_h_w = wrapper::vpadd(vec2_sum_h_w, vec2_sum_h_w); - vec2_sum_squares_h_w = wrapper::vpadd(vec2_sum_squares_h_w, vec2_sum_squares_h_w); - } - sum_h_w += wrapper::vgetlane(vec2_sum_h_w, 0); - sum_squares_h_w += wrapper::vgetlane(vec2_sum_squares_h_w, 0); - - // Compute left-over elements - for (; x < window.x().end(); ++x) - { - const auto value = *(input_ptr + x); - sum_h_w += value; - sum_squares_h_w += value * value; - } - }, - input_plane_it, output_plane_it); - - const auto mean_h_w = sum_h_w / elements_plane; - const auto var_h_w = sum_squares_h_w / elements_plane - mean_h_w * mean_h_w; - - auto gamma_val = 1.0f; - if (gamma != nullptr) - { - gamma_val = *reinterpret_cast(gamma->ptr_to_element({id[channel_idx]})); - } - const auto multip_h_w = gamma_val / std::sqrt(var_h_w + epsilon); - const auto vec_mean_h_w = wrapper::vdup_n(static_cast(mean_h_w), ExactTagType{}); - const auto vec_multip_h_w = wrapper::vdup_n(static_cast(multip_h_w), ExactTagType{}); - auto beta_val = 0.0f; - if (beta != nullptr) - { - beta_val = *reinterpret_cast(beta->ptr_to_element({id[channel_idx]})); - } - const auto vec_beta = wrapper::vdup_n(static_cast(beta_val), ExactTagType{}); - - execute_window_loop( - win_plane, - [&](const Coordinates &) { - auto input_ptr = reinterpret_cast(input_plane_it.ptr()); - auto output_ptr = reinterpret_cast(output_plane_it.ptr()); - - // Compute S elements per iteration - int x = window.x().start(); - auto vec_val = wrapper::vdup_n(static_cast(0.0f), ExactTagType{}); - for (; x <= (window.x().end() - window_step_x); x += window_step_x) - { - vec_val = wrapper::vloadq(input_ptr + x); - vec_val = wrapper::vadd( - wrapper::vmul(wrapper::vsub(vec_val, vec_mean_h_w), vec_multip_h_w), vec_beta); - wrapper::vstore(output_ptr + x, vec_val); - } - - // Compute left-over elements - for (; x < window.x().end(); ++x) - { - *(output_ptr + x) = ((*(input_ptr + x)) - mean_h_w) * multip_h_w + beta_val; - } - }, - input_plane_it, output_plane_it); - }, - input_it); + win, + [&](const Coordinates &id) { + Window win_plane = window; + win_plane.set(Window::DimX, Window::Dimension(0, 1, 1)); + win_plane.set(Window::DimZ, Window::Dimension(id[2], id[2] + 1, 1)); + win_plane.set(3, Window::Dimension(id[3], id[3] + 1, 1)); + + Iterator input_plane_it(input, win_plane); + Iterator output_plane_it(output, win_plane); + + auto sum_h_w = static_cast(0.f); + auto sum_squares_h_w = static_cast(0.f); + + execute_window_loop( + win_plane, + [&](const Coordinates &) { + const auto input_ptr = reinterpret_cast(input_plane_it.ptr()); + + auto vec_sum_h_w = wrapper::vdup_n(static_cast(0.f), ExactTagType{}); + auto vec_sum_squares_h_w = wrapper::vdup_n(static_cast(0.f), ExactTagType{}); + + // Compute S elements per iteration + int x = window.x().start(); + for (; x <= (window.x().end() - window_step_x); x += window_step_x) + { + auto vec_input_val = wrapper::vloadq(input_ptr + x); + vec_sum_h_w = wrapper::vadd(vec_sum_h_w, vec_input_val); + vec_sum_squares_h_w = + wrapper::vadd(vec_sum_squares_h_w, wrapper::vmul(vec_input_val, vec_input_val)); + } + + auto vec2_sum_h_w = + wrapper::vpadd(wrapper::vgethigh(vec_sum_h_w), wrapper::vgetlow(vec_sum_h_w)); + auto vec2_sum_squares_h_w = wrapper::vpadd(wrapper::vgethigh(vec_sum_squares_h_w), + wrapper::vgetlow(vec_sum_squares_h_w)); + for (int i = 0; i < window_step_x / 4; ++i) + { + vec2_sum_h_w = wrapper::vpadd(vec2_sum_h_w, vec2_sum_h_w); + vec2_sum_squares_h_w = wrapper::vpadd(vec2_sum_squares_h_w, vec2_sum_squares_h_w); + } + sum_h_w += wrapper::vgetlane(vec2_sum_h_w, 0); + sum_squares_h_w += wrapper::vgetlane(vec2_sum_squares_h_w, 0); + + // Compute left-over elements + for (; x < window.x().end(); ++x) + { + const auto value = *(input_ptr + x); + sum_h_w += value; + sum_squares_h_w += value * value; + } + }, + input_plane_it, output_plane_it); + + const auto mean_h_w = sum_h_w / elements_plane; + const auto var_h_w = sum_squares_h_w / elements_plane - mean_h_w * mean_h_w; + + auto gamma_val = 1.0f; + if (gamma != nullptr) + { + gamma_val = *reinterpret_cast(gamma->ptr_to_element({id[channel_idx]})); + } + const auto multip_h_w = gamma_val / std::sqrt(var_h_w + epsilon); + const auto vec_mean_h_w = wrapper::vdup_n(static_cast(mean_h_w), ExactTagType{}); + const auto vec_multip_h_w = wrapper::vdup_n(static_cast(multip_h_w), ExactTagType{}); + auto beta_val = 0.0f; + if (beta != nullptr) + { + beta_val = *reinterpret_cast(beta->ptr_to_element({id[channel_idx]})); + } + const auto vec_beta = wrapper::vdup_n(static_cast(beta_val), ExactTagType{}); + + execute_window_loop( + win_plane, + [&](const Coordinates &) { + auto input_ptr = reinterpret_cast(input_plane_it.ptr()); + auto output_ptr = reinterpret_cast(output_plane_it.ptr()); + + // Compute S elements per iteration + int x = window.x().start(); + auto vec_val = wrapper::vdup_n(static_cast(0.0f), ExactTagType{}); + for (; x <= (window.x().end() - window_step_x); x += window_step_x) + { + vec_val = wrapper::vloadq(input_ptr + x); + vec_val = wrapper::vadd( + wrapper::vmul(wrapper::vsub(vec_val, vec_mean_h_w), vec_multip_h_w), vec_beta); + wrapper::vstore(output_ptr + x, vec_val); + } + + // Compute left-over elements + for (; x < window.x().end(); ++x) + { + *(output_ptr + x) = ((*(input_ptr + x)) - mean_h_w) * multip_h_w + beta_val; + } + }, + input_plane_it, output_plane_it); + }, + input_it); } Status validate_arguments(const ITensorInfo *input, const ITensorInfo *output, @@ -199,8 +199,8 @@ Status validate_arguments(const ITensorInfo *input, const ITensorInfo *output, { ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(input, gamma); ARM_COMPUTE_RETURN_ERROR_ON_MSG(input->dimension(get_data_layout_dimension_index( - input->data_layout(), DataLayoutDimension::CHANNEL)) != - gamma->dimension(0), + input->data_layout(), DataLayoutDimension::CHANNEL)) != + gamma->dimension(0), "Gamma's size must be the same as size of input's channel"); } @@ -208,8 +208,8 @@ Status validate_arguments(const ITensorInfo *input, const ITensorInfo *output, { ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(input, beta); ARM_COMPUTE_RETURN_ERROR_ON_MSG(input->dimension(get_data_layout_dimension_index( - input->data_layout(), DataLayoutDimension::CHANNEL)) != - beta->dimension(0), + input->data_layout(), DataLayoutDimension::CHANNEL)) != + beta->dimension(0), "Beta's size must be the same as size of input's channel"); } @@ -234,8 +234,8 @@ std::tuple validate_and_configure_window(ITensorInfo *input, ITe } // namespace NEInstanceNormalizationLayerKernelEx::NEInstanceNormalizationLayerKernelEx() - : _func(nullptr), _input(nullptr), _output(nullptr), _gamma(nullptr), _beta(nullptr), - _epsilon(1e-12) + : _func(nullptr), _input(nullptr), _output(nullptr), _gamma(nullptr), _beta(nullptr), + _epsilon(1e-12) { } @@ -251,7 +251,7 @@ void NEInstanceNormalizationLayerKernelEx::configure(ITensor *input, ITensor *ou _epsilon = epsilon; ARM_COMPUTE_ERROR_THROW_ON( - validate_arguments(_input->info(), _output->info(), gamma->info(), beta->info(), epsilon)); + validate_arguments(_input->info(), _output->info(), gamma->info(), beta->info(), epsilon)); if (_input->info()->data_type() == DataType::F32) { @@ -282,7 +282,7 @@ Status NEInstanceNormalizationLayerKernelEx::validate(const ITensorInfo *input, { ARM_COMPUTE_RETURN_ON_ERROR(validate_arguments(input, output, gamma, beta, epsilon)); ARM_COMPUTE_RETURN_ON_ERROR(std::get<0>(validate_and_configure_window( - input->clone().get(), (output == nullptr ? input->clone().get() : output->clone().get())))); + input->clone().get(), (output == nullptr ? input->clone().get() : output->clone().get())))); return Status{}; } diff --git a/compute/ARMComputeEx/src/core/NEON/kernels/NEMultiplyScaleFactorKernel.cpp b/compute/ARMComputeEx/src/core/NEON/kernels/NEMultiplyScaleFactorKernel.cpp index b92130c..ad47281 100644 --- a/compute/ARMComputeEx/src/core/NEON/kernels/NEMultiplyScaleFactorKernel.cpp +++ b/compute/ARMComputeEx/src/core/NEON/kernels/NEMultiplyScaleFactorKernel.cpp @@ -123,15 +123,17 @@ inline float32x4x4_t multiply_scale_vec(const int32x4x4_t &iv, float scale) const float32x4_t vscale = vdupq_n_f32(scale); const float32x4x4_t ret = {{ - vmulq_f32(vcvtq_f32_s32(iv.val[0]), vscale), vmulq_f32(vcvtq_f32_s32(iv.val[1]), vscale), - vmulq_f32(vcvtq_f32_s32(iv.val[2]), vscale), vmulq_f32(vcvtq_f32_s32(iv.val[3]), vscale), + vmulq_f32(vcvtq_f32_s32(iv.val[0]), vscale), + vmulq_f32(vcvtq_f32_s32(iv.val[1]), vscale), + vmulq_f32(vcvtq_f32_s32(iv.val[2]), vscale), + vmulq_f32(vcvtq_f32_s32(iv.val[3]), vscale), }}; return ret; } } // namespace NEMultiplyScaleFactorKernel::NEMultiplyScaleFactorKernel() - : _input(nullptr), _scale_factor(nullptr), _output(nullptr), _multiplier(1.f) + : _input(nullptr), _scale_factor(nullptr), _output(nullptr), _multiplier(1.f) { } @@ -140,7 +142,7 @@ void NEMultiplyScaleFactorKernel::configure(const ITensor *input, const ITensor { ARM_COMPUTE_ERROR_ON_NULLPTR(input, output); ARM_COMPUTE_ERROR_THROW_ON( - validate_arguments(input->info(), scale_factor->info(), output->info())); + validate_arguments(input->info(), scale_factor->info(), output->info())); _input = input; _scale_factor = scale_factor; @@ -180,25 +182,25 @@ template void NEMultiplyScaleFactorKernel::multiply(const Window &w Iterator output(_output, win_collapsed); win_collapsed.set(Window::DimX, Window::Dimension(0, 1, 1)); execute_window_loop( - win_collapsed, - [&](const Coordinates &id) { - auto scale = *reinterpret_cast(_scale_factor->ptr_to_element({id.y()})); - scale *= _multiplier; - - const auto input_ptr = reinterpret_cast(input.ptr()); - auto output_ptr = reinterpret_cast(output.ptr()); - int x = window_start_x; - for (; x <= (window_end_x - window_step); x += window_step) - { - store_result(&output_ptr[x], multiply_scale_vec(load_value(&input_ptr[x]), scale)); - } - // Compute left-over elements - for (; x < window_end_x; ++x) - { - output_ptr[x] = input_ptr[x] * scale; - } - }, - input, output); + win_collapsed, + [&](const Coordinates &id) { + auto scale = *reinterpret_cast(_scale_factor->ptr_to_element({id.y()})); + scale *= _multiplier; + + const auto input_ptr = reinterpret_cast(input.ptr()); + auto output_ptr = reinterpret_cast(output.ptr()); + int x = window_start_x; + for (; x <= (window_end_x - window_step); x += window_step) + { + store_result(&output_ptr[x], multiply_scale_vec(load_value(&input_ptr[x]), scale)); + } + // Compute left-over elements + for (; x < window_end_x; ++x) + { + output_ptr[x] = input_ptr[x] * scale; + } + }, + input, output); } void NEMultiplyScaleFactorKernel::run(const Window &window, const ThreadInfo &info) diff --git a/compute/ARMComputeEx/src/core/NEON/kernels/NEOneHotKernel.cpp b/compute/ARMComputeEx/src/core/NEON/kernels/NEOneHotKernel.cpp index 0a11eb5..0daff5c 100644 --- a/compute/ARMComputeEx/src/core/NEON/kernels/NEOneHotKernel.cpp +++ b/compute/ARMComputeEx/src/core/NEON/kernels/NEOneHotKernel.cpp @@ -101,8 +101,8 @@ bool isOnValue(U index, U depth) } // namespace NEOneHotKernel::NEOneHotKernel() - : _indices{nullptr}, _depth{nullptr}, _on_value{nullptr}, _off_value{nullptr}, _axis{-1}, - _output{nullptr}, _func{} + : _indices{nullptr}, _depth{nullptr}, _on_value{nullptr}, + _off_value{nullptr}, _axis{-1}, _output{nullptr}, _func{} { } @@ -117,22 +117,22 @@ void NEOneHotKernel::onehot_0_axis(const Window &window, const ThreadInfo &info) Iterator output_it(_output, output_window); const U off_value = *reinterpret_cast(_off_value->buffer()); execute_window_loop( - output_window, - [&](const Coordinates &id) { - std::fill_n(output_it.ptr(), - _output->info()->dimension(0) * _output->info()->element_size(), off_value); - Coordinates indices_id(id); - indices_id.remove(0); - const U new_index = *(reinterpret_cast(_indices->ptr_to_element(indices_id))); - if (isOnValue(new_index, *(reinterpret_cast(_depth->buffer())))) - { - Coordinates onehot_id(id); - onehot_id.set(0, new_index); - std::copy_n(_on_value->buffer(), _output->info()->element_size(), - _output->ptr_to_element(onehot_id)); - } - }, - output_it); + output_window, + [&](const Coordinates &id) { + std::fill_n(output_it.ptr(), _output->info()->dimension(0) * _output->info()->element_size(), + off_value); + Coordinates indices_id(id); + indices_id.remove(0); + const U new_index = *(reinterpret_cast(_indices->ptr_to_element(indices_id))); + if (isOnValue(new_index, *(reinterpret_cast(_depth->buffer())))) + { + Coordinates onehot_id(id); + onehot_id.set(0, new_index); + std::copy_n(_on_value->buffer(), _output->info()->element_size(), + _output->ptr_to_element(onehot_id)); + } + }, + output_it); } template @@ -142,22 +142,22 @@ inline void NEOneHotKernel::onehot_n_axis(const Window &window, const ThreadInfo // Validate that the indices are not negative validate_depth(_depth, _output, _axis); Iterator output_it(_output, window); - execute_window_loop(window, - [&](const Coordinates &id) { - Coordinates indices_id(id); - indices_id.remove(_axis); - const U new_index = - *(reinterpret_cast(_indices->ptr_to_element(indices_id))); - if (isOnValue(new_index, *(reinterpret_cast(_depth->buffer())))) - { - Coordinates onehot_id(id); - onehot_id.set(_axis, new_index); - std::copy_n(static_cast(id[_axis]) == new_index ? _on_value->buffer() - : _off_value->buffer(), - _output->info()->element_size(), output_it.ptr()); - } - }, - output_it); + execute_window_loop( + window, + [&](const Coordinates &id) { + Coordinates indices_id(id); + indices_id.remove(_axis); + const U new_index = *(reinterpret_cast(_indices->ptr_to_element(indices_id))); + if (isOnValue(new_index, *(reinterpret_cast(_depth->buffer())))) + { + Coordinates onehot_id(id); + onehot_id.set(_axis, new_index); + std::copy_n(static_cast(id[_axis]) == new_index ? _on_value->buffer() + : _off_value->buffer(), + _output->info()->element_size(), output_it.ptr()); + } + }, + output_it); } void NEOneHotKernel::configure(const ITensor *indices, const ITensor *depth, @@ -215,7 +215,7 @@ Status NEOneHotKernel::validate(const ITensorInfo *indices, const ITensorInfo *d const ITensorInfo *output, int axis) { ARM_COMPUTE_RETURN_ON_ERROR( - validate_arguments(indices, depth, on_value, off_value, output, axis)); + validate_arguments(indices, depth, on_value, off_value, output, axis)); return Status{}; } diff --git a/compute/ARMComputeEx/src/core/NEON/kernels/NEQuantizationSymmetricKernel.cpp b/compute/ARMComputeEx/src/core/NEON/kernels/NEQuantizationSymmetricKernel.cpp index 5841f1d..2306228 100644 --- a/compute/ARMComputeEx/src/core/NEON/kernels/NEQuantizationSymmetricKernel.cpp +++ b/compute/ARMComputeEx/src/core/NEON/kernels/NEQuantizationSymmetricKernel.cpp @@ -107,19 +107,15 @@ inline int8x16_t vquantizeSymm(const float32x4x4_t &fv, float scale_factor_inv, const int32x4x4_t rf = {{ #ifdef __aarch64__ - vminq_s32(vposend, - vmaxq_s32(vnagend, vcvtnq_s32_f32(round(vmulq_f32(fv.val[0], vinvscale))))), - vminq_s32(vposend, - vmaxq_s32(vnagend, vcvtnq_s32_f32(round(vmulq_f32(fv.val[1], vinvscale))))), - vminq_s32(vposend, - vmaxq_s32(vnagend, vcvtnq_s32_f32(round(vmulq_f32(fv.val[2], vinvscale))))), - vminq_s32(vposend, - vmaxq_s32(vnagend, vcvtnq_s32_f32(round(vmulq_f32(fv.val[3], vinvscale))))), + vminq_s32(vposend, vmaxq_s32(vnagend, vcvtnq_s32_f32(round(vmulq_f32(fv.val[0], vinvscale))))), + vminq_s32(vposend, vmaxq_s32(vnagend, vcvtnq_s32_f32(round(vmulq_f32(fv.val[1], vinvscale))))), + vminq_s32(vposend, vmaxq_s32(vnagend, vcvtnq_s32_f32(round(vmulq_f32(fv.val[2], vinvscale))))), + vminq_s32(vposend, vmaxq_s32(vnagend, vcvtnq_s32_f32(round(vmulq_f32(fv.val[3], vinvscale))))), #else //__aarch64__ - vminq_s32(vposend, vmaxq_s32(vnagend, vcvtq_s32_f32(round(vmulq_f32(fv.val[0], vinvscale))))), - vminq_s32(vposend, vmaxq_s32(vnagend, vcvtq_s32_f32(round(vmulq_f32(fv.val[1], vinvscale))))), - vminq_s32(vposend, vmaxq_s32(vnagend, vcvtq_s32_f32(round(vmulq_f32(fv.val[2], vinvscale))))), - vminq_s32(vposend, vmaxq_s32(vnagend, vcvtq_s32_f32(round(vmulq_f32(fv.val[3], vinvscale))))), + vminq_s32(vposend, vmaxq_s32(vnagend, vcvtq_s32_f32(round(vmulq_f32(fv.val[0], vinvscale))))), + vminq_s32(vposend, vmaxq_s32(vnagend, vcvtq_s32_f32(round(vmulq_f32(fv.val[1], vinvscale))))), + vminq_s32(vposend, vmaxq_s32(vnagend, vcvtq_s32_f32(round(vmulq_f32(fv.val[2], vinvscale))))), + vminq_s32(vposend, vmaxq_s32(vnagend, vcvtq_s32_f32(round(vmulq_f32(fv.val[3], vinvscale))))), #endif //__aarch64__ }}; const int8x8_t pa = vqmovn_s16(vcombine_s16(vqmovn_s32(rf.val[0]), vqmovn_s32(rf.val[1]))); @@ -129,7 +125,7 @@ inline int8x16_t vquantizeSymm(const float32x4x4_t &fv, float scale_factor_inv, } // namespace NEQuantizationSymmetricKernel::NEQuantizationSymmetricKernel() - : _input(nullptr), _output(nullptr), _scale_factor(nullptr) + : _input(nullptr), _output(nullptr), _scale_factor(nullptr) { } @@ -138,7 +134,7 @@ void NEQuantizationSymmetricKernel::configure(const ITensor *input, ITensor *out { ARM_COMPUTE_ERROR_ON_NULLPTR(input, output); ARM_COMPUTE_ERROR_THROW_ON( - validate_arguments(input->info(), output->info(), scale_factor->info())); + validate_arguments(input->info(), output->info(), scale_factor->info())); _input = input; _output = output; @@ -182,40 +178,40 @@ template void NEQuantizationSymmetricKernel::quantize(const Window const auto dim_x = _input->info()->dimension(0); win_collapsed.set(Window::DimX, Window::Dimension(0, 1, 1)); execute_window_loop( - win_collapsed, - [&](const Coordinates &id) { - const auto start = reinterpret_cast(input.ptr()); - const auto min_max = std::minmax_element(start, start + dim_x); - const auto int8_scale = 127; - auto range = std::max(std::abs(*min_max.first), std::abs(*min_max.second)); - if (range == 0) - { - *reinterpret_cast(_scale_factor->ptr_to_element({id.y()})) = 1; - range = 1; - } - else - { - *reinterpret_cast(_scale_factor->ptr_to_element({id.y()})) = range / int8_scale; - } - const auto scale_factor_inv = int8_scale / range; - - auto input_ptr = reinterpret_cast(input.ptr()); - auto output_ptr = reinterpret_cast(output.ptr()); - int x = window_start_x; - for (; x <= (window_end_x - window_step); x += window_step) - { - wrapper::vstore(&output_ptr[x], - vquantizeSymm(load_value(&input_ptr[x]), scale_factor_inv, int8_scale)); - } - // Compute left-over elements - for (; x < window_end_x; ++x) - { - int quantized = arm_compute::round(input_ptr[x] * scale_factor_inv, rounding_policy); - quantized = std::min(int8_scale, std::max(quantized, -int8_scale)); - output_ptr[x] = static_cast(quantized); - } - }, - input, output); + win_collapsed, + [&](const Coordinates &id) { + const auto start = reinterpret_cast(input.ptr()); + const auto min_max = std::minmax_element(start, start + dim_x); + const auto int8_scale = 127; + auto range = std::max(std::abs(*min_max.first), std::abs(*min_max.second)); + if (range == 0) + { + *reinterpret_cast(_scale_factor->ptr_to_element({id.y()})) = 1; + range = 1; + } + else + { + *reinterpret_cast(_scale_factor->ptr_to_element({id.y()})) = range / int8_scale; + } + const auto scale_factor_inv = int8_scale / range; + + auto input_ptr = reinterpret_cast(input.ptr()); + auto output_ptr = reinterpret_cast(output.ptr()); + int x = window_start_x; + for (; x <= (window_end_x - window_step); x += window_step) + { + wrapper::vstore(&output_ptr[x], + vquantizeSymm(load_value(&input_ptr[x]), scale_factor_inv, int8_scale)); + } + // Compute left-over elements + for (; x < window_end_x; ++x) + { + int quantized = arm_compute::round(input_ptr[x] * scale_factor_inv, rounding_policy); + quantized = std::min(int8_scale, std::max(quantized, -int8_scale)); + output_ptr[x] = static_cast(quantized); + } + }, + input, output); } void NEQuantizationSymmetricKernel::run(const Window &window, const ThreadInfo &info) diff --git a/compute/ARMComputeEx/src/runtime/CL/functions/CLArgMinMaxLayerEx.cpp b/compute/ARMComputeEx/src/runtime/CL/functions/CLArgMinMaxLayerEx.cpp index 267228e..b02a48e 100644 --- a/compute/ARMComputeEx/src/runtime/CL/functions/CLArgMinMaxLayerEx.cpp +++ b/compute/ARMComputeEx/src/runtime/CL/functions/CLArgMinMaxLayerEx.cpp @@ -50,8 +50,8 @@ namespace arm_compute { CLArgMinMaxLayerEx::CLArgMinMaxLayerEx(std::shared_ptr memory_manager) - : _memory_group(std::move(memory_manager)), _results_vector(), _not_reshaped_output(), - _reduction_kernels_vector(), _reshape_kernel(), _num_of_stages(), _reduction_axis() + : _memory_group(std::move(memory_manager)), _results_vector(), _not_reshaped_output(), + _reduction_kernels_vector(), _reshape_kernel(), _num_of_stages(), _reduction_axis() { } @@ -60,13 +60,13 @@ Status CLArgMinMaxLayerEx::validate(const ITensorInfo *input, int axis, const IT { ARM_COMPUTE_ERROR_ON_NULLPTR(input, output); ARM_COMPUTE_RETURN_ERROR_ON_MSG(op != ReductionOperation::ARG_IDX_MAX && - op != ReductionOperation::ARG_IDX_MIN, + op != ReductionOperation::ARG_IDX_MIN, "Invalid reduction operation"); ARM_COMPUTE_RETURN_ERROR_ON_MSG(axis >= static_cast(TensorShape::num_max_dimensions), "Reduction axis greater than max number of dimensions"); ARM_COMPUTE_RETURN_ERROR_ON_MSG(axis > 3, "Unsupported reduction axis"); const unsigned int num_of_stages = - calculate_number_of_stages_only_x_axis(input->dimension(0), axis); + calculate_number_of_stages_only_x_axis(input->dimension(0), axis); DataType output_data_type = DataType::S32; TensorInfo not_reshaped_output; @@ -76,9 +76,9 @@ Status CLArgMinMaxLayerEx::validate(const ITensorInfo *input, int axis, const IT if (output->total_size() != 0) { output_data_type = output->data_type(); - const TensorInfo expected_output_shape = output->clone()->set_tensor_shape( - arm_compute::misc::shape_calculator::compute_reduced_shape(input->tensor_shape(), axis, - false)); + const TensorInfo expected_output_shape = + output->clone()->set_tensor_shape(arm_compute::misc::shape_calculator::compute_reduced_shape( + input->tensor_shape(), axis, false)); ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_SHAPES(&expected_output_shape, output); } @@ -87,9 +87,9 @@ Status CLArgMinMaxLayerEx::validate(const ITensorInfo *input, int axis, const IT auto initialize_tensorinfo = [](TensorInfo &ti, TensorShape shape, DataType data_type, int num_channels, QuantizationInfo qinfo) { ti.set_data_type(data_type) - .set_tensor_shape(shape) - .set_num_channels(num_channels) - .set_quantization_info(qinfo); + .set_tensor_shape(shape) + .set_num_channels(num_channels) + .set_quantization_info(qinfo); }; initialize_tensorinfo(not_reshaped_output, shape_before_reshape, output_data_type, @@ -98,7 +98,7 @@ Status CLArgMinMaxLayerEx::validate(const ITensorInfo *input, int axis, const IT if (num_of_stages == 1) { ARM_COMPUTE_RETURN_ON_ERROR( - CLArgMinMaxLayerKernelEx::validate(input, nullptr, ¬_reshaped_output, axis, op)); + CLArgMinMaxLayerKernelEx::validate(input, nullptr, ¬_reshaped_output, axis, op)); } else { @@ -118,19 +118,19 @@ Status CLArgMinMaxLayerEx::validate(const ITensorInfo *input, int axis, const IT // Validate ReductionOperation only on first kernel ARM_COMPUTE_RETURN_ON_ERROR( - CLArgMinMaxLayerKernelEx::validate(input, nullptr, &sums_vector[0], axis, op)); + CLArgMinMaxLayerKernelEx::validate(input, nullptr, &sums_vector[0], axis, op)); // Validate ReductionOperation on intermediate stages for (unsigned int i = 1; i < num_of_stages - 1; ++i) { - ARM_COMPUTE_RETURN_ON_ERROR(CLArgMinMaxLayerKernelEx::validate(input, &sums_vector[i - 1], - &sums_vector[i], axis, op)); + ARM_COMPUTE_RETURN_ON_ERROR( + CLArgMinMaxLayerKernelEx::validate(input, &sums_vector[i - 1], &sums_vector[i], axis, op)); } // Validate ReductionOperation on the last stage const unsigned int last_stage = num_of_stages - 1; ARM_COMPUTE_RETURN_ON_ERROR(CLArgMinMaxLayerKernelEx::validate( - input, &sums_vector[last_stage - 1], ¬_reshaped_output, axis, op)); + input, &sums_vector[last_stage - 1], ¬_reshaped_output, axis, op)); } ARM_COMPUTE_RETURN_ON_ERROR(CLReshapeLayerKernel::validate(¬_reshaped_output, output)); return Status{}; @@ -144,16 +144,16 @@ void CLArgMinMaxLayerEx::configure(const ICLTensor *input, int axis, ICLTensor * _reduction_axis = axis; const TensorShape output_shape = arm_compute::misc::shape_calculator::compute_reduced_shape( - input->info()->tensor_shape(), axis, false); + input->info()->tensor_shape(), axis, false); DataType output_data_type = (output->info()->data_type() == DataType::UNKNOWN) - ? DataType::S32 - : output->info()->data_type(); + ? DataType::S32 + : output->info()->data_type(); auto_init_if_empty(*output->info(), input->info() - ->clone() - ->set_tensor_shape(output_shape) - .set_data_type(output_data_type) - .reset_padding() - .set_is_resizable(true)); + ->clone() + ->set_tensor_shape(output_shape) + .set_data_type(output_data_type) + .reset_padding() + .set_is_resizable(true)); // Configure reduction operation kernels _reduction_kernels_vector.resize(_num_of_stages); @@ -166,11 +166,11 @@ void CLArgMinMaxLayerEx::configure(const ICLTensor *input, int axis, ICLTensor * TensorShape output_shape{input->info()->tensor_shape()}; output_shape.set(axis, 1); auto_init_if_empty(*_not_reshaped_output.info(), input->info() - ->clone() - ->set_tensor_shape(output_shape) - .set_data_type(output_data_type) - .reset_padding() - .set_is_resizable(true)); + ->clone() + ->set_tensor_shape(output_shape) + .set_data_type(output_data_type) + .reset_padding() + .set_is_resizable(true)); _not_reshaped_output.info()->set_tensor_shape(output_shape); _reduction_kernels_vector[0].configure(input, nullptr, &_not_reshaped_output, axis, op); } @@ -182,7 +182,7 @@ void CLArgMinMaxLayerEx::configure(const ICLTensor *input, int axis, ICLTensor * { shape.set(0, ceil(shape.x() / 128.f)); _results_vector[i].allocator()->init( - input->info()->clone()->set_tensor_shape(shape).set_data_type(output_data_type)); + input->info()->clone()->set_tensor_shape(shape).set_data_type(output_data_type)); } // Apply ReductionOperation only on first kernel diff --git a/compute/ARMComputeEx/src/runtime/CL/functions/CLDirectTransposeConvLayer.cpp b/compute/ARMComputeEx/src/runtime/CL/functions/CLDirectTransposeConvLayer.cpp index 3dede05..6359b4b 100644 --- a/compute/ARMComputeEx/src/runtime/CL/functions/CLDirectTransposeConvLayer.cpp +++ b/compute/ARMComputeEx/src/runtime/CL/functions/CLDirectTransposeConvLayer.cpp @@ -53,16 +53,10 @@ namespace arm_compute using namespace arm_compute::misc::shape_calculator; CLDirectTransposeConvLayer::CLDirectTransposeConvLayer( - std::shared_ptr memory_manager) // NOLINT - : _memory_group(std::move(memory_manager)), - _scale_f(), - _conv_f(), - _flip_weights(), - _scaled_output(), - _original_weights(nullptr), - _weights_flipped(), - _flip_axis(), - _is_prepared(false) + std::shared_ptr memory_manager) // NOLINT + : _memory_group(std::move(memory_manager)), _scale_f(), _conv_f(), _flip_weights(), + _scaled_output(), _original_weights(nullptr), _weights_flipped(), _flip_axis(), + _is_prepared(false) { } @@ -74,7 +68,7 @@ Status CLDirectTransposeConvLayer::validate(const ITensorInfo *input, const ITen { ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input, weights, output); ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN( - input, 1, DataType::QASYMM8_SIGNED, DataType::QASYMM8, DataType::F16, DataType::F32); + input, 1, DataType::QASYMM8_SIGNED, DataType::QASYMM8, DataType::F16, DataType::F32); ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_LAYOUT(input, weights); const DataLayout data_layout = input->data_layout(); @@ -86,8 +80,8 @@ Status CLDirectTransposeConvLayer::validate(const ITensorInfo *input, const ITen ARM_COMPUTE_RETURN_ERROR_ON(weights->dimension(idx_w) < 1); auto out_dims = transposeconv_output_dimensions( - input->dimension(idx_w), input->dimension(idx_h), weights->dimension(idx_w), - weights->dimension(idx_h), info, invalid_right, invalid_bottom); + input->dimension(idx_w), input->dimension(idx_h), weights->dimension(idx_w), + weights->dimension(idx_h), info, invalid_right, invalid_bottom); const TensorShape output_shape = compute_transposeconv_output_shape(out_dims, *input, *weights); @@ -117,19 +111,19 @@ Status CLDirectTransposeConvLayer::validate(const ITensorInfo *input, const ITen unsigned int pad_right = 0; unsigned int pad_top = 0; unsigned int pad_bottom = 0; - const TensorShape scale_out_shape = compute_transposeconv_upsampled_shape( - *input, *weights, info, out_dims, invalid_right, invalid_bottom, pad_left, pad_right, pad_top, - pad_bottom); + const TensorShape scale_out_shape = + compute_transposeconv_upsampled_shape(*input, *weights, info, out_dims, invalid_right, + invalid_bottom, pad_left, pad_right, pad_top, pad_bottom); TensorInfo scale_out_info(input->clone() - ->set_is_resizable(true) - .reset_padding() - .set_tensor_shape(scale_out_shape) - .set_data_layout(data_layout)); + ->set_is_resizable(true) + .reset_padding() + .set_tensor_shape(scale_out_shape) + .set_data_layout(data_layout)); const PadStrideInfo conv_info(1, 1, 0, 0, 0, 0, DimensionRoundingType::CEIL); ARM_COMPUTE_RETURN_ON_ERROR(CLDeconvolutionLayerUpsample::validate(input, &scale_out_info, info)); - ARM_COMPUTE_RETURN_ON_ERROR(CLConvolutionLayer::validate(&scale_out_info, weights, bias, output, - conv_info, weights_info)); + ARM_COMPUTE_RETURN_ON_ERROR( + CLConvolutionLayer::validate(&scale_out_info, weights, bias, output, conv_info, weights_info)); return Status{}; } @@ -171,22 +165,22 @@ void CLDirectTransposeConvLayer::configure(const CLCompileContext &compile_conte _flip_weights.configure(compile_context, weights, &_weights_flipped, &_flip_axis); auto out_dims = transposeconv_output_dimensions( - input->info()->dimension(idx_w), input->info()->dimension(idx_h), - weights->info()->dimension(idx_w), weights->info()->dimension(idx_h), info, invalid_right, - invalid_bottom); + input->info()->dimension(idx_w), input->info()->dimension(idx_h), + weights->info()->dimension(idx_w), weights->info()->dimension(idx_h), info, invalid_right, + invalid_bottom); const TensorShape output_shape = - compute_transposeconv_output_shape(out_dims, *input->info(), *weights->info()); + compute_transposeconv_output_shape(out_dims, *input->info(), *weights->info()); // Output auto initialization if not yet initialized auto_init_if_empty( - *output->info(), - input->info()->clone()->set_tensor_shape(output_shape).set_data_layout(data_layout)); + *output->info(), + input->info()->clone()->set_tensor_shape(output_shape).set_data_layout(data_layout)); // Perform validation step ARM_COMPUTE_ERROR_THROW_ON(CLDirectTransposeConvLayer::validate( - input->info(), weights->info(), bias == nullptr ? nullptr : bias->info(), output->info(), - info, invalid_right, invalid_bottom)); + input->info(), weights->info(), bias == nullptr ? nullptr : bias->info(), output->info(), info, + invalid_right, invalid_bottom)); _is_prepared = weights_info.retain_internal_weights(); @@ -195,8 +189,8 @@ void CLDirectTransposeConvLayer::configure(const CLCompileContext &compile_conte // Find the upsampled dimensions and the padding needed for the convolution with stride 1 in order // to match output shape const TensorShape scale_out_shape = compute_transposeconv_upsampled_shape( - *input->info(), *weights->info(), info, out_dims, invalid_right, invalid_bottom, pad_left, - pad_right, pad_top, pad_bottom); + *input->info(), *weights->info(), info, out_dims, invalid_right, invalid_bottom, pad_left, + pad_right, pad_top, pad_bottom); TensorInfo scale_out_info(scale_out_shape, 1, input->info()->data_type(), input->info()->quantization_info()); diff --git a/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedHybridLayer.cpp b/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedHybridLayer.cpp index 0198946..79d0929 100644 --- a/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedHybridLayer.cpp +++ b/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedHybridLayer.cpp @@ -60,7 +60,7 @@ Status validate_mm(const ITensorInfo &input, const ITensorInfo &weights, const I ARM_COMPUTE_UNUSED(weights); ARM_COMPUTE_UNUSED(output); ARM_COMPUTE_RETURN_ON_ERROR( - CLGEMMLowpMatrixMultiplyCore::validate(&input, &weights, nullptr, &output)); + CLGEMMLowpMatrixMultiplyCore::validate(&input, &weights, nullptr, &output)); return Status{}; } @@ -80,12 +80,12 @@ Status CLFullyConnectedHybridLayerReshapeWeights::validate(const ITensorInfo *in } CLFullyConnectedHybridLayer::CLFullyConnectedHybridLayer( - std::shared_ptr memory_manager) - : _memory_group(memory_manager), _reshape_weights_kernel(), _quant_input_kernel(), - _mm_gemmlowp(memory_manager), _multiply_scale_kernel(), _accumulate_biases_kernel(), - _reshape_weights_output(), _quantized_input(), _scale_factor(), _gemmlowp_output(), - _are_weights_reshaped(true), _accumulate_biases(false), _is_prepared(false), - _original_weights(nullptr) + std::shared_ptr memory_manager) + : _memory_group(memory_manager), _reshape_weights_kernel(), _quant_input_kernel(), + _mm_gemmlowp(memory_manager), _multiply_scale_kernel(), _accumulate_biases_kernel(), + _reshape_weights_output(), _quantized_input(), _scale_factor(), _gemmlowp_output(), + _are_weights_reshaped(true), _accumulate_biases(false), _is_prepared(false), + _original_weights(nullptr) { } void CLFullyConnectedHybridLayer::configure_mm(const ICLTensor *input, const ICLTensor *weights, @@ -107,8 +107,8 @@ void CLFullyConnectedHybridLayer::configure(const ICLTensor *input, const ICLTen // Perform validate step ARM_COMPUTE_ERROR_THROW_ON(CLFullyConnectedHybridLayer::validate( - input->info(), weights->info(), biases != nullptr ? biases->info() : nullptr, output->info(), - fc_info)); + input->info(), weights->info(), biases != nullptr ? biases->info() : nullptr, output->info(), + fc_info)); _are_weights_reshaped = fc_info.transpose_weights ? fc_info.are_weights_reshaped : true; _accumulate_biases = false; @@ -140,10 +140,10 @@ void CLFullyConnectedHybridLayer::configure(const ICLTensor *input, const ICLTen bool is_fc_after_conv = false; if (is_batched_fc_layer) { - is_fc_after_conv = (TensorShape::num_max_dimensions >= 4) && - (std::equal(input->info()->tensor_shape().cbegin() + 3, - input->info()->tensor_shape().cend(), - output->info()->tensor_shape().cbegin() + 1)); + is_fc_after_conv = + (TensorShape::num_max_dimensions >= 4) && + (std::equal(input->info()->tensor_shape().cbegin() + 3, input->info()->tensor_shape().cend(), + output->info()->tensor_shape().cbegin() + 1)); } else { @@ -158,28 +158,28 @@ void CLFullyConnectedHybridLayer::configure(const ICLTensor *input, const ICLTen { // Reshape the weights _reshape_weights_output.allocator()->init( - weights->info()->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( - compute_transposed_shape(*weights->info()))); + weights->info()->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( + compute_transposed_shape(*weights->info()))); _reshape_weights_kernel.configure(weights_to_use, &_reshape_weights_output); weights_to_use = &_reshape_weights_output; } // Extract scale factor _scale_factor.allocator()->init( - TensorInfo(TensorShape{output->info()->dimension(1)}, 1, input->info()->data_type())); + TensorInfo(TensorShape{output->info()->dimension(1)}, 1, input->info()->data_type())); _memory_group.manage(&_scale_factor); _scale_factor_kernel.configure(input, &_scale_factor); // Quantize input _quantized_input.allocator()->init( - input->info()->clone()->set_is_resizable(true).reset_padding().set_data_type( - DataType::QASYMM8_SIGNED)); + input->info()->clone()->set_is_resizable(true).reset_padding().set_data_type( + DataType::QASYMM8_SIGNED)); _memory_group.manage(&_quantized_input); _quant_input_kernel.configure(input, &_scale_factor, &_quantized_input); // GEMMLowp _gemmlowp_output.allocator()->init( - output->info()->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); + output->info()->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); _memory_group.manage(&_gemmlowp_output); configure_mm(&_quantized_input, weights_to_use, &_gemmlowp_output, fc_info.retain_internal_weights); @@ -209,15 +209,15 @@ Status CLFullyConnectedHybridLayer::validate(const ITensorInfo *input, const ITe const GPUTarget gpu_target = CLScheduler::get().target(); const ITensorInfo &reshaped_weights = - TensorInfo(weights->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( - compute_transposed_shape(*weights))); + TensorInfo(weights->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( + compute_transposed_shape(*weights))); // Configure accumulate biases kernel for non quantized asymmetric types if (biases != nullptr) { ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(input, biases); ARM_COMPUTE_RETURN_ON_ERROR( - CLGEMMMatrixAccumulateBiasesKernel::validate(output, biases, gpu_target)); + CLGEMMMatrixAccumulateBiasesKernel::validate(output, biases, gpu_target)); } // With the Fully Connected layer we can have 4 different cases: @@ -247,33 +247,32 @@ Status CLFullyConnectedHybridLayer::validate(const ITensorInfo *input, const ITe { // Validate reshape weights kernel ARM_COMPUTE_RETURN_ON_ERROR( - CLFullyConnectedHybridLayerReshapeWeights::validate(weights_to_use, &reshaped_weights)); + CLFullyConnectedHybridLayerReshapeWeights::validate(weights_to_use, &reshaped_weights)); weights_to_use = &reshaped_weights; } // Validate Scale factor kernel const ITensorInfo &scale_factor = - TensorInfo(TensorShape{output->dimension(1)}, 1, input->data_type()); + TensorInfo(TensorShape{output->dimension(1)}, 1, input->data_type()); ARM_COMPUTE_RETURN_ON_ERROR(CLScaleFactorSymm8Kernel::validate(input, &scale_factor)); // Validate quantization symm8 kernel - const ITensorInfo &quantized_input = - TensorInfo(input->clone()->set_is_resizable(true).reset_padding().set_data_type( - DataType::QASYMM8_SIGNED)); + const ITensorInfo &quantized_input = TensorInfo( + input->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::QASYMM8_SIGNED)); ARM_COMPUTE_RETURN_ON_ERROR( - CLQuantizationSymmetricKernel::validate(input, &scale_factor, &quantized_input)); + CLQuantizationSymmetricKernel::validate(input, &scale_factor, &quantized_input)); // Fully Connected layer after a Fully Connected Layer without batches ARM_COMPUTE_RETURN_ERROR_ON(input->dimension(0) != weights_to_use->dimension(1)); // Validate matrix multiply kernel const ITensorInfo &gemmlowp_output = TensorInfo( - output->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); + output->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); ARM_COMPUTE_RETURN_ON_ERROR(validate_mm(quantized_input, *weights_to_use, gemmlowp_output)); // Multiply scale ARM_COMPUTE_RETURN_ON_ERROR( - CLMultiplyScaleFactorKernel::validate(&gemmlowp_output, &scale_factor, output)); + CLMultiplyScaleFactorKernel::validate(&gemmlowp_output, &scale_factor, output)); return Status{}; } diff --git a/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedLayerEx.cpp b/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedLayerEx.cpp index 2ff4b96..13d3acb 100644 --- a/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedLayerEx.cpp +++ b/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedLayerEx.cpp @@ -79,7 +79,7 @@ Status construct_gemmlowp_output_stage(const ITensorInfo &input, const ITensorIn int output_multiplier = 0; int output_shift = 0; ARM_COMPUTE_RETURN_ON_ERROR(quantization::calculate_quantized_multiplier_less_than_one( - multiplier, &output_multiplier, &output_shift)); + multiplier, &output_multiplier, &output_shift)); // Set the GEMMLowp output stage info gemmlowp_output_stage.gemmlowp_offset = output_quant_info.offset; @@ -99,7 +99,7 @@ Status validate_mm(const ITensorInfo &input, const ITensorInfo &weights, const I { GEMMLowpOutputStageInfo gemmlowp_output_stage; ARM_COMPUTE_RETURN_ON_ERROR( - construct_gemmlowp_output_stage(input, weights, output, gemmlowp_output_stage)); + construct_gemmlowp_output_stage(input, weights, output, gemmlowp_output_stage)); const GEMMInfo &gemm_info = GEMMInfo(false, // is_a_reshaped false, // is_b_reshaped @@ -125,14 +125,14 @@ Status validate_mm(const ITensorInfo &input, const ITensorInfo &weights, const I // Validate gemmlowp function ARM_COMPUTE_RETURN_ON_ERROR(CLGEMMLowpMatrixMultiplyCore::validate( - &input.clone()->set_quantization_info(input_quantization_info), - &weights.clone()->set_quantization_info(weights_quantization_info), bias, &output, - gemm_info)); + &input.clone()->set_quantization_info(input_quantization_info), + &weights.clone()->set_quantization_info(weights_quantization_info), bias, &output, + gemm_info)); } else { ARM_COMPUTE_RETURN_ON_ERROR( - CLGEMM::validate(&input, &weights, bias, &output, 1.f, 1.f, gemm_info)); + CLGEMM::validate(&input, &weights, bias, &output, 1.f, 1.f, gemm_info)); } return Status{}; @@ -154,12 +154,12 @@ Status CLFullyConnectedLayerReshapeWeightsEx::validate(const ITensorInfo *input, CLFullyConnectedLayerEx::CLFullyConnectedLayerEx(std::shared_ptr memory_manager, IWeightsManager *weights_manager) - : _memory_group(memory_manager), _weights_manager(weights_manager), _convert_weights(), - _convert_weights_managed(), _reshape_weights_managed_function(), _flatten_layer(), - _reshape_weights_function(), _mm_gemm(memory_manager, weights_manager), - _mm_gemmlowp(memory_manager), _flatten_output(), _converted_weights_output(), - _reshape_weights_output(), _are_weights_converted(true), _are_weights_reshaped(true), - _is_fc_after_conv(true), _is_quantized(false), _is_prepared(false), _original_weights(nullptr) + : _memory_group(memory_manager), _weights_manager(weights_manager), _convert_weights(), + _convert_weights_managed(), _reshape_weights_managed_function(), _flatten_layer(), + _reshape_weights_function(), _mm_gemm(memory_manager, weights_manager), + _mm_gemmlowp(memory_manager), _flatten_output(), _converted_weights_output(), + _reshape_weights_output(), _are_weights_converted(true), _are_weights_reshaped(true), + _is_fc_after_conv(true), _is_quantized(false), _is_prepared(false), _original_weights(nullptr) { } void CLFullyConnectedLayerEx::configure_mm(const ICLTensor *input, const ICLTensor *weights, @@ -190,9 +190,9 @@ void CLFullyConnectedLayerEx::configure_mm(const ICLTensor *input, const ICLTens const QuantizationInfo weights_quantization_info = weights->info()->quantization_info(); input->info()->set_quantization_info(QuantizationInfo( - input_quantization_info.uniform().scale, -input_quantization_info.uniform().offset)); + input_quantization_info.uniform().scale, -input_quantization_info.uniform().offset)); weights->info()->set_quantization_info(QuantizationInfo( - weights_quantization_info.uniform().scale, -weights_quantization_info.uniform().offset)); + weights_quantization_info.uniform().scale, -weights_quantization_info.uniform().offset)); // Configure gemmlowp function _mm_gemmlowp.configure(input, weights, bias, output, gemm_info); @@ -214,8 +214,8 @@ void CLFullyConnectedLayerEx::configure_conv_fc(const ICLTensor *input, const IC const FullyConnectedLayerInfo &fc_info) { ARM_COMPUTE_ERROR_ON( - (weights->info()->dimension(1) != - (input->info()->dimension(0) * input->info()->dimension(1) * input->info()->dimension(2)))); + (weights->info()->dimension(1) != + (input->info()->dimension(0) * input->info()->dimension(1) * input->info()->dimension(2)))); // If the fully connected layer is called after a convolution layer, the input tensor must be // linearized @@ -223,11 +223,11 @@ void CLFullyConnectedLayerEx::configure_conv_fc(const ICLTensor *input, const IC // Initialize output tensor for flatten TensorShape shape_flatten = compute_flatten_shape(input->info()); _flatten_output.allocator()->init(input->info() - ->clone() - ->set_is_resizable(true) - .reset_padding() - .set_tensor_shape(shape_flatten) - .set_data_layout(DataLayout::NCHW)); + ->clone() + ->set_is_resizable(true) + .reset_padding() + .set_tensor_shape(shape_flatten) + .set_data_layout(DataLayout::NCHW)); // Configure flatten kernel _memory_group.manage(&_flatten_output); @@ -258,8 +258,8 @@ void CLFullyConnectedLayerEx::configure(const ICLTensor *input, const ICLTensor // Perform validate step ARM_COMPUTE_ERROR_THROW_ON(CLFullyConnectedLayerEx::validate( - input->info(), weights->info(), biases != nullptr ? biases->info() : nullptr, output->info(), - fc_info)); + input->info(), weights->info(), biases != nullptr ? biases->info() : nullptr, output->info(), + fc_info)); _are_weights_converted = true; _are_weights_reshaped = fc_info.transpose_weights ? fc_info.are_weights_reshaped : true; @@ -285,10 +285,10 @@ void CLFullyConnectedLayerEx::configure(const ICLTensor *input, const ICLTensor const bool is_batched_fc_layer = output->info()->dimension(1) > 1; if (is_batched_fc_layer) { - _is_fc_after_conv = (TensorShape::num_max_dimensions >= 4) && - (std::equal(input->info()->tensor_shape().cbegin() + 3, - input->info()->tensor_shape().cend(), - output->info()->tensor_shape().cbegin() + 1)); + _is_fc_after_conv = + (TensorShape::num_max_dimensions >= 4) && + (std::equal(input->info()->tensor_shape().cbegin() + 3, input->info()->tensor_shape().cend(), + output->info()->tensor_shape().cbegin() + 1)); } else { @@ -302,7 +302,7 @@ void CLFullyConnectedLayerEx::configure(const ICLTensor *input, const ICLTensor { _reshape_weights_managed_function.configure(weights); weights_to_use = utils::cast::polymorphic_downcast( - _weights_manager->acquire(weights, &_reshape_weights_managed_function)); + _weights_manager->acquire(weights, &_reshape_weights_managed_function)); } else { @@ -320,7 +320,7 @@ void CLFullyConnectedLayerEx::configure(const ICLTensor *input, const ICLTensor _convert_weights_managed.configure(weights_to_use, input->info()->tensor_shape(), fc_info.weights_trained_layout); weights_to_use = utils::cast::polymorphic_downcast( - _weights_manager->acquire(weights, &_convert_weights_managed)); + _weights_manager->acquire(weights, &_convert_weights_managed)); } else { @@ -359,16 +359,16 @@ Status CLFullyConnectedLayerEx::validate(const ITensorInfo *input, const ITensor bool is_fc_after_conv = true; const ITensorInfo &flatten_input = TensorInfo(input->clone() - ->set_is_resizable(true) - .reset_padding() - .set_tensor_shape(compute_flatten_shape(input)) - .set_data_layout(DataLayout::NCHW)); + ->set_is_resizable(true) + .reset_padding() + .set_tensor_shape(compute_flatten_shape(input)) + .set_data_layout(DataLayout::NCHW)); const ITensorInfo &reshaped_weights = - TensorInfo(weights->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( - compute_transposed_shape(*weights))); + TensorInfo(weights->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( + compute_transposed_shape(*weights))); const ITensorInfo &converted_weights = - weights_reshaped ? TensorInfo(weights->clone()->set_is_resizable(true).reset_padding()) - : TensorInfo(*reshaped_weights.clone()); + weights_reshaped ? TensorInfo(weights->clone()->set_is_resizable(true).reset_padding()) + : TensorInfo(*reshaped_weights.clone()); // With the Fully Connected layer we can have 4 different cases: // 1) Convolution layer -> Fully Connected layer without batches @@ -396,7 +396,7 @@ Status CLFullyConnectedLayerEx::validate(const ITensorInfo *input, const ITensor { // Validate reshape weights kernel ARM_COMPUTE_RETURN_ON_ERROR( - CLFullyConnectedLayerReshapeWeightsEx::validate(weights, &reshaped_weights)); + CLFullyConnectedLayerReshapeWeightsEx::validate(weights, &reshaped_weights)); weights_to_use = &reshaped_weights; } @@ -404,7 +404,7 @@ Status CLFullyConnectedLayerEx::validate(const ITensorInfo *input, const ITensor { // Validate convert weights kernel ARM_COMPUTE_RETURN_ON_ERROR(CLConvertFullyConnectedWeights::validate( - weights_to_use, &converted_weights, input->tensor_shape(), fc_info.weights_trained_layout)); + weights_to_use, &converted_weights, input->tensor_shape(), fc_info.weights_trained_layout)); weights_to_use = &converted_weights; } @@ -412,8 +412,8 @@ Status CLFullyConnectedLayerEx::validate(const ITensorInfo *input, const ITensor { // Fully Connected layer after a Convolution Layer without batches ARM_COMPUTE_RETURN_ERROR_ON( - (weights_to_use->dimension(1) != - (input->dimension(0) * input->dimension(1) * input->dimension(2)))); + (weights_to_use->dimension(1) != + (input->dimension(0) * input->dimension(1) * input->dimension(2)))); // Validate flatten kernel ARM_COMPUTE_RETURN_ON_ERROR(CLFlattenLayer::validate(input, &flatten_input)); @@ -427,7 +427,7 @@ Status CLFullyConnectedLayerEx::validate(const ITensorInfo *input, const ITensor // Validate matrix multiply kernel ARM_COMPUTE_RETURN_ON_ERROR( - validate_mm(*input_to_use, *weights_to_use, biases, *output, fc_info)); + validate_mm(*input_to_use, *weights_to_use, biases, *output, fc_info)); return Status{}; } @@ -457,7 +457,7 @@ void CLFullyConnectedLayerEx::run() if (_weights_manager && _weights_manager->are_weights_managed(cur_weights)) { _original_weights = utils::cast::polymorphic_downcast( - _weights_manager->run(cur_weights, &_reshape_weights_managed_function)); + _weights_manager->run(cur_weights, &_reshape_weights_managed_function)); } else { diff --git a/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedReshapingLayer.cpp b/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedReshapingLayer.cpp index 157b4d9..ac6982e 100644 --- a/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedReshapingLayer.cpp +++ b/compute/ARMComputeEx/src/runtime/CL/functions/CLFullyConnectedReshapingLayer.cpp @@ -41,7 +41,7 @@ void CLFullyConnectedReshapingLayer::configure(const arm_compute::ICLTensor *inp // reshape auto_init_if_empty(*_cl_buffer.info(), _input->info()->clone()->set_tensor_shape(reshape).set_data_layout( - _input->info()->data_layout())); + _input->info()->data_layout())); _cl_reshape.configure(_input, &_cl_buffer); input_to_use = &_cl_buffer; } @@ -57,7 +57,7 @@ void CLFullyConnectedReshapingLayer::configure(const arm_compute::ICLTensor *inp { bool is_hybrid = (input->info()->data_type() == DataType::F32 || input->info()->data_type() == DataType::F16) && - (weights->info()->data_type() == DataType::S8 || + (weights->info()->data_type() == DataType::QSYMM8 || weights->info()->data_type() == DataType::QASYMM8_SIGNED); if (is_hybrid) @@ -81,7 +81,6 @@ void CLFullyConnectedReshapingLayer::configure(const arm_compute::ICLTensor *inp { throw std::runtime_error("CLFullyConnectedReshapingLayer: Unsupported kernel type"); } - }(); if (_needs_reshape) diff --git a/compute/ARMComputeEx/src/runtime/CL/functions/CLReduceOperation.cpp b/compute/ARMComputeEx/src/runtime/CL/functions/CLReduceOperation.cpp index 02ee4ad..c246041 100644 --- a/compute/ARMComputeEx/src/runtime/CL/functions/CLReduceOperation.cpp +++ b/compute/ARMComputeEx/src/runtime/CL/functions/CLReduceOperation.cpp @@ -46,8 +46,8 @@ using namespace arm_compute; CLReduceOperation::CLReduceOperation(std::shared_ptr memory_manager) - : _memory_group(std::move(memory_manager)), _input(nullptr), _output(nullptr), _axis(), - _keep_dims(false), _interm_tensors(), _reduce_kernels(), _reshape() + : _memory_group(std::move(memory_manager)), _input(nullptr), _output(nullptr), _axis(), + _keep_dims(false), _interm_tensors(), _reduce_kernels(), _reshape() { } @@ -91,13 +91,13 @@ Status CLReduceOperation::validate(const ITensorInfo *input, const ITensorInfo * for (size_t i = 0; i < num_of_kernels; ++i, ++it) { ARM_COMPUTE_RETURN_ON_ERROR( - CLReduceOperationKernel::validate(tensors[i], tensors[i + 1], *it, op)); + CLReduceOperationKernel::validate(tensors[i], tensors[i + 1], *it, op)); } if (!keep_dims) { ARM_COMPUTE_RETURN_ON_ERROR( - CLReshapeLayer::validate(&interm_tensors[num_of_interm_tensors - 1], output)); + CLReshapeLayer::validate(&interm_tensors[num_of_interm_tensors - 1], output)); } return Status{}; diff --git a/compute/ARMComputeEx/src/runtime/CL/functions/CLSplitVEx.cpp b/compute/ARMComputeEx/src/runtime/CL/functions/CLSplitVEx.cpp index a502f03..12c0aa8 100644 --- a/compute/ARMComputeEx/src/runtime/CL/functions/CLSplitVEx.cpp +++ b/compute/ARMComputeEx/src/runtime/CL/functions/CLSplitVEx.cpp @@ -134,8 +134,8 @@ void configure_slices(const ICLTensor *input, const std::vector &ou // Output auto inizialitation if not yet initialized TensorInfo tmp_output_info = *output->info()->clone(); auto_init_if_empty( - tmp_output_info, - input->info()->clone()->set_is_resizable(true).set_tensor_shape(output_shape)); + tmp_output_info, + input->info()->clone()->set_is_resizable(true).set_tensor_shape(output_shape)); // Update coordinate on axis start_coords.set(split_dim, axis_offset); @@ -153,7 +153,7 @@ void configure_slices(const ICLTensor *input, const std::vector &ou } // namespace CLSplitVEx::CLSplitVEx() - : _input(nullptr), _size_splits(nullptr), _outputs(), _num_splits(0), _slice_functions() + : _input(nullptr), _size_splits(nullptr), _outputs(), _num_splits(0), _slice_functions() { } diff --git a/compute/ARMComputeEx/src/runtime/CL/functions/CLTopKV2.cpp b/compute/ARMComputeEx/src/runtime/CL/functions/CLTopKV2.cpp index 3ac95a8..accd513 100644 --- a/compute/ARMComputeEx/src/runtime/CL/functions/CLTopKV2.cpp +++ b/compute/ARMComputeEx/src/runtime/CL/functions/CLTopKV2.cpp @@ -49,14 +49,14 @@ namespace arm_compute { CLTopKV2::CLTopKV2() - : _k(0), _total_bits(0), _bits(0), _radix(0), _hist_buf_size(0), _glob_sum_buf_size(0), _n(0), - _input(nullptr), _values(nullptr), _indices(nullptr), _qs_idx_buf(), _qs_temp_buf(), - _hist_buf(), _glob_sum_buf(), _temp_buf(), _first_negative_idx_buf(), _in_key_buf(), - _out_key_buf(), _in_ind_buf(), _out_ind_buf(), _p_in_key_buf(nullptr), - _p_out_key_buf(nullptr), _p_in_ind_buf(nullptr), _p_out_ind_buf(nullptr) /*, _qs_kernel(), - _init_kernel(), _hist_kernel(), _scan_hist_kernel(), _glob_scan_hist_kernel(), - _paste_hist_kernel(), _reorder_kernel(), _find_first_negative_kernel(), - _reorder_negatives_kernel(), _store_kernel()*/ + : _k(0), _total_bits(0), _bits(0), _radix(0), _hist_buf_size(0), _glob_sum_buf_size(0), _n(0), + _input(nullptr), _values(nullptr), _indices(nullptr), _qs_idx_buf(), _qs_temp_buf(), + _hist_buf(), _glob_sum_buf(), _temp_buf(), _first_negative_idx_buf(), _in_key_buf(), + _out_key_buf(), _in_ind_buf(), _out_ind_buf(), _p_in_key_buf(nullptr), _p_out_key_buf(nullptr), + _p_in_ind_buf(nullptr), _p_out_ind_buf(nullptr) /*, _qs_kernel(), + _init_kernel(), _hist_kernel(), _scan_hist_kernel(), _glob_scan_hist_kernel(), + _paste_hist_kernel(), _reorder_kernel(), _find_first_negative_kernel(), + _reorder_negatives_kernel(), _store_kernel()*/ { } diff --git a/compute/ARMComputeEx/src/runtime/CL/functions/CLTransposeConvLayer.cpp b/compute/ARMComputeEx/src/runtime/CL/functions/CLTransposeConvLayer.cpp index 3215d01..0754fd8 100644 --- a/compute/ARMComputeEx/src/runtime/CL/functions/CLTransposeConvLayer.cpp +++ b/compute/ARMComputeEx/src/runtime/CL/functions/CLTransposeConvLayer.cpp @@ -53,7 +53,7 @@ using namespace arm_compute; using namespace arm_compute::misc::shape_calculator; CLTransposeConvLayer::CLTransposeConvLayer(std::shared_ptr memory_manager) - : _memory_manager(std::move(memory_manager)), _function() + : _memory_manager(std::move(memory_manager)), _function() { } @@ -105,20 +105,20 @@ Status CLTransposeConvLayer::validate(const ITensorInfo *input, const ITensorInf { ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input, weights, output); switch (CLTransposeConvLayer::get_deconvolution_method( - input, weights, bias, output, deconv_info, invalid_right, invalid_bottom, weights_info)) + input, weights, bias, output, deconv_info, invalid_right, invalid_bottom, weights_info)) { case DeconvolutionMethod::DIRECT: { // Validate direct convolution layer ARM_COMPUTE_RETURN_ON_ERROR(CLDirectTransposeConvLayer::validate( - input, weights, bias, output, deconv_info, invalid_right, invalid_bottom, weights_info)); + input, weights, bias, output, deconv_info, invalid_right, invalid_bottom, weights_info)); break; } case DeconvolutionMethod::GEMM: { // Validate gemm-based convolution layer ARM_COMPUTE_RETURN_ON_ERROR( - CLGEMMDeconvolutionLayer::validate(input, weights, bias, output, deconv_info)); + CLGEMMDeconvolutionLayer::validate(input, weights, bias, output, deconv_info)); break; } default: @@ -130,9 +130,9 @@ Status CLTransposeConvLayer::validate(const ITensorInfo *input, const ITensorInf } DeconvolutionMethod CLTransposeConvLayer::get_deconvolution_method( - const ITensorInfo *input, const ITensorInfo *weights, const ITensorInfo *bias, - ITensorInfo *output, const PadStrideInfo &deconv_info, unsigned int invalid_right, - unsigned int invalid_bottom, const WeightsInfo &weights_info) + const ITensorInfo *input, const ITensorInfo *weights, const ITensorInfo *bias, + ITensorInfo *output, const PadStrideInfo &deconv_info, unsigned int invalid_right, + unsigned int invalid_bottom, const WeightsInfo &weights_info) { ARM_COMPUTE_UNUSED(output, bias, weights_info); diff --git a/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedHybridLayer.cpp b/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedHybridLayer.cpp index a123439..e212a03 100644 --- a/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedHybridLayer.cpp +++ b/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedHybridLayer.cpp @@ -58,7 +58,7 @@ namespace Status validate_mm(const ITensorInfo &input, const ITensorInfo &weights, const ITensorInfo &output) { ARM_COMPUTE_RETURN_ON_ERROR( - NEGEMMLowpMatrixMultiplyCore::validate(&input, &weights, nullptr, &output)); + NEGEMMLowpMatrixMultiplyCore::validate(&input, &weights, nullptr, &output)); return Status{}; } @@ -78,11 +78,11 @@ Status NEFullyConnectedHybridLayerReshapeWeights::validate(const ITensorInfo *in } NEFullyConnectedHybridLayer::NEFullyConnectedHybridLayer( - std::shared_ptr memory_manager) - : _memory_group(std::move(memory_manager)), _reshape_weights_function(), _quant_input_kernel(), - _mm_gemmlowp(), _accumulate_biases_kernel(), _reshape_weights_output(), _quantized_input(), - _scale_factor(), _original_weights(nullptr), _are_weights_reshaped(false), - _accumulate_biases(false), _is_prepared(false) + std::shared_ptr memory_manager) + : _memory_group(std::move(memory_manager)), _reshape_weights_function(), _quant_input_kernel(), + _mm_gemmlowp(), _accumulate_biases_kernel(), _reshape_weights_output(), _quantized_input(), + _scale_factor(), _original_weights(nullptr), _are_weights_reshaped(false), + _accumulate_biases(false), _is_prepared(false) { } @@ -103,8 +103,8 @@ void NEFullyConnectedHybridLayer::configure(const ITensor *input, const ITensor // Perform validate step ARM_COMPUTE_ERROR_THROW_ON(NEFullyConnectedHybridLayer::validate( - input->info(), weights->info(), biases != nullptr ? biases->info() : nullptr, output->info(), - fc_info)); + input->info(), weights->info(), biases != nullptr ? biases->info() : nullptr, output->info(), + fc_info)); _are_weights_reshaped = fc_info.transpose_weights ? fc_info.are_weights_reshaped : true; _accumulate_biases = false; @@ -132,10 +132,10 @@ void NEFullyConnectedHybridLayer::configure(const ITensor *input, const ITensor bool _is_fc_after_conv; if (is_batched_fc_layer) { - _is_fc_after_conv = (TensorShape::num_max_dimensions >= 4) && - (std::equal(input->info()->tensor_shape().cbegin() + 3, - input->info()->tensor_shape().cend(), - output->info()->tensor_shape().cbegin() + 1)); + _is_fc_after_conv = + (TensorShape::num_max_dimensions >= 4) && + (std::equal(input->info()->tensor_shape().cbegin() + 3, input->info()->tensor_shape().cend(), + output->info()->tensor_shape().cbegin() + 1)); } else { @@ -150,23 +150,23 @@ void NEFullyConnectedHybridLayer::configure(const ITensor *input, const ITensor { // Reshape the weights _reshape_weights_output.allocator()->init( - weights->info()->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( - compute_transposed_shape(*weights->info()))); + weights->info()->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( + compute_transposed_shape(*weights->info()))); _reshape_weights_function.configure(weights_to_use, &_reshape_weights_output); weights_to_use = &_reshape_weights_output; } // Quantize input _quantized_input.allocator()->init( - input->info()->clone()->set_is_resizable(true).reset_padding().set_data_type( - DataType::QASYMM8_SIGNED)); + input->info()->clone()->set_is_resizable(true).reset_padding().set_data_type( + DataType::QASYMM8_SIGNED)); _scale_factor.allocator()->init( - TensorInfo(TensorShape{output->info()->dimension(1)}, 1, DataType::F32)); + TensorInfo(TensorShape{output->info()->dimension(1)}, 1, DataType::F32)); _quant_input_kernel.configure(input, &_quantized_input, &_scale_factor); // GEMM _gemmlowp_output.allocator()->init( - output->info()->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); + output->info()->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); configure_mm(&_quantized_input, weights_to_use, &_gemmlowp_output); // Multiply scale @@ -195,8 +195,8 @@ Status NEFullyConnectedHybridLayer::validate(const ITensorInfo *input, const ITe bool weights_reshaped = fc_info.transpose_weights ? fc_info.are_weights_reshaped : true; const ITensorInfo &reshaped_weights = - TensorInfo(weights->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( - compute_transposed_shape(*weights))); + TensorInfo(weights->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( + compute_transposed_shape(*weights))); // Configure accumulate biases kernel for non quantized asymmetric types if (biases != nullptr) @@ -217,7 +217,7 @@ Status NEFullyConnectedHybridLayer::validate(const ITensorInfo *input, const ITe { // Validate reshape weights kernel ARM_COMPUTE_RETURN_ON_ERROR( - NEFullyConnectedHybridLayerReshapeWeights::validate(weights_to_use, &reshaped_weights)); + NEFullyConnectedHybridLayerReshapeWeights::validate(weights_to_use, &reshaped_weights)); weights_to_use = &reshaped_weights; } @@ -225,20 +225,19 @@ Status NEFullyConnectedHybridLayer::validate(const ITensorInfo *input, const ITe ARM_COMPUTE_RETURN_ERROR_ON(input->dimension(0) != weights_to_use->dimension(1)); // Validate quantization kernel - const ITensorInfo &quantized_input = - TensorInfo(input->clone()->set_is_resizable(true).reset_padding().set_data_type( - DataType::QASYMM8_SIGNED)); + const ITensorInfo &quantized_input = TensorInfo( + input->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::QASYMM8_SIGNED)); const ITensorInfo &scale_factor = TensorInfo(TensorShape{output->dimension(1)}, 1, DataType::F32); ARM_COMPUTE_RETURN_ON_ERROR( - NEQuantizationSymmetricKernel::validate(input, &quantized_input, &scale_factor)); + NEQuantizationSymmetricKernel::validate(input, &quantized_input, &scale_factor)); const ITensorInfo &gemmlowp_output = TensorInfo( - output->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); + output->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); // Validate matrix multiply kernel ARM_COMPUTE_RETURN_ON_ERROR(validate_mm(quantized_input, *weights_to_use, gemmlowp_output)); ARM_COMPUTE_RETURN_ON_ERROR(NEMultiplyScaleFactorKernel::validate( - &gemmlowp_output, &scale_factor, output, weights->quantization_info().uniform().scale)); + &gemmlowp_output, &scale_factor, output, weights->quantization_info().uniform().scale)); return Status{}; } diff --git a/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedLayerEx.cpp b/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedLayerEx.cpp index cb7557a..a639f29 100644 --- a/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedLayerEx.cpp +++ b/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedLayerEx.cpp @@ -69,14 +69,14 @@ Status validate_mm(const ITensorInfo &input, const ITensorInfo &weights, const I // Validate gemmlowp function ARM_COMPUTE_RETURN_ON_ERROR(NEGEMMLowpMatrixMultiplyCore::validate( - &input.clone()->set_quantization_info(input_quantization_info), - &weights.clone()->set_quantization_info(weights_quantization_info), nullptr, &output)); + &input.clone()->set_quantization_info(input_quantization_info), + &weights.clone()->set_quantization_info(weights_quantization_info), nullptr, &output)); } else { - ARM_COMPUTE_RETURN_ON_ERROR(NEGEMM::validate( - &input, &weights, nullptr, &output, 1.f, 0.0f, - GEMMInfo(false, false, false /* Reshape weights only for the first run */))); + ARM_COMPUTE_RETURN_ON_ERROR( + NEGEMM::validate(&input, &weights, nullptr, &output, 1.f, 0.0f, + GEMMInfo(false, false, false /* Reshape weights only for the first run */))); } return Status{}; @@ -84,12 +84,12 @@ Status validate_mm(const ITensorInfo &input, const ITensorInfo &weights, const I } // namespace NEFullyConnectedLayerEx::NEFullyConnectedLayerEx(std::shared_ptr memory_manager) - : _memory_group(std::move(memory_manager)), _flatten_kernel(), _convert_weights(), - _reshape_weights_function(), _mm_gemm(), _mm_gemmlowp(), _gemmlowp_output_stage(), - _accumulate_biases_kernel(), _flatten_output(), _gemmlowp_output(), - _converted_weights_output(), _reshape_weights_output(), _original_weights(nullptr), - _are_weights_converted(true), _are_weights_reshaped(false), _is_fc_after_conv(false), - _accumulate_biases(false), _is_quantized(false), _is_prepared(false) + : _memory_group(std::move(memory_manager)), _flatten_kernel(), _convert_weights(), + _reshape_weights_function(), _mm_gemm(), _mm_gemmlowp(), _gemmlowp_output_stage(), + _accumulate_biases_kernel(), _flatten_output(), _gemmlowp_output(), _converted_weights_output(), + _reshape_weights_output(), _original_weights(nullptr), _are_weights_converted(true), + _are_weights_reshaped(false), _is_fc_after_conv(false), _accumulate_biases(false), + _is_quantized(false), _is_prepared(false) { } @@ -105,9 +105,9 @@ void NEFullyConnectedLayerEx::configure_mm(const ITensor *input, const ITensor * const QuantizationInfo weights_quantization_info = weights->info()->quantization_info(); input->info()->set_quantization_info(QuantizationInfo( - input_quantization_info.uniform().scale, -input_quantization_info.uniform().offset)); + input_quantization_info.uniform().scale, -input_quantization_info.uniform().offset)); weights->info()->set_quantization_info(QuantizationInfo( - weights_quantization_info.uniform().scale, -weights_quantization_info.uniform().offset)); + weights_quantization_info.uniform().scale, -weights_quantization_info.uniform().offset)); // Configure gemmlowp function _mm_gemmlowp.configure(input, weights, nullptr, output); @@ -129,8 +129,8 @@ void NEFullyConnectedLayerEx::configure_conv_fc(const ITensor *input, const ITen ITensor *output) { ARM_COMPUTE_ERROR_ON( - (weights->info()->dimension(1) != - (input->info()->dimension(0) * input->info()->dimension(1) * input->info()->dimension(2)))); + (weights->info()->dimension(1) != + (input->info()->dimension(0) * input->info()->dimension(1) * input->info()->dimension(2)))); // If the fully connected layer is called after a convolution layer, the input tensor must be // linearized @@ -138,8 +138,7 @@ void NEFullyConnectedLayerEx::configure_conv_fc(const ITensor *input, const ITen // Initialize output tensor for flatten TensorShape shape_flatten = compute_flatten_shape(input->info()); _flatten_output.allocator()->init( - input->info()->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( - shape_flatten)); + input->info()->clone()->set_is_resizable(true).reset_padding().set_tensor_shape(shape_flatten)); // Configure flatten kernel _memory_group.manage(&_flatten_output); @@ -169,8 +168,8 @@ void NEFullyConnectedLayerEx::configure(const ITensor *input, const ITensor *wei // Perform validate step ARM_COMPUTE_ERROR_THROW_ON(NEFullyConnectedLayerEx::validate( - input->info(), weights->info(), biases != nullptr ? biases->info() : nullptr, output->info(), - fc_info)); + input->info(), weights->info(), biases != nullptr ? biases->info() : nullptr, output->info(), + fc_info)); _are_weights_converted = true; _are_weights_reshaped = fc_info.transpose_weights ? fc_info.are_weights_reshaped : true; @@ -183,8 +182,7 @@ void NEFullyConnectedLayerEx::configure(const ITensor *input, const ITensor *wei if (_is_quantized) { _gemmlowp_output.allocator()->init( - output->info()->clone()->set_is_resizable(true).reset_padding().set_data_type( - DataType::S32)); + output->info()->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); } // Configure accumulate biases kernel for non quantized asymmetric types @@ -208,10 +206,10 @@ void NEFullyConnectedLayerEx::configure(const ITensor *input, const ITensor *wei const bool is_batched_fc_layer = output->info()->dimension(1) > 1; if (is_batched_fc_layer) { - _is_fc_after_conv = (TensorShape::num_max_dimensions >= 4) && - (std::equal(input->info()->tensor_shape().cbegin() + 3, - input->info()->tensor_shape().cend(), - output->info()->tensor_shape().cbegin() + 1)); + _is_fc_after_conv = + (TensorShape::num_max_dimensions >= 4) && + (std::equal(input->info()->tensor_shape().cbegin() + 3, input->info()->tensor_shape().cend(), + output->info()->tensor_shape().cbegin() + 1)); } else { @@ -284,16 +282,16 @@ Status NEFullyConnectedLayerEx::validate(const ITensorInfo *input, const ITensor bool is_quantized = is_data_type_quantized_asymmetric(input->data_type()); const ITensorInfo &flatten_input = - TensorInfo(input->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( - compute_flatten_shape(input))); + TensorInfo(input->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( + compute_flatten_shape(input))); const ITensorInfo &reshaped_weights = - TensorInfo(weights->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( - compute_transposed_shape(*weights))); + TensorInfo(weights->clone()->set_is_resizable(true).reset_padding().set_tensor_shape( + compute_transposed_shape(*weights))); const ITensorInfo &converted_weights = - weights_reshaped ? TensorInfo(weights->clone()->set_is_resizable(true).reset_padding()) - : TensorInfo(*reshaped_weights.clone()); + weights_reshaped ? TensorInfo(weights->clone()->set_is_resizable(true).reset_padding()) + : TensorInfo(*reshaped_weights.clone()); const ITensorInfo &gemmlowp_output = TensorInfo( - output->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); + output->clone()->set_is_resizable(true).reset_padding().set_data_type(DataType::S32)); // Configure accumulate biases kernel for non quantized asymmetric types if (biases != nullptr && !is_quantized) @@ -330,7 +328,7 @@ Status NEFullyConnectedLayerEx::validate(const ITensorInfo *input, const ITensor { // Validate reshape weights kernel ARM_COMPUTE_RETURN_ON_ERROR( - NEFullyConnectedLayerReshapeWeights::validate(weights, &reshaped_weights)); + NEFullyConnectedLayerReshapeWeights::validate(weights, &reshaped_weights)); weights_to_use = &reshaped_weights; } @@ -338,7 +336,7 @@ Status NEFullyConnectedLayerEx::validate(const ITensorInfo *input, const ITensor { // Validate convert weights kernel ARM_COMPUTE_RETURN_ON_ERROR(NEConvertFullyConnectedWeights::validate( - weights_to_use, &converted_weights, input->tensor_shape(), fc_info.weights_trained_layout)); + weights_to_use, &converted_weights, input->tensor_shape(), fc_info.weights_trained_layout)); weights_to_use = &converted_weights; } @@ -346,8 +344,8 @@ Status NEFullyConnectedLayerEx::validate(const ITensorInfo *input, const ITensor { // Fully Connected layer after a Convolution Layer without batches ARM_COMPUTE_RETURN_ERROR_ON( - (weights_to_use->dimension(1) != - (input->dimension(0) * input->dimension(1) * input->dimension(2)))); + (weights_to_use->dimension(1) != + (input->dimension(0) * input->dimension(1) * input->dimension(2)))); // Validate flatten kernel ARM_COMPUTE_RETURN_ON_ERROR(NEFlattenLayerKernel::validate(input, &flatten_input)); @@ -365,7 +363,7 @@ Status NEFullyConnectedLayerEx::validate(const ITensorInfo *input, const ITensor if (is_quantized) { ARM_COMPUTE_RETURN_ON_ERROR(NEGEMMLowpQuantizeDownInt32ToUint8ScaleByFixedPoint::validate( - &gemmlowp_output, biases, output)); + &gemmlowp_output, biases, output)); } return Status{}; diff --git a/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedReshapingLayer.cpp b/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedReshapingLayer.cpp index dc6c784..234c783 100644 --- a/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedReshapingLayer.cpp +++ b/compute/ARMComputeEx/src/runtime/NEON/functions/NEFullyConnectedReshapingLayer.cpp @@ -56,7 +56,7 @@ void NEFullyConnectedReshapingLayer::configure(const arm_compute::ITensor *input assert(kernel_type == KernelType::PREPROCESSED_WEIGHTS); bool is_hybrid = input->info()->data_type() == DataType::F32 && - (weights->info()->data_type() == DataType::S8 || + (weights->info()->data_type() == DataType::QSYMM8 || weights->info()->data_type() == DataType::QASYMM8_SIGNED); if (is_hybrid) diff --git a/compute/ARMComputeEx/src/runtime/NEON/functions/NEInstanceNormalizationLayerEx.cpp b/compute/ARMComputeEx/src/runtime/NEON/functions/NEInstanceNormalizationLayerEx.cpp index 16d74e6..451aa09 100644 --- a/compute/ARMComputeEx/src/runtime/NEON/functions/NEInstanceNormalizationLayerEx.cpp +++ b/compute/ARMComputeEx/src/runtime/NEON/functions/NEInstanceNormalizationLayerEx.cpp @@ -46,9 +46,9 @@ namespace arm_compute { NEInstanceNormalizationLayerEx::NEInstanceNormalizationLayerEx( - std::shared_ptr memory_manager) - : _memory_group(std::move(memory_manager)), _normalization_kernel(), _is_nchw(false), - _permute_input(), _permute_output(), _permuted_input(), _permuted_output() + std::shared_ptr memory_manager) + : _memory_group(std::move(memory_manager)), _normalization_kernel(), _is_nchw(false), + _permute_input(), _permute_output(), _permuted_input(), _permuted_output() { } @@ -88,8 +88,8 @@ Status NEInstanceNormalizationLayerEx::validate(const ITensorInfo *input, const float epsilon) { return NEInstanceNormalizationLayerKernelEx::validate( - &input->clone()->set_data_layout(DataLayout::NCHW), - &output->clone()->set_data_layout(DataLayout::NCHW), gamma, beta, epsilon); + &input->clone()->set_data_layout(DataLayout::NCHW), + &output->clone()->set_data_layout(DataLayout::NCHW), gamma, beta, epsilon); } void NEInstanceNormalizationLayerEx::run() diff --git a/compute/ARMComputeEx/src/runtime/NEON/functions/NEReduceOperation.cpp b/compute/ARMComputeEx/src/runtime/NEON/functions/NEReduceOperation.cpp index cb1a263..c45c335 100644 --- a/compute/ARMComputeEx/src/runtime/NEON/functions/NEReduceOperation.cpp +++ b/compute/ARMComputeEx/src/runtime/NEON/functions/NEReduceOperation.cpp @@ -49,8 +49,8 @@ using namespace arm_compute; NEReduceOperation::NEReduceOperation(std::shared_ptr memory_manager) - : _memory_group(std::move(memory_manager)), _reduction_kernels(), _reduced_outs(), _reshape(), - _reduction_ops(), _keep_dims() + : _memory_group(std::move(memory_manager)), _reduction_kernels(), _reduced_outs(), _reshape(), + _reduction_ops(), _keep_dims() { } @@ -125,7 +125,7 @@ void NEReduceOperation::configure(ITensor *input, const Coordinates &reduction_a for (unsigned int i = 0; i < _reduction_ops; ++i) { TensorShape out_shape = - i == 0 ? input->info()->tensor_shape() : (&_reduced_outs[i - 1])->info()->tensor_shape(); + i == 0 ? input->info()->tensor_shape() : (&_reduced_outs[i - 1])->info()->tensor_shape(); out_shape.set(axis_local[i], 1); auto in = (i == 0) ? input : (&_reduced_outs[i - 1]); diff --git a/compute/ARMComputeEx/src/runtime/NEON/functions/NEReduceSum.cpp b/compute/ARMComputeEx/src/runtime/NEON/functions/NEReduceSum.cpp index 26a8879..b21717e 100644 --- a/compute/ARMComputeEx/src/runtime/NEON/functions/NEReduceSum.cpp +++ b/compute/ARMComputeEx/src/runtime/NEON/functions/NEReduceSum.cpp @@ -47,8 +47,8 @@ using namespace arm_compute; NEReduceSum::NEReduceSum(std::shared_ptr memory_manager) - : _memory_group(std::move(memory_manager)), _reduction_kernels(), _reduced_outs(), _reshape(), - _reduction_ops(), _keep_dims() + : _memory_group(std::move(memory_manager)), _reduction_kernels(), _reduced_outs(), _reshape(), + _reduction_ops(), _keep_dims() { } @@ -122,7 +122,7 @@ void NEReduceSum::configure(ITensor *input, const Coordinates &reduction_axis, b for (unsigned int i = 0; i < _reduction_ops; ++i) { TensorShape out_shape = - i == 0 ? input->info()->tensor_shape() : (&_reduced_outs[i - 1])->info()->tensor_shape(); + i == 0 ? input->info()->tensor_shape() : (&_reduced_outs[i - 1])->info()->tensor_shape(); out_shape.set(axis_local[i], 1); auto in = (i == 0) ? input : (&_reduced_outs[i - 1]); @@ -135,7 +135,7 @@ void NEReduceSum::configure(ITensor *input, const Coordinates &reduction_axis, b _reduced_outs[i].allocator()->init(TensorInfo(out_shape, input->info()->num_channels(), input->info()->data_type(), input->info()->quantization_info()) - .set_data_layout(input->info()->data_layout())); + .set_data_layout(input->info()->data_layout())); _memory_group.manage(&_reduced_outs[i]); _reduction_kernels[i].configure(in, &_reduced_outs[i], axis_local[i], ReductionOperation::SUM); diff --git a/compute/ARMComputeEx/src/runtime/NEON/functions/NETransposeConvLayer.cpp b/compute/ARMComputeEx/src/runtime/NEON/functions/NETransposeConvLayer.cpp index aa165cc..5031107 100644 --- a/compute/ARMComputeEx/src/runtime/NEON/functions/NETransposeConvLayer.cpp +++ b/compute/ARMComputeEx/src/runtime/NEON/functions/NETransposeConvLayer.cpp @@ -51,17 +51,9 @@ namespace arm_compute { NETransposeConvLayer::NETransposeConvLayer(std::shared_ptr memory_manager) // NOLINT - : _memory_group(std::move(memory_manager)), - _conv_f(), - _upsample_f(), - _flip_weights(), - _scaled_output(), - _weights_flipped(), - _flip_axis(), - _original_weights(nullptr), - _input(nullptr), - _info(), - _is_prepared(false) + : _memory_group(std::move(memory_manager)), _conv_f(), _upsample_f(), _flip_weights(), + _scaled_output(), _weights_flipped(), _flip_axis(), _original_weights(nullptr), _input(nullptr), + _info(), _is_prepared(false) { } @@ -76,15 +68,15 @@ Status NETransposeConvLayer::validate(const ITensorInfo *input, const ITensorInf ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(weights, input); ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_LAYOUT(weights, input); const unsigned int width_idx = - get_data_layout_dimension_index(weights->data_layout(), DataLayoutDimension::WIDTH); + get_data_layout_dimension_index(weights->data_layout(), DataLayoutDimension::WIDTH); const unsigned int height_idx = - get_data_layout_dimension_index(weights->data_layout(), DataLayoutDimension::HEIGHT); + get_data_layout_dimension_index(weights->data_layout(), DataLayoutDimension::HEIGHT); ARM_COMPUTE_RETURN_ERROR_ON(weights->dimension(width_idx) != weights->dimension(height_idx)); ARM_COMPUTE_RETURN_ERROR_ON(weights->dimension(width_idx) < 1); auto out_dims = transposeconv_output_dimensions( - input->dimension(width_idx), input->dimension(height_idx), weights->dimension(width_idx), - weights->dimension(height_idx), info, invalid_right, invalid_bottom); + input->dimension(width_idx), input->dimension(height_idx), weights->dimension(width_idx), + weights->dimension(height_idx), info, invalid_right, invalid_bottom); ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(input, weights); if (bias != nullptr) @@ -117,24 +109,24 @@ Status NETransposeConvLayer::validate(const ITensorInfo *input, const ITensorInf unsigned int pad_right = 0; unsigned int pad_top = 0; unsigned int pad_bottom = 0; - const TensorShape scale_out_shape = compute_transposeconv_upsampled_shape( - *input, *weights, info, out_dims, invalid_right, invalid_bottom, pad_left, pad_right, pad_top, - pad_bottom); + const TensorShape scale_out_shape = + compute_transposeconv_upsampled_shape(*input, *weights, info, out_dims, invalid_right, + invalid_bottom, pad_left, pad_right, pad_top, pad_bottom); TensorInfo scale_out_info( - input->clone()->set_is_resizable(true).reset_padding().set_tensor_shape(scale_out_shape)); + input->clone()->set_is_resizable(true).reset_padding().set_tensor_shape(scale_out_shape)); const PadStrideInfo conv_info(1, 1, 0, 0, 0, 0, DimensionRoundingType::CEIL); const unsigned int batches_idx = - get_data_layout_dimension_index(weights->data_layout(), DataLayoutDimension::BATCHES); + get_data_layout_dimension_index(weights->data_layout(), DataLayoutDimension::BATCHES); const unsigned int channel_idx = - get_data_layout_dimension_index(weights->data_layout(), DataLayoutDimension::CHANNEL); + get_data_layout_dimension_index(weights->data_layout(), DataLayoutDimension::CHANNEL); ARM_COMPUTE_RETURN_ERROR_ON(input->dimension(batches_idx) != scale_out_info.dimension(batches_idx)); ARM_COMPUTE_RETURN_ERROR_ON(input->dimension(channel_idx) != scale_out_info.dimension(channel_idx)); - ARM_COMPUTE_RETURN_ON_ERROR(NEConvolutionLayer::validate(&scale_out_info, weights, bias, output, - conv_info, WeightsInfo())); + ARM_COMPUTE_RETURN_ON_ERROR( + NEConvolutionLayer::validate(&scale_out_info, weights, bias, output, conv_info, WeightsInfo())); return Status{}; } @@ -146,21 +138,21 @@ void NETransposeConvLayer::configure(ITensor *input, const ITensor *weights, con // Perform validation step ARM_COMPUTE_ERROR_ON_NULLPTR(input, weights, output); ARM_COMPUTE_ERROR_THROW_ON(NETransposeConvLayer::validate( - input->info(), weights->info(), (bias == nullptr) ? nullptr : bias->info(), output->info(), - info, invalid_right, invalid_bottom)); + input->info(), weights->info(), (bias == nullptr) ? nullptr : bias->info(), output->info(), + info, invalid_right, invalid_bottom)); const DataLayout data_layout = input->info()->data_layout(); const unsigned int width_idx = - get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH); + get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH); const unsigned int height_idx = - get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT); + get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT); auto out_dims = transposeconv_output_dimensions( - input->info()->dimension(width_idx), input->info()->dimension(height_idx), - weights->info()->dimension(width_idx), weights->info()->dimension(height_idx), info, - invalid_right, invalid_bottom); + input->info()->dimension(width_idx), input->info()->dimension(height_idx), + weights->info()->dimension(width_idx), weights->info()->dimension(height_idx), info, + invalid_right, invalid_bottom); const TensorShape output_shape = - compute_transposeconv_output_shape(out_dims, *input->info(), *weights->info()); + compute_transposeconv_output_shape(out_dims, *input->info(), *weights->info()); _input = input; _original_weights = weights; @@ -188,8 +180,8 @@ void NETransposeConvLayer::configure(ITensor *input, const ITensor *weights, con const PadStrideInfo conv_info(1, 1, 0, 0, 0, 0, DimensionRoundingType::CEIL); const TensorShape scale_out_shape = compute_transposeconv_upsampled_shape( - *input->info(), *weights->info(), info, out_dims, invalid_right, invalid_bottom, pad_left, - pad_right, pad_top, pad_bottom); + *input->info(), *weights->info(), info, out_dims, invalid_right, invalid_bottom, pad_left, + pad_right, pad_top, pad_bottom); const PadStrideInfo upsample_info(stride_x, stride_y, pad_left, pad_right, pad_top, pad_bottom, DimensionRoundingType::FLOOR); diff --git a/compute/cker/include/cker/CpuBackendThreadpool.h b/compute/cker/include/cker/CpuBackendThreadpool.h new file mode 100644 index 0000000..cc6a9db --- /dev/null +++ b/compute/cker/include/cker/CpuBackendThreadpool.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_CPU_BACKEND_THREADPOOL_H_ +#define __NNFW_CKER_CPU_BACKEND_THREADPOOL_H_ + +#include // from @ruy +#include // from @ruy + +namespace nnfw +{ +namespace cker +{ +namespace cpu_backend_threadpool +{ + +using Task = ruy::Task; + +template +void Execute(int tasks_count, TaskType *tasks, ruy::Context *ruy_context) +{ + assert(tasks_count <= ruy_context->max_num_threads()); + ruy_context->mutable_thread_pool()->Execute(tasks_count, tasks); +} + +} // namespace cpu_backend_threadpool +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_CPU_BACKEND_THREADPOOL_H_ diff --git a/compute/cker/include/cker/NeonTensorUtils.h b/compute/cker/include/cker/NeonTensorUtils.h index e080406..8bf0bee 100644 --- a/compute/cker/include/cker/NeonTensorUtils.h +++ b/compute/cker/include/cker/NeonTensorUtils.h @@ -131,7 +131,7 @@ inline const int8_t *ShuffleVectors(const int8_t *vectors, const int n_batch, co const int kWeightsPerUint32 = 4; int8 *shuffled_vectors = reinterpret_cast( - aligned_alloc(kWeightsPerUint32, n_batch * m_cols, shuffled_vectors_free)); + aligned_alloc(kWeightsPerUint32, n_batch * m_cols, shuffled_vectors_free)); for (int i = 0; i < n_batch; i += 4) { @@ -145,25 +145,25 @@ inline const int8_t *ShuffleVectors(const int8_t *vectors, const int n_batch, co while (unshuffled_vec0_ptr != end_vec0_ptr) { asm volatile( - // This code path requires that (n_cols % 16) == 0 so we can safely - // read in 16-byte chunks from each row. - "ld1 {v0.16b}, [%[unshuffled_vec0_ptr]], #16\n" - "ld1 {v1.16b}, [%[unshuffled_vec1_ptr]], #16\n" - "ld1 {v2.16b}, [%[unshuffled_vec2_ptr]], #16\n" - "ld1 {v3.16b}, [%[unshuffled_vec3_ptr]], #16\n" - - "st4 {v0.s, v1.s, v2.s, v3.s}[0], [%[shuffled_vectors_ptr]], #16\n" - "st4 {v0.s, v1.s, v2.s, v3.s}[1], [%[shuffled_vectors_ptr]], #16\n" - "st4 {v0.s, v1.s, v2.s, v3.s}[2], [%[shuffled_vectors_ptr]], #16\n" - "st4 {v0.s, v1.s, v2.s, v3.s}[3], [%[shuffled_vectors_ptr]], #16\n" - - : [unshuffled_vec0_ptr] "+r"(unshuffled_vec0_ptr), - [unshuffled_vec1_ptr] "+r"(unshuffled_vec1_ptr), - [unshuffled_vec2_ptr] "+r"(unshuffled_vec2_ptr), - [unshuffled_vec3_ptr] "+r"(unshuffled_vec3_ptr), - [shuffled_vectors_ptr] "+r"(shuffled_vectors_ptr) - : - : "v0", "v1", "v2", "v3", "cc", "memory"); + // This code path requires that (n_cols % 16) == 0 so we can safely + // read in 16-byte chunks from each row. + "ld1 {v0.16b}, [%[unshuffled_vec0_ptr]], #16\n" + "ld1 {v1.16b}, [%[unshuffled_vec1_ptr]], #16\n" + "ld1 {v2.16b}, [%[unshuffled_vec2_ptr]], #16\n" + "ld1 {v3.16b}, [%[unshuffled_vec3_ptr]], #16\n" + + "st4 {v0.s, v1.s, v2.s, v3.s}[0], [%[shuffled_vectors_ptr]], #16\n" + "st4 {v0.s, v1.s, v2.s, v3.s}[1], [%[shuffled_vectors_ptr]], #16\n" + "st4 {v0.s, v1.s, v2.s, v3.s}[2], [%[shuffled_vectors_ptr]], #16\n" + "st4 {v0.s, v1.s, v2.s, v3.s}[3], [%[shuffled_vectors_ptr]], #16\n" + + : [ unshuffled_vec0_ptr ] "+r"(unshuffled_vec0_ptr), + [ unshuffled_vec1_ptr ] "+r"(unshuffled_vec1_ptr), + [ unshuffled_vec2_ptr ] "+r"(unshuffled_vec2_ptr), + [ unshuffled_vec3_ptr ] "+r"(unshuffled_vec3_ptr), + [ shuffled_vectors_ptr ] "+r"(shuffled_vectors_ptr) + : + : "v0", "v1", "v2", "v3", "cc", "memory"); } } @@ -204,104 +204,104 @@ static void DotprodMatrixBatchFourVectorMultiplyAccumulate(const int8_t *__restr const int8 *mat_ptr3 = matrix + ((row + 3) * m_cols); asm volatile( - // Zero out the accumulator registers. - "dup v0.4s, wzr\n" - "dup v1.4s, wzr\n" - "dup v2.4s, wzr\n" - "dup v3.4s, wzr\n" - - "1:\n" // batch_cols_loop - - // Read 16 more bytes from a pair of matrix rows. - "ld1 {v12.16b}, [%[mat_ptr0]], #16\n" - - // Prefetch two rows ahead. - "prfm pldl1strm, [%[mat_ptr2]]\n" - "prfm pldl1strm, [%[mat_ptr3]]\n" - - // Read from input vectors 4 times; 64 bytes total. - // Each 16-byte register contains parts of 4 vectors; see the - // shuffle logic above. - - // From Benoit, places to look in the future: - // - Move load instructions further from sdot - // - Switch loop use-then-reload - // - Do partial unrolling to use register space better - "ld1 {v8.16b}, [%[vec_ptr]], #16\n" - ".word 0x4f8ce100 // sdot v0.4s, v8.16b, v12.4b[0]\n" - "ld1 {v9.16b}, [%[vec_ptr]], #16\n" - ".word 0x4face121 // sdot v1.4s, v9.16b, v12.4b[1]\n" - "ld1 {v10.16b}, [%[vec_ptr]], #16\n" - ".word 0x4f8ce940 // sdot v0.4s, v10.16b, v12.4b[2]\n" - "ld1 {v11.16b}, [%[vec_ptr]], #16\n" - ".word 0x4face961 // sdot v1.4s, v11.16b, v12.4b[3]\n" - - // Update prefetch pointers. - "add %[mat_ptr2], %[mat_ptr2], #16\n" - "add %[mat_ptr3], %[mat_ptr3], #16\n" - - // Re-use those vectors for the next row as well. - "ld1 {v13.16b}, [%[mat_ptr1]], #16\n" - ".word 0x4f8de102 // sdot v2.4s, v8.16b, v13.4b[0]\n" - ".word 0x4fade123 // sdot v3.4s, v9.16b, v13.4b[1]\n" - ".word 0x4f8de942 // sdot v2.4s, v10.16b, v13.4b[2]\n" - ".word 0x4fade963 // sdot v3.4s, v11.16b, v13.4b[3]\n" - - // If we're not done with these rows, continue. - "cmp %[mat_ptr0], %[mat_ptr0_end]\n" - "bne 1b\n" // batch_cols_loop - - // Done with the rows, sum the results. - "add v0.4s, v0.4s, v1.4s\n" - "add v2.4s, v2.4s, v3.4s\n" - - // Convert the per-vector sums to floating point. - "scvtf v0.4s, v0.4s\n" - "scvtf v1.4s, v2.4s\n" - - // Fetch scale factors. - "ld1 {v4.4s}, [%[scaling_factors_ptr]]\n" - - // Multiply scale factors times sums. - "fmul v0.4s, v4.4s, v0.4s\n" - "fmul v1.4s, v4.4s, v1.4s\n" - - // Load previous result values. - // The result position is: - // result[batch * m_rows + row] - // Here that is factored into: - // result_ptr = result + row - // *result_ptr = res[0] - // (uint8*)result_ptr += (m_rows * sizeof(float)) - // *result_ptr = res[1] - // ... - // Since we're reading two rows at a time, though, we read both - // result[batch * m_rows + row] - // and - // result[batch * m_rows + row + 1] - "ld2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" - "ld2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" - "ld2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" - "ld2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" - - // Go back to the starting position (subtract wide_rows * 4). - "sub %[result_ptr], %[result_ptr], %[wide_rows], lsl #2\n" - - // Add previous result values. - "fadd v9.4s, v9.4s, v0.4s\n" - "fadd v10.4s, v10.4s, v1.4s\n" - - // Store results. - "st2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" - "st2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" - "st2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" - "st2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" - : [mat_ptr0] "+r"(mat_ptr0), [mat_ptr1] "+r"(mat_ptr1), [vec_ptr] "+r"(vec_ptr), - [result_ptr] "+r"(result_ptr), [mat_ptr2] "+r"(mat_ptr2), [mat_ptr3] "+r"(mat_ptr3) - : [mat_ptr0_end] "r"(mat_ptr0_end), [scaling_factors_ptr] "r"(scaling_factors_ptr), - [wide_rows] "r"(wide_rows) - : "x0", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", - "v13", "cc", "memory"); + // Zero out the accumulator registers. + "dup v0.4s, wzr\n" + "dup v1.4s, wzr\n" + "dup v2.4s, wzr\n" + "dup v3.4s, wzr\n" + + "1:\n" // batch_cols_loop + + // Read 16 more bytes from a pair of matrix rows. + "ld1 {v12.16b}, [%[mat_ptr0]], #16\n" + + // Prefetch two rows ahead. + "prfm pldl1strm, [%[mat_ptr2]]\n" + "prfm pldl1strm, [%[mat_ptr3]]\n" + + // Read from input vectors 4 times; 64 bytes total. + // Each 16-byte register contains parts of 4 vectors; see the + // shuffle logic above. + + // From Benoit, places to look in the future: + // - Move load instructions further from sdot + // - Switch loop use-then-reload + // - Do partial unrolling to use register space better + "ld1 {v8.16b}, [%[vec_ptr]], #16\n" + ".word 0x4f8ce100 // sdot v0.4s, v8.16b, v12.4b[0]\n" + "ld1 {v9.16b}, [%[vec_ptr]], #16\n" + ".word 0x4face121 // sdot v1.4s, v9.16b, v12.4b[1]\n" + "ld1 {v10.16b}, [%[vec_ptr]], #16\n" + ".word 0x4f8ce940 // sdot v0.4s, v10.16b, v12.4b[2]\n" + "ld1 {v11.16b}, [%[vec_ptr]], #16\n" + ".word 0x4face961 // sdot v1.4s, v11.16b, v12.4b[3]\n" + + // Update prefetch pointers. + "add %[mat_ptr2], %[mat_ptr2], #16\n" + "add %[mat_ptr3], %[mat_ptr3], #16\n" + + // Re-use those vectors for the next row as well. + "ld1 {v13.16b}, [%[mat_ptr1]], #16\n" + ".word 0x4f8de102 // sdot v2.4s, v8.16b, v13.4b[0]\n" + ".word 0x4fade123 // sdot v3.4s, v9.16b, v13.4b[1]\n" + ".word 0x4f8de942 // sdot v2.4s, v10.16b, v13.4b[2]\n" + ".word 0x4fade963 // sdot v3.4s, v11.16b, v13.4b[3]\n" + + // If we're not done with these rows, continue. + "cmp %[mat_ptr0], %[mat_ptr0_end]\n" + "bne 1b\n" // batch_cols_loop + + // Done with the rows, sum the results. + "add v0.4s, v0.4s, v1.4s\n" + "add v2.4s, v2.4s, v3.4s\n" + + // Convert the per-vector sums to floating point. + "scvtf v0.4s, v0.4s\n" + "scvtf v1.4s, v2.4s\n" + + // Fetch scale factors. + "ld1 {v4.4s}, [%[scaling_factors_ptr]]\n" + + // Multiply scale factors times sums. + "fmul v0.4s, v4.4s, v0.4s\n" + "fmul v1.4s, v4.4s, v1.4s\n" + + // Load previous result values. + // The result position is: + // result[batch * m_rows + row] + // Here that is factored into: + // result_ptr = result + row + // *result_ptr = res[0] + // (uint8*)result_ptr += (m_rows * sizeof(float)) + // *result_ptr = res[1] + // ... + // Since we're reading two rows at a time, though, we read both + // result[batch * m_rows + row] + // and + // result[batch * m_rows + row + 1] + "ld2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" + + // Go back to the starting position (subtract wide_rows * 4). + "sub %[result_ptr], %[result_ptr], %[wide_rows], lsl #2\n" + + // Add previous result values. + "fadd v9.4s, v9.4s, v0.4s\n" + "fadd v10.4s, v10.4s, v1.4s\n" + + // Store results. + "st2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" + : [ mat_ptr0 ] "+r"(mat_ptr0), [ mat_ptr1 ] "+r"(mat_ptr1), [ vec_ptr ] "+r"(vec_ptr), + [ result_ptr ] "+r"(result_ptr), [ mat_ptr2 ] "+r"(mat_ptr2), [ mat_ptr3 ] "+r"(mat_ptr3) + : [ mat_ptr0_end ] "r"(mat_ptr0_end), [ scaling_factors_ptr ] "r"(scaling_factors_ptr), + [ wide_rows ] "r"(wide_rows) + : "x0", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", + "v13", "cc", "memory"); } } @@ -309,9 +309,9 @@ static void DotprodMatrixBatchFourVectorMultiplyAccumulate(const int8_t *__restr } static void DotprodMatrixBatchFourVectorMultiplyAccumulate( - const int8_t *__restrict__ matrix, const int m_rows, const int m_cols, const int8_t *vectors, - const float *scaling_factors, int n_batch, float *__restrict__ result, - const float *per_channel_scale, const int32_t *input_offset, int32_t *row_sums) + const int8_t *__restrict__ matrix, const int m_rows, const int m_cols, const int8_t *vectors, + const float *scaling_factors, int n_batch, float *__restrict__ result, + const float *per_channel_scale, const int32_t *input_offset, int32_t *row_sums) { void *shuffled_vectors_free; const int8_t *shuffled_vectors = ShuffleVectors(vectors, n_batch, m_cols, &shuffled_vectors_free); @@ -332,102 +332,102 @@ static void DotprodMatrixBatchFourVectorMultiplyAccumulate( const int32_t *batch_offsets_ptr = input_offset + batch; const int32_t is_channel_scale_nullptr = per_channel_scale == nullptr; const int32_t is_row_sums_nullptr = row_sums_ptr == nullptr; - asm volatile("dup v0.4s, wzr\n" - "dup v1.4s, wzr\n" - "dup v2.4s, wzr\n" - "dup v3.4s, wzr\n" - // Load zero points. - "ld1 {v7.4s}, [%[batch_offsets_ptr]]\n" - "ld1 {v4.4s}, [%[scaling_factors_ptr]]\n" - // Zero out zero point accumulators. - "dup v14.4s, wzr\n" - "dup v15.4s, wzr\n" - - // Load per channel scales if not null. - "cmp %w[is_channel_scale_nullptr], #0\n" - "bne 1f\n" - "ld1r {v16.4s}, [%[channel_scales_ptr]], #4\n" - "ld1r {v17.4s}, [%[channel_scales_ptr]]\n" - "fmul v16.4s, v16.4s, v4.4s\n" - "fmul v17.4s, v17.4s, v4.4s\n" - "b 2f\n" - "1:\n" - "mov v16.16b, v4.16b\n" - "mov v17.16b, v4.16b\n" - "2:\n" - "ld1 {v12.16b}, [%[mat_ptr0]], #16\n" - "ld1 {v8.16b}, [%[vec_ptr]], #16\n" - ".word 0x4f8ce100 // sdot v0.4s, v8.16b, v12.4b[0]\n" - "ld1 {v9.16b}, [%[vec_ptr]], #16\n" - ".word 0x4face121 // sdot v1.4s, v9.16b, v12.4b[1]\n" - "ld1 {v10.16b}, [%[vec_ptr]], #16\n" - ".word 0x4f8ce940 // sdot v0.4s, v10.16b, v12.4b[2]\n" - "ld1 {v11.16b}, [%[vec_ptr]], #16\n" - ".word 0x4face961 // sdot v1.4s, v11.16b, v12.4b[3]\n" - "ld1 {v13.16b}, [%[mat_ptr1]], #16\n" - ".word 0x4f8de102 // sdot v2.4s, v8.16b, v13.4b[0]\n" - ".word 0x4fade123 // sdot v3.4s, v9.16b, v13.4b[1]\n" - ".word 0x4f8de942 // sdot v2.4s, v10.16b, v13.4b[2]\n" - ".word 0x4fade963 // sdot v3.4s, v11.16b, v13.4b[3]\n" - "cmp %w[is_row_sums_nullptr], #1\n" - "bne 3f\n" - // Accumulate row_sums for zero point calculations. - "saddlp v12.8h, v12.16b\n" - "saddlp v13.8h, v13.16b\n" - "sadalp v14.4s, v12.8h\n" - "sadalp v15.4s, v13.8h\n" - "3:\n" - "cmp %[mat_ptr0], %[mat_ptr0_end]\n" - "bne 2b\n" - "add v0.4s, v0.4s, v1.4s\n" - "add v2.4s, v2.4s, v3.4s\n" - - "cmp %w[is_row_sums_nullptr], #1\n" - "bne 4f\n" - // Calculate zero point offsets. - "addv s14, v14.4s\n" - "addv s15, v15.4s\n" - "dup v14.4s, v14.s[0]\n" - "dup v15.4s, v15.s[0]\n" - "b 5f\n" - "4:\n" - "ld1r {v14.4s}, [%[row_sums_ptr]], #4\n" - "ld1r {v15.4s}, [%[row_sums_ptr]]\n" - "5:\n" - - "mul v14.4s, v14.4s, v7.4s\n" - "mul v15.4s, v15.4s, v7.4s\n" - "sub v0.4s, v0.4s, v14.4s\n" - "sub v2.4s, v2.4s, v15.4s\n" - - "scvtf v0.4s, v0.4s\n" - "scvtf v1.4s, v2.4s\n" - - // Multiply scale. - "fmul v0.4s, v16.4s, v0.4s\n" - "fmul v1.4s, v17.4s, v1.4s\n" - - "ld2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" - "ld2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" - "ld2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" - "ld2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" - "sub %[result_ptr], %[result_ptr], %[wide_rows], lsl #2\n" - "fadd v9.4s, v9.4s, v0.4s\n" - "fadd v10.4s, v10.4s, v1.4s\n" - "st2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" - "st2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" - "st2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" - "st2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" - : [mat_ptr0] "+r"(mat_ptr0), [mat_ptr1] "+r"(mat_ptr1), [vec_ptr] "+r"(vec_ptr), - [result_ptr] "+r"(result_ptr), [row_sums_ptr] "+r"(row_sums_ptr) - : [mat_ptr0_end] "r"(mat_ptr0_end), - [scaling_factors_ptr] "r"(scaling_factors_ptr), [wide_rows] "r"(wide_rows), - [channel_scales_ptr] "r"(channel_scales_ptr), - [batch_offsets_ptr] "r"(batch_offsets_ptr), - [is_channel_scale_nullptr] "r"(is_channel_scale_nullptr), - [is_row_sums_nullptr] "r"(is_row_sums_nullptr) - : "x0", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", - "v12", "v13", "v14", "v15", "v16", "v17", "w0", "w1", "cc", "memory"); + asm volatile( + "dup v0.4s, wzr\n" + "dup v1.4s, wzr\n" + "dup v2.4s, wzr\n" + "dup v3.4s, wzr\n" + // Load zero points. + "ld1 {v7.4s}, [%[batch_offsets_ptr]]\n" + "ld1 {v4.4s}, [%[scaling_factors_ptr]]\n" + // Zero out zero point accumulators. + "dup v14.4s, wzr\n" + "dup v15.4s, wzr\n" + + // Load per channel scales if not null. + "cmp %w[is_channel_scale_nullptr], #0\n" + "bne 1f\n" + "ld1r {v16.4s}, [%[channel_scales_ptr]], #4\n" + "ld1r {v17.4s}, [%[channel_scales_ptr]]\n" + "fmul v16.4s, v16.4s, v4.4s\n" + "fmul v17.4s, v17.4s, v4.4s\n" + "b 2f\n" + "1:\n" + "mov v16.16b, v4.16b\n" + "mov v17.16b, v4.16b\n" + "2:\n" + "ld1 {v12.16b}, [%[mat_ptr0]], #16\n" + "ld1 {v8.16b}, [%[vec_ptr]], #16\n" + ".word 0x4f8ce100 // sdot v0.4s, v8.16b, v12.4b[0]\n" + "ld1 {v9.16b}, [%[vec_ptr]], #16\n" + ".word 0x4face121 // sdot v1.4s, v9.16b, v12.4b[1]\n" + "ld1 {v10.16b}, [%[vec_ptr]], #16\n" + ".word 0x4f8ce940 // sdot v0.4s, v10.16b, v12.4b[2]\n" + "ld1 {v11.16b}, [%[vec_ptr]], #16\n" + ".word 0x4face961 // sdot v1.4s, v11.16b, v12.4b[3]\n" + "ld1 {v13.16b}, [%[mat_ptr1]], #16\n" + ".word 0x4f8de102 // sdot v2.4s, v8.16b, v13.4b[0]\n" + ".word 0x4fade123 // sdot v3.4s, v9.16b, v13.4b[1]\n" + ".word 0x4f8de942 // sdot v2.4s, v10.16b, v13.4b[2]\n" + ".word 0x4fade963 // sdot v3.4s, v11.16b, v13.4b[3]\n" + "cmp %w[is_row_sums_nullptr], #1\n" + "bne 3f\n" + // Accumulate row_sums for zero point calculations. + "saddlp v12.8h, v12.16b\n" + "saddlp v13.8h, v13.16b\n" + "sadalp v14.4s, v12.8h\n" + "sadalp v15.4s, v13.8h\n" + "3:\n" + "cmp %[mat_ptr0], %[mat_ptr0_end]\n" + "bne 2b\n" + "add v0.4s, v0.4s, v1.4s\n" + "add v2.4s, v2.4s, v3.4s\n" + + "cmp %w[is_row_sums_nullptr], #1\n" + "bne 4f\n" + // Calculate zero point offsets. + "addv s14, v14.4s\n" + "addv s15, v15.4s\n" + "dup v14.4s, v14.s[0]\n" + "dup v15.4s, v15.s[0]\n" + "b 5f\n" + "4:\n" + "ld1r {v14.4s}, [%[row_sums_ptr]], #4\n" + "ld1r {v15.4s}, [%[row_sums_ptr]]\n" + "5:\n" + + "mul v14.4s, v14.4s, v7.4s\n" + "mul v15.4s, v15.4s, v7.4s\n" + "sub v0.4s, v0.4s, v14.4s\n" + "sub v2.4s, v2.4s, v15.4s\n" + + "scvtf v0.4s, v0.4s\n" + "scvtf v1.4s, v2.4s\n" + + // Multiply scale. + "fmul v0.4s, v16.4s, v0.4s\n" + "fmul v1.4s, v17.4s, v1.4s\n" + + "ld2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" + "sub %[result_ptr], %[result_ptr], %[wide_rows], lsl #2\n" + "fadd v9.4s, v9.4s, v0.4s\n" + "fadd v10.4s, v10.4s, v1.4s\n" + "st2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" + : [ mat_ptr0 ] "+r"(mat_ptr0), [ mat_ptr1 ] "+r"(mat_ptr1), [ vec_ptr ] "+r"(vec_ptr), + [ result_ptr ] "+r"(result_ptr), [ row_sums_ptr ] "+r"(row_sums_ptr) + : [ mat_ptr0_end ] "r"(mat_ptr0_end), [ scaling_factors_ptr ] "r"(scaling_factors_ptr), + [ wide_rows ] "r"(wide_rows), [ channel_scales_ptr ] "r"(channel_scales_ptr), + [ batch_offsets_ptr ] "r"(batch_offsets_ptr), + [ is_channel_scale_nullptr ] "r"(is_channel_scale_nullptr), + [ is_row_sums_nullptr ] "r"(is_row_sums_nullptr) + : "x0", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", + "v13", "v14", "v15", "v16", "v17", "w0", "w1", "cc", "memory"); } } @@ -458,9 +458,9 @@ static void DotprodMatrixBatchFourVectorMultiplyAccumulate( // We don't use this kernel when n_batch = 1 because the baseline kernel // is fine for that case. inline void DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate( - const int8_t *__restrict__ matrix, const int m_rows, const int m_cols, const int8_t *vectors, - const float *scaling_factors, int n_batch, float *__restrict__ result, - const float *per_channel_scale, const int32_t *input_offset, int32_t *row_sums) + const int8_t *__restrict__ matrix, const int m_rows, const int m_cols, const int8_t *vectors, + const float *scaling_factors, int n_batch, float *__restrict__ result, + const float *per_channel_scale, const int32_t *input_offset, int32_t *row_sums) { const int kWeightsPerUint32 = 4; @@ -475,14 +475,14 @@ inline void DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate( void *padded_vectors_free; const int padded_vectors_size = batch_round_up * m_cols; int8_t *padded_vectors = reinterpret_cast( - aligned_alloc(kWeightsPerUint32, padded_vectors_size, &padded_vectors_free)); + aligned_alloc(kWeightsPerUint32, padded_vectors_size, &padded_vectors_free)); memset(padded_vectors, 0, padded_vectors_size); void *padded_result_free; const int result_size = n_batch * m_rows * sizeof(float); const int padded_result_size = batch_round_up * m_rows * sizeof(float); float *padded_result = reinterpret_cast( - aligned_alloc(kWeightsPerUint32, padded_result_size, &padded_result_free)); + aligned_alloc(kWeightsPerUint32, padded_result_size, &padded_result_free)); memcpy(padded_result, result, result_size); memset(reinterpret_cast(padded_result) + result_size, 0, padded_result_size - result_size); @@ -494,7 +494,7 @@ inline void DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate( void *padded_scaling_factors_free; const int padded_scaling_factors_size = batch_round_up * sizeof(float); float *padded_scaling_factors = reinterpret_cast( - aligned_alloc(kWeightsPerUint32, padded_scaling_factors_size, &padded_scaling_factors_free)); + aligned_alloc(kWeightsPerUint32, padded_scaling_factors_size, &padded_scaling_factors_free)); assert(static_cast(n_batch * sizeof(float)) <= padded_scaling_factors_size); assert(static_cast(batch_round_up * sizeof(float)) <= padded_scaling_factors_size); memset(padded_scaling_factors, 0, batch_round_up * sizeof(float)); @@ -505,7 +505,7 @@ inline void DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate( void *padded_input_offset_free; const int padded_input_offset_size = batch_round_up * sizeof(int32_t); int32_t *padded_input_offset = reinterpret_cast( - aligned_alloc(kWeightsPerUint32, padded_input_offset_size, &padded_input_offset_free)); + aligned_alloc(kWeightsPerUint32, padded_input_offset_size, &padded_input_offset_free)); assert(static_cast(n_batch * sizeof(int32_t)) <= padded_input_offset_size); assert(static_cast(batch_round_up * sizeof(int32_t)) <= padded_input_offset_size); memset(padded_input_offset, 0, batch_round_up * sizeof(int32_t)); @@ -513,8 +513,8 @@ inline void DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate( // Call the main kernel. DotprodMatrixBatchFourVectorMultiplyAccumulate( - matrix, m_rows, m_cols, padded_vectors, padded_scaling_factors, batch_round_up, - padded_result, per_channel_scale, padded_input_offset, row_sums); + matrix, m_rows, m_cols, padded_vectors, padded_scaling_factors, batch_round_up, padded_result, + per_channel_scale, padded_input_offset, row_sums); free(padded_input_offset_free); } @@ -533,13 +533,13 @@ inline void DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate( } inline void DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate( - const int8_t *__restrict__ matrix, const int m_rows, const int m_cols, const int8_t *vectors, - const float *scaling_factors, int n_batch, float *__restrict__ result) + const int8_t *__restrict__ matrix, const int m_rows, const int m_cols, const int8_t *vectors, + const float *scaling_factors, int n_batch, float *__restrict__ result) { DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate( - matrix, m_rows, m_cols, vectors, scaling_factors, n_batch, result, - /*per_channel_scale=*/nullptr, /*input_offset=*/nullptr, - /*row_sums=*/nullptr); + matrix, m_rows, m_cols, vectors, scaling_factors, n_batch, result, + /*per_channel_scale=*/nullptr, /*input_offset=*/nullptr, + /*row_sums=*/nullptr); } #endif // __aarch64__ @@ -736,7 +736,7 @@ inline void NeonSymmetricQuantizeFloats(const float *values, const int size, for (int i = postamble_start; i < size; ++i) { const int32_t quantized_value = - static_cast(std::round(scaling_factor_inv * values[i])); + static_cast(std::round(scaling_factor_inv * values[i])); quantized_values[i] = std::min(kScale, std::max(-kScale, quantized_value)); } } @@ -830,7 +830,7 @@ inline void NeonMatrixBatchVectorMultiplyAccumulate(const int8_t *__restrict__ m // Here the assumption is that each buffer is 4-byte aligned. Otherwise, // performance may suffer significantly. assert( // NOLINT - ((uintptr_t)(&row_ptr[col]) & (kWeightsPerUint32 - 1)) == 0); + ((uintptr_t)(&row_ptr[col]) & (kWeightsPerUint32 - 1)) == 0); const int8x16_t s1_8x16 = vld1q_s8((const int8_t *)(aligned_vec + col)); const int8x16_t s2_8x16 = vld1q_s8((const int8_t *)(row_ptr + col)); // Multiply the low bits (i.e. the lower 8 8bit numbers in the @@ -855,7 +855,7 @@ inline void NeonMatrixBatchVectorMultiplyAccumulate(const int8_t *__restrict__ m // Here the assumption is that each buffer is 4-bytes aligned. // Otherwise, performance may suffer significantly. assert( // NOLINT - ((uintptr_t)(&row_ptr[col]) & (kWeightsPerUint32 - 1)) == 0); + ((uintptr_t)(&row_ptr[col]) & (kWeightsPerUint32 - 1)) == 0); const int8x8_t s1_8x8 = vld1_s8((const int8_t *)(aligned_vec + col)); const int8x8_t s2_8x8 = vld1_s8((const int8_t *)(row_ptr + col)); const int16x8_t prod_16x8 = vmull_s8(s1_8x8, s2_8x8); @@ -952,7 +952,7 @@ inline void NeonMatrixBatchVectorMultiplyAccumulate(const int8_t *__restrict__ m const float32x4_t float_val1 = vcvtq_f32_s32(scratch_val1); const float32x4_t result0 = vmlaq_f32(vld1q_f32(result), float_val0, scaling_factor0); const float32x4_t result1 = - vmlaq_f32(vld1q_f32(result + 4 * result_stride), float_val1, scaling_factor1); + vmlaq_f32(vld1q_f32(result + 4 * result_stride), float_val1, scaling_factor1); vst1q_f32(result, result0); vst1q_f32(result + 4 * result_stride, result1); } diff --git a/compute/cker/include/cker/PortableTensorUtils.h b/compute/cker/include/cker/PortableTensorUtils.h index 3b3b27f..2a58a2e 100644 --- a/compute/cker/include/cker/PortableTensorUtils.h +++ b/compute/cker/include/cker/PortableTensorUtils.h @@ -138,7 +138,7 @@ inline void PortableSymmetricQuantizeFloats(const float *values, const int size, for (int i = 0; i < size; ++i) { const int32_t quantized_value = - static_cast(std::round(values[i] * scaling_factor_inv)); + static_cast(std::round(values[i] * scaling_factor_inv)); // Clamp: just in case some odd numeric offset. quantized_values[i] = std::min(kScale, std::max(-kScale, quantized_value)); } diff --git a/compute/cker/include/cker/Types.h b/compute/cker/include/cker/Types.h index acb6cac..10f3ecb 100644 --- a/compute/cker/include/cker/Types.h +++ b/compute/cker/include/cker/Types.h @@ -389,6 +389,11 @@ struct SpaceToDepthParams int32_t block_size; }; +struct LeakyReluParams +{ + float alpha; +}; + enum class Order { kColMajor, @@ -475,9 +480,9 @@ enum class QuantizationFlavor // (only those that need perchannel quantization do). template ::value - ? QuantizationFlavor::kFloatingPoint - : QuantizationFlavor::kIntegerWithUniformMultiplier> + std::is_floating_point::value + ? QuantizationFlavor::kFloatingPoint + : QuantizationFlavor::kIntegerWithUniformMultiplier> struct GemmParams { // Only for non-floating-point cases. The fixed-point part (i.e. the mantissa) @@ -504,12 +509,12 @@ struct GemmParams const AccumScalar *bias = nullptr; // min clamp bound of destination values. DstScalar clamp_min = std::is_floating_point::value - ? -std::numeric_limits::infinity() - : std::numeric_limits::lowest(); + ? -std::numeric_limits::infinity() + : std::numeric_limits::lowest(); // max clamp bound of destination values. DstScalar clamp_max = std::is_floating_point::value - ? std::numeric_limits::infinity() - : std::numeric_limits::max(); + ? std::numeric_limits::infinity() + : std::numeric_limits::max(); }; // Validates self-consistency of GemmParams. diff --git a/compute/cker/include/cker/Utils.h b/compute/cker/include/cker/Utils.h index 2abb998..f73c015 100644 --- a/compute/cker/include/cker/Utils.h +++ b/compute/cker/include/cker/Utils.h @@ -88,8 +88,8 @@ inline int32_t MultiplyByQuantizedMultiplier(int32_t x, int32_t quantized_multip int left_shift = shift > 0 ? shift : 0; int right_shift = shift > 0 ? 0 : -shift; return gemmlowp::RoundingDivideByPOT( - gemmlowp::SaturatingRoundingDoublingHighMul(x * (1 << left_shift), quantized_multiplier), - right_shift); + gemmlowp::SaturatingRoundingDoublingHighMul(x * (1 << left_shift), quantized_multiplier), + right_shift); } inline int32_t MultiplyByQuantizedMultiplierGreaterThanOne(int32_t x, int32_t quantized_multiplier, @@ -103,7 +103,7 @@ inline int32_t MultiplyByQuantizedMultiplierSmallerThanOneExp(int32_t x, int left_shift) { return gemmlowp::RoundingDivideByPOT( - gemmlowp::SaturatingRoundingDoublingHighMul(x, quantized_multiplier), -left_shift); + gemmlowp::SaturatingRoundingDoublingHighMul(x, quantized_multiplier), -left_shift); } inline int NodeOffset(int b, int h, int w, int height, int width) @@ -162,7 +162,7 @@ inline void GetInvSqrtQuantizedMultiplierExp(int32_t input, int reverse_shift, const F3 fixedpoint_input = F3::FromRaw(input >> 1); const F3 fixedpoint_half_input = SaturatingRoundingMultiplyByPOT<-1>(fixedpoint_input); const F3 fixedpoint_half_three = - GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F3, (1 << 28) + (1 << 27), 1.5); + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F3, (1 << 28) + (1 << 27), 1.5); // Newton-Raphson iteration // Naive unoptimized starting guess: x = 1 F3 x = F3::One(); @@ -173,7 +173,7 @@ inline void GetInvSqrtQuantizedMultiplierExp(int32_t input, int reverse_shift, x = Rescale<3>(fixedpoint_half_three * x - fixedpoint_half_input * x3); } const F0 fixedpoint_half_sqrt_2 = - GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F0, 1518500250, std::sqrt(2.) / 2.); + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F0, 1518500250, std::sqrt(2.) / 2.); x = x * fixedpoint_half_sqrt_2; *output_inv_sqrt = x.raw(); if (*output_shift < 0) @@ -429,7 +429,7 @@ template class SequentialTensorWriter { public: SequentialTensorWriter(const T *input_data, T *output_data) - : input_data_(input_data), output_ptr_(output_data) + : input_data_(input_data), output_ptr_(output_data) { } diff --git a/compute/cker/include/cker/eigen/EigenSupport.h b/compute/cker/include/cker/eigen/EigenSupport.h index 49c3421..e3b1099 100644 --- a/compute/cker/include/cker/eigen/EigenSupport.h +++ b/compute/cker/include/cker/eigen/EigenSupport.h @@ -39,17 +39,17 @@ namespace eigen_support // library. typedef Eigen::TensorMap, Eigen::Aligned> - EigenMatrix; + EigenMatrix; typedef Eigen::TensorMap, Eigen::Aligned> - ConstEigenMatrix; + ConstEigenMatrix; typedef Eigen::TensorMap, Eigen::Aligned> - EigenTensor; + EigenTensor; typedef Eigen::TensorMap, Eigen::Aligned> - ConstEigenTensor; + ConstEigenTensor; // Utility functions we need for the EigenTensor API. template struct MatMulConvFunctor diff --git a/compute/cker/include/cker/eigen/Utils.h b/compute/cker/include/cker/eigen/Utils.h index f9c7063..40cb854 100644 --- a/compute/cker/include/cker/eigen/Utils.h +++ b/compute/cker/include/cker/eigen/Utils.h @@ -36,9 +36,9 @@ namespace cker // Eigen::Map> template using VectorMap = typename std::conditional< - std::is_const::value, - Eigen::Map::type, Eigen::Dynamic, 1>>, - Eigen::Map>>::type; + std::is_const::value, + Eigen::Map::type, Eigen::Dynamic, 1>>, + Eigen::Map>>::type; template VectorMap MapAsVector(Scalar *data, const Shape &shape) { @@ -51,10 +51,10 @@ template VectorMap MapAsVector(Scalar *data, const Sha // above also applies here. template using MatrixMap = typename std::conditional< - std::is_const::value, - Eigen::Map::type, Eigen::Dynamic, - Eigen::Dynamic>>, - Eigen::Map>>::type; + std::is_const::value, + Eigen::Map< + const Eigen::Matrix::type, Eigen::Dynamic, Eigen::Dynamic>>, + Eigen::Map>>::type; template MatrixMap MapAsMatrixWithLastDimAsRows(Scalar *data, const Shape &shape) diff --git a/compute/cker/include/cker/eigen/eigen_convolution_helpers.h b/compute/cker/include/cker/eigen/eigen_convolution_helpers.h index dc3e255..9d4fd2e 100644 --- a/compute/cker/include/cker/eigen/eigen_convolution_helpers.h +++ b/compute/cker/include/cker/eigen/eigen_convolution_helpers.h @@ -49,20 +49,19 @@ class TensorEvaluatorHasPartialPacket public: template static auto functionExistsSfinae( - typename std::enable_if< - unpacket_traits::masked_load_available && - std::is_same< - PacketT, - decltype(std::declval().template partialPacket( - std::declval(), - std::declval::mask_t>()))>::value>::type *) - -> std::true_type; + typename std::enable_if< + unpacket_traits::masked_load_available && + std::is_same().template partialPacket( + std::declval(), + std::declval::mask_t>()))>::value>::type *) + -> std::true_type; template static auto functionExistsSfinae(...) -> std::false_type; typedef decltype( - functionExistsSfinae(nullptr)) status; + functionExistsSfinae(nullptr)) status; static constexpr bool value = status::value; }; @@ -71,9 +70,9 @@ public: // [from, to) range. If the mask bit is 1, element will be loaded/stored. template EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE - typename std::enable_if::masked_load_available, - typename unpacket_traits::mask_t>::type - mask(int from, int to) + typename std::enable_if::masked_load_available, + typename unpacket_traits::mask_t>::type + mask(int from, int to) { const Index packet_size = internal::unpacket_traits::size; eigen_assert(0 <= from && to <= (packet_size + 1) && from < to); diff --git a/compute/cker/include/cker/eigen/eigen_spatial_convolutions-inl.h b/compute/cker/include/cker/eigen/eigen_spatial_convolutions-inl.h index 92e1614..c931ac5 100644 --- a/compute/cker/include/cker/eigen/eigen_spatial_convolutions-inl.h +++ b/compute/cker/include/cker/eigen/eigen_spatial_convolutions-inl.h @@ -62,30 +62,27 @@ template class TensorContractionInputMapper< - Scalar_, Index, Side, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> + Scalar_, Index, Side, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> { public: typedef Scalar_ Scalar; typedef TensorContractionInputMapper< - Scalar, Index, Side, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> - Self; + Scalar, Index, Side, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> + Self; typedef TensorContractionSubMapper< - Scalar, Index, Side, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> - SubMapper; + Scalar, Index, Side, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> + SubMapper; typedef SubMapper VectorMapper; typedef SubMapper LinearMapper; @@ -95,11 +92,11 @@ public: EIGEN_DEVICE_FUNC TensorContractionInputMapper( - const TensorEvaluator< - const TensorReshapingOp>, - Device> &tensor, - const nocontract_t &, const nocontract_t &, const contract_t &, const contract_t &) - : m_impl(tensor.impl().impl()) + const TensorEvaluator< + const TensorReshapingOp>, Device> + &tensor, + const nocontract_t &, const nocontract_t &, const contract_t &, const contract_t &) + : m_impl(tensor.impl().impl()) { Index patch_rows; Index patch_depth; @@ -167,7 +164,7 @@ public: EIGEN_DEVICE_FUNC TensorContractionInputMapper(const TensorContractionInputMapper &base_mapper) - : m_impl(base_mapper.m_impl) + : m_impl(base_mapper.m_impl) { m_patch_cols = base_mapper.m_patch_cols; m_num_patches = base_mapper.m_num_patches; @@ -280,11 +277,10 @@ public: private: friend class TensorContractionSubMapper< - Scalar, Index, Side, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment>; + Scalar, Index, Side, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment>; // Load coefficient from a patch specified by the "within patch offset" // (patchId) and the precomputed indices of the first element of the patch. @@ -298,14 +294,14 @@ private: const Index colOffset = patchOffset / m_fastColStride; const Index inputCol = colIndex + colOffset * m_in_col_strides; const Index origInputCol = (m_patch_col_inflate_strides == 1) - ? inputCol - : ((inputCol >= 0) ? (inputCol / m_fastInputColStride) : 0); + ? inputCol + : ((inputCol >= 0) ? (inputCol / m_fastInputColStride) : 0); const Index rowOffset = patchOffset - colOffset * m_colStride; const Index inputRow = rowIndex + rowOffset * m_in_row_strides; const Index origInputRow = (m_patch_row_inflate_strides == 1) - ? inputRow - : ((inputRow >= 0) ? (inputRow / m_fastInputRowStride) : 0); + ? inputRow + : ((inputRow >= 0) ? (inputRow / m_fastInputRowStride) : 0); if (origInputCol < 0 || origInputRow < 0 || origInputCol >= m_inputCols || origInputRow >= m_inputRows || (inputCol != origInputCol * m_patch_col_inflate_strides) || (inputRow != origInputRow * m_patch_row_inflate_strides)) @@ -314,7 +310,7 @@ private: } const Index depth = patchId - patchOffset * patchDepth(); const Index inputIndex = - depth + origInputRow * m_rowInputStride + origInputCol * m_colInputStride + otherIndex; + depth + origInputRow * m_rowInputStride + origInputCol * m_colInputStride + otherIndex; return m_impl.coeff(inputIndex); } @@ -338,7 +334,7 @@ private: } const Index depth = patchId - patchOffset * patchDepth(); const Index inputIndex = - depth + inputRow * m_rowInputStride + inputCol * m_colInputStride + otherIndex; + depth + inputRow * m_rowInputStride + inputCol * m_colInputStride + otherIndex; return m_impl.coeff(inputIndex); } @@ -390,7 +386,7 @@ private: // span[0] all the way upto (and including) span[1]. const Index depth = patchId - patchOffsets[0] * patchDepth(); const Index inputIndex = - depth + inputRows[0] * m_rowInputStride + inputCol * m_colInputStride + otherIndex; + depth + inputRows[0] * m_rowInputStride + inputCol * m_colInputStride + otherIndex; return m_impl.template partialPacket(inputIndex - span[0], mask(span[0], span[1] + 1)); } @@ -445,10 +441,10 @@ private: // Load partial packets and do bit-wise OR to generate required packet return internal::por( - loadPartialPacketStandard(rowIndex, colIndex, otherIndex, patchIds[0], spans[0], - patchOffsets2Cols[0], colOffsets[0]), - loadPartialPacketStandard(rowIndex, colIndex, otherIndex, patchIds[1], spans[1], - patchOffsets2Cols[1], colOffsets[1])); + loadPartialPacketStandard(rowIndex, colIndex, otherIndex, patchIds[0], spans[0], + patchOffsets2Cols[0], colOffsets[0]), + loadPartialPacketStandard(rowIndex, colIndex, otherIndex, patchIds[1], spans[1], + patchOffsets2Cols[1], colOffsets[1])); } // Helper function to load a packet that is present in a single columns. @@ -477,7 +473,7 @@ private: // no padding const Index depth = patchId - patchOffsets[0] * patchDepth(); const Index inputIndex = - depth + inputRows[0] * m_rowInputStride + inputCols[0] * m_colInputStride + otherIndex; + depth + inputRows[0] * m_rowInputStride + inputCols[0] * m_colInputStride + otherIndex; return m_impl.template packet(inputIndex); } return packetWithPossibleZero(patchId, rowIndex, colIndex, otherIndex); @@ -490,7 +486,7 @@ private: // load. template EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE typename std::enable_if< - !TensorEvaluatorHasPartialPacket::value, PacketT>::type + !TensorEvaluatorHasPartialPacket::value, PacketT>::type loadPacketStandard(Index patchId, Index rowIndex, Index colIndex, Index otherIndex) const { const Index packetSize = internal::unpacket_traits::size; @@ -538,7 +534,7 @@ private: // packets. template EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE typename std::enable_if< - TensorEvaluatorHasPartialPacket::value, PacketT>::type + TensorEvaluatorHasPartialPacket::value, PacketT>::type loadPacketStandard(Index patchId, Index rowIndex, Index colIndex, Index otherIndex) const { const Index packetSize = internal::unpacket_traits::size; @@ -604,7 +600,7 @@ private: // no padding const Index depth = patchId - patchOffset * patchDepth(); const Index inputIndex = - depth + inputRow * m_rowInputStride + inputCol * m_colInputStride + otherIndex; + depth + inputRow * m_rowInputStride + inputCol * m_colInputStride + otherIndex; return m_impl.template packet(inputIndex); } @@ -627,10 +623,10 @@ private: computeBaseIndices(Index patchIndex, Index &rowIndex, Index &colIndex, Index &otherIndex) const { const size_t NumInputDims = - array_size::Dimensions>::value; + array_size::Dimensions>::value; otherIndex = (NumInputDims == 3) ? 0 : patchIndex / m_fastNumPatches; const Index patch2DIndex = - (NumInputDims == 3) ? patchIndex : (patchIndex - otherIndex * m_num_patches); + (NumInputDims == 3) ? patchIndex : (patchIndex - otherIndex * m_num_patches); otherIndex *= m_patchInputStride; colIndex = patch2DIndex / m_fastOutputRows; rowIndex = patch2DIndex - colIndex * m_outputRows; @@ -689,31 +685,28 @@ template class TensorContractionSubMapper< - Scalar, Index, Side, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> + Scalar, Index, Side, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> { public: typedef typename packet_traits::type Packet; typedef typename packet_traits::half HalfPacket; typedef TensorContractionInputMapper< - Scalar, Index, Side, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> - ParentMapper; + Scalar, Index, Side, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> + ParentMapper; typedef TensorContractionSubMapper< - Scalar, Index, Side, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> - Self; + Scalar, Index, Side, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> + Self; typedef Self LinearMapper; @@ -722,16 +715,16 @@ public: EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorContractionSubMapper(const ParentMapper &base_mapper, Index vert_offset, Index horiz_offset) - : m_depth_offset(vert_offset), m_col_offset(horiz_offset), m_base_mapper(base_mapper) + : m_depth_offset(vert_offset), m_col_offset(horiz_offset), m_base_mapper(base_mapper) { m_base_mapper.computeBaseIndices(m_col_offset, m_rowIndex, m_colIndex, m_otherIndex); } EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorContractionSubMapper(const Self &base_mapper, Index vert_offset, Index horiz_offset) - : m_depth_offset(vert_offset + base_mapper.m_depth_offset), - m_col_offset(horiz_offset + base_mapper.m_col_offset), - m_base_mapper(base_mapper.m_base_mapper) + : m_depth_offset(vert_offset + base_mapper.m_depth_offset), + m_col_offset(horiz_offset + base_mapper.m_col_offset), + m_base_mapper(base_mapper.m_base_mapper) { m_base_mapper.computeBaseIndices(m_col_offset, m_rowIndex, m_colIndex, m_otherIndex); } @@ -766,7 +759,7 @@ public: { typedef decltype(m_base_mapper.m_impl) TensorEvaluatorT; return m_base_mapper.template loadPacketStandard( - i + m_depth_offset, m_rowIndex, m_colIndex, m_otherIndex); + i + m_depth_offset, m_rowIndex, m_colIndex, m_otherIndex); } template EIGEN_DEVICE_FUNC bool aligned(Index) const { return false; } @@ -781,7 +774,7 @@ public: EIGEN_ALWAYS_INLINE Index maxCol(const Index peeled_k) const { const Index max_col = - (m_depth_offset + (peeled_k == 0 ? 0 : peeled_k - 1)) / fastPatchColStride(); + (m_depth_offset + (peeled_k == 0 ? 0 : peeled_k - 1)) / fastPatchColStride(); return std::min(1 + max_col, patchCols()); } @@ -789,8 +782,8 @@ public: EIGEN_ALWAYS_INLINE Index maxRow(const Index peeled_k, const Index col) const { const Index max_row = - (m_depth_offset + (peeled_k == 0 ? 0 : peeled_k - 1) - col * patchColStride()) / - fastPatchRowStride(); + (m_depth_offset + (peeled_k == 0 ? 0 : peeled_k - 1) - col * patchColStride()) / + fastPatchRowStride(); return std::min(1 + max_row, patchRows()); } @@ -862,7 +855,7 @@ public: } template EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE typename std::enable_if< - TensorEvaluatorHasPartialPacket::value, PacketT>::type + TensorEvaluatorHasPartialPacket::value, PacketT>::type partialPacketNoPadding(const Index depth, const Index baseIndex, Index num_coeffs) const { const Index inputIndex = depth + baseIndex; @@ -913,8 +906,8 @@ public: const Index input_row = m_rowIndex + row * m_base_mapper.m_in_row_strides; *orig_row = (m_base_mapper.m_patch_row_inflate_strides == 1) - ? input_row - : ((input_row >= 0) ? (input_row / m_base_mapper.m_fastInputRowStride) : 0); + ? input_row + : ((input_row >= 0) ? (input_row / m_base_mapper.m_fastInputRowStride) : 0); return (*orig_row < 0 || *orig_row >= m_base_mapper.m_inputRows) || (input_row != *orig_row * m_base_mapper.m_patch_row_inflate_strides); @@ -932,8 +925,8 @@ public: const Index input_col = m_colIndex + col * m_base_mapper.m_in_col_strides; *orig_col = (m_base_mapper.m_patch_col_inflate_strides == 1) - ? input_col - : ((input_col >= 0) ? (input_col / m_base_mapper.m_fastInputColStride) : 0); + ? input_col + : ((input_col >= 0) ? (input_col / m_base_mapper.m_fastInputColStride) : 0); return (*orig_col < 0 || *orig_col >= m_base_mapper.m_inputCols) || (input_col != *orig_col * m_base_mapper.m_patch_col_inflate_strides); @@ -1033,23 +1026,20 @@ template struct gemm_pack_rhs< - Scalar, Index, - TensorContractionSubMapper< - Scalar, Index, Rhs, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, - Alignment>, - nr, ColMajor, false, false> + Scalar, Index, + TensorContractionSubMapper< + Scalar, Index, Rhs, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment>, + nr, ColMajor, false, false> { typedef TensorContractionSubMapper< - Scalar, Index, Rhs, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> - SubMapper; + Scalar, Index, Rhs, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment> + SubMapper; typedef SubMapper DataMapper; typedef typename packet_traits::type Packet; @@ -1159,7 +1149,7 @@ struct gemm_pack_rhs< const Index idx3 = dm3.baseIndex(r, c); const Index start_depth = - ((c == start_col) && (r == start_row)) ? rhs.depthOffset() : 0; + ((c == start_col) && (r == start_row)) ? rhs.depthOffset() : 0; const Index max_depth = rhs.maxDepth(peeled_k - k, start_depth); eigen_assert((max_depth - start_depth) % packet_size == 0); @@ -1248,22 +1238,20 @@ template struct gemm_pack_rhs< - Scalar, Index, - TensorContractionSubMapper< - Scalar, Index, Rhs, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, 2, inner_dim_contiguous, inner_dim_reordered, Alignment>, - nr, ColMajor, false, false> + Scalar, Index, + TensorContractionSubMapper< + Scalar, Index, Rhs, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, 2, inner_dim_contiguous, inner_dim_reordered, Alignment>, + nr, ColMajor, false, false> { typedef TensorContractionSubMapper< - Scalar, Index, Rhs, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, 2, inner_dim_contiguous, inner_dim_reordered, Alignment> - SubMapper; + Scalar, Index, Rhs, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, 2, inner_dim_contiguous, inner_dim_reordered, Alignment> + SubMapper; typedef SubMapper DataMapper; typedef typename packet_traits::type Packet; @@ -1378,7 +1366,7 @@ struct gemm_pack_rhs< const Index idx3 = dm3.baseIndex(r, c); const Index start_depth = - ((c == start_col) && (r == start_row)) ? rhs.depthOffset() : 0; + ((c == start_col) && (r == start_row)) ? rhs.depthOffset() : 0; const Index max_depth = rhs.maxDepth(peeled_k - k, start_depth); eigen_assert((max_depth - start_depth) % packet_size == 0); @@ -1472,22 +1460,20 @@ template struct gemm_pack_rhs< - Scalar, Index, - TensorContractionSubMapper< - Scalar, Index, Rhs, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, 1, inner_dim_contiguous, inner_dim_reordered, Alignment>, - nr, ColMajor, false, false> + Scalar, Index, + TensorContractionSubMapper< + Scalar, Index, Rhs, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, 1, inner_dim_contiguous, inner_dim_reordered, Alignment>, + nr, ColMajor, false, false> { typedef TensorContractionSubMapper< - Scalar, Index, Rhs, - TensorEvaluator< - const TensorReshapingOp>, - Device>, - nocontract_t, contract_t, 1, inner_dim_contiguous, inner_dim_reordered, Alignment> - SubMapper; + Scalar, Index, Rhs, + TensorEvaluator< + const TensorReshapingOp>, Device>, + nocontract_t, contract_t, 1, inner_dim_contiguous, inner_dim_reordered, Alignment> + SubMapper; typedef SubMapper DataMapper; EIGEN_STATIC_ASSERT((nr == 4), YOU_MADE_A_PROGRAMMING_MISTAKE) @@ -1582,27 +1568,25 @@ struct gemm_pack_rhs< */ template EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static const typename internal::conditional< - internal::traits::Layout == ColMajor, - TensorReshapingOp< - const DSizes::Index, - internal::traits::NumDimensions>, - const TensorContractionOp< - const array::Index>, 1>, - const TensorReshapingOp::Index, 2>, - const Kernel>, - const TensorReshapingOp::Index, 2>, - const TensorImagePatchOp>, - const OutputKernel>>, - TensorReshapingOp< - const DSizes::Index, - internal::traits::NumDimensions>, - const TensorContractionOp< - const array::Index>, 1>, - const TensorReshapingOp::Index, 2>, - const TensorImagePatchOp>, - const TensorReshapingOp::Index, 2>, - const Kernel>, - const OutputKernel>>>::type + internal::traits::Layout == ColMajor, + TensorReshapingOp< + const DSizes::Index, internal::traits::NumDimensions>, + const TensorContractionOp< + const array::Index>, 1>, + const TensorReshapingOp::Index, 2>, + const Kernel>, + const TensorReshapingOp::Index, 2>, + const TensorImagePatchOp>, + const OutputKernel>>, + TensorReshapingOp< + const DSizes::Index, internal::traits::NumDimensions>, + const TensorContractionOp< + const array::Index>, 1>, + const TensorReshapingOp::Index, 2>, + const TensorImagePatchOp>, + const TensorReshapingOp::Index, 2>, + const Kernel>, + const OutputKernel>>>::type SpatialConvolution(const Input &input, const Kernel &kernel, const Index row_stride = 1, const Index col_stride = 1, const PaddingType padding_type = PADDING_SAME, const Index row_in_stride = 1, const Index col_in_stride = 1, @@ -1612,11 +1596,11 @@ SpatialConvolution(const Input &input, const Kernel &kernel, const Index row_str typedef typename internal::traits::Index TensorIndex; TensorRef::Scalar, internal::traits::NumDimensions, internal::traits::Layout, TensorIndex>> - in(input); + in(input); TensorRef< - Tensor::Scalar, internal::traits::NumDimensions, - internal::traits::Layout, TensorIndex>> - kern(kernel); + Tensor::Scalar, internal::traits::NumDimensions, + internal::traits::Layout, TensorIndex>> + kern(kernel); EIGEN_STATIC_ASSERT(internal::traits::Layout == internal::traits::Layout, YOU_MADE_A_PROGRAMMING_MISTAKE) @@ -1735,46 +1719,46 @@ SpatialConvolution(const Input &input, const Kernel &kernel, const Index row_str } if (padding_explicit) { - return choose( - Cond::Layout == ColMajor>(), - kernel.reshape(kernel_dims) - .contract(input - .extract_image_patches(kernelRows, kernelCols, row_stride, col_stride, - row_in_stride, col_in_stride, - /*row_inflate_stride=*/1, - /*col_inflate_stride=*/1, padding_top, - padding_bottom, padding_left, padding_right, - /*padding_value=*/0) - .reshape(pre_contract_dims), - contract_dims, output_kernel) - .reshape(post_contract_dims), - input - .extract_image_patches( - kernelRows, kernelCols, row_stride, col_stride, row_in_stride, col_in_stride, - /*row_inflate_stride=*/1, - /*col_inflate_stride=*/1, padding_top, padding_bottom, padding_left, padding_right, - /*padding_value=*/0) - .reshape(pre_contract_dims) - .contract(kernel.reshape(kernel_dims), contract_dims, output_kernel) - .reshape(post_contract_dims)); + return choose(Cond::Layout == ColMajor>(), + kernel.reshape(kernel_dims) + .contract(input + .extract_image_patches(kernelRows, kernelCols, row_stride, + col_stride, row_in_stride, col_in_stride, + /*row_inflate_stride=*/1, + /*col_inflate_stride=*/1, padding_top, + padding_bottom, padding_left, padding_right, + /*padding_value=*/0) + .reshape(pre_contract_dims), + contract_dims, output_kernel) + .reshape(post_contract_dims), + input + .extract_image_patches(kernelRows, kernelCols, row_stride, col_stride, + row_in_stride, col_in_stride, + /*row_inflate_stride=*/1, + /*col_inflate_stride=*/1, padding_top, padding_bottom, + padding_left, padding_right, + /*padding_value=*/0) + .reshape(pre_contract_dims) + .contract(kernel.reshape(kernel_dims), contract_dims, output_kernel) + .reshape(post_contract_dims)); } else { return choose( - Cond::Layout == ColMajor>(), - kernel.reshape(kernel_dims) - .contract(input - .extract_image_patches(kernelRows, kernelCols, row_stride, col_stride, - row_in_stride, col_in_stride, padding_type) - .reshape(pre_contract_dims), - contract_dims, output_kernel) - .reshape(post_contract_dims), - input - .extract_image_patches(kernelRows, kernelCols, row_stride, col_stride, row_in_stride, - col_in_stride, padding_type) - .reshape(pre_contract_dims) - .contract(kernel.reshape(kernel_dims), contract_dims, output_kernel) - .reshape(post_contract_dims)); + Cond::Layout == ColMajor>(), + kernel.reshape(kernel_dims) + .contract(input + .extract_image_patches(kernelRows, kernelCols, row_stride, col_stride, + row_in_stride, col_in_stride, padding_type) + .reshape(pre_contract_dims), + contract_dims, output_kernel) + .reshape(post_contract_dims), + input + .extract_image_patches(kernelRows, kernelCols, row_stride, col_stride, row_in_stride, + col_in_stride, padding_type) + .reshape(pre_contract_dims) + .contract(kernel.reshape(kernel_dims), contract_dims, output_kernel) + .reshape(post_contract_dims)); } } diff --git a/compute/cker/include/cker/operation/AveragePool.h b/compute/cker/include/cker/operation/AveragePool.h index 6149caf..a70e39c 100644 --- a/compute/cker/include/cker/operation/AveragePool.h +++ b/compute/cker/include/cker/operation/AveragePool.h @@ -73,10 +73,10 @@ void AveragePool(const PoolParams ¶ms, const Shape &input_shape, cons int hpad = h + params.padding_values.height; int wpad = w + params.padding_values.width; int h_start = - (hpad < params.filter_height) ? 0 : (hpad - params.filter_height) / stride_height + 1; + (hpad < params.filter_height) ? 0 : (hpad - params.filter_height) / stride_height + 1; int h_end = std::min(hpad / stride_height + 1, output_height); int w_start = - (wpad < params.filter_width) ? 0 : (wpad - params.filter_width) / stride_width + 1; + (wpad < params.filter_width) ? 0 : (wpad - params.filter_width) / stride_width + 1; int w_end = std::min(wpad / stride_width + 1, output_width); // compute elementwise sum for (int ph = h_start; ph < h_end; ++ph) @@ -146,11 +146,11 @@ inline void AveragePool16(const PoolParams ¶ms, const Shape &input_shape, const int filter_y_start = std::max(0, -in_y_origin); const int filter_y_end = std::min(params.filter_height, input_height - in_y_origin); const int filter_count = - (filter_x_end - filter_x_start) * (filter_y_end - filter_y_start); + (filter_x_end - filter_x_start) * (filter_y_end - filter_y_start); memset(acc, 0, tranche_depth * sizeof(acc[0])); const uint8_t *input_ptr = - input_data + depth_base + - depth * (in_x_origin + input_width * (in_y_origin + input_height * batch)); + input_data + depth_base + + depth * (in_x_origin + input_width * (in_y_origin + input_height * batch)); for (int fy = filter_y_start; fy < filter_y_end; fy++) { const uint8_t *input_row_ptr = input_ptr + depth * (fy * input_width + filter_x_start); @@ -283,11 +283,11 @@ inline void AveragePool32(const PoolParams ¶ms, const Shape &input_shape, const int filter_y_start = std::max(0, -in_y_origin); const int filter_y_end = std::min(params.filter_height, input_height - in_y_origin); const int filter_count = - (filter_x_end - filter_x_start) * (filter_y_end - filter_y_start); + (filter_x_end - filter_x_start) * (filter_y_end - filter_y_start); memset(acc, 0, tranche_depth * sizeof(acc[0])); const uint8_t *input_ptr = - input_data + depth_base + - depth * (in_x_origin + input_width * (in_y_origin + input_height * batch)); + input_data + depth_base + + depth * (in_x_origin + input_width * (in_y_origin + input_height * batch)); for (int fy = filter_y_start; fy < filter_y_end; fy++) { const uint8_t *input_row_ptr = input_ptr + depth * (fy * input_width + filter_x_start); diff --git a/compute/cker/include/cker/operation/BatchToSpaceND.h b/compute/cker/include/cker/operation/BatchToSpaceND.h index e33b2fb..980ad48 100644 --- a/compute/cker/include/cker/operation/BatchToSpaceND.h +++ b/compute/cker/include/cker/operation/BatchToSpaceND.h @@ -43,7 +43,7 @@ inline void GetIndexRange(int spatial_index_dim, int block_shape_dim, int input_ // Similarly, (*end_index) * block_shape_dim is rounded up too (note that // end_index is exclusive). *end_index = - std::min(input_dim, (output_dim - spatial_index_dim + block_shape_dim - 1) / block_shape_dim); + std::min(input_dim, (output_dim - spatial_index_dim + block_shape_dim - 1) / block_shape_dim); } template @@ -116,7 +116,7 @@ inline void BatchToSpaceND(const Shape &unextended_input1_shape, const T *input1 for (int in_w = in_w_start; in_w < in_w_end; ++in_w) { const int out_w = - in_w * block_shape_width + spatial_offset % block_shape_width - crops_left; + in_w * block_shape_width + spatial_offset % block_shape_width - crops_left; assert(out_w >= 0); assert(out_w < output_width); T *out = output_data + Offset(output_shape, out_batch, out_h, out_w, 0); diff --git a/compute/cker/include/cker/operation/BinaryArithmeticOps.h b/compute/cker/include/cker/operation/BinaryArithmeticOps.h index d9917a9..fe5f877 100644 --- a/compute/cker/include/cker/operation/BinaryArithmeticOps.h +++ b/compute/cker/include/cker/operation/BinaryArithmeticOps.h @@ -139,7 +139,7 @@ inline bool ProcessBroadcastShapes(const Shape &shape0, const Shape &shape1, // From this point it is assumed contractually that corresponding dimensions // in shape0 and shape1 are either (a) equal or (b) one or other equals 1. const bool swap_inputs = - params->broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast; + params->broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast; const Shape *shape_a = swap_inputs ? &extended_shape1 : &extended_shape0; const Shape *shape_b = swap_inputs ? &extended_shape0 : &extended_shape1; @@ -281,8 +281,8 @@ inline void BroadcastBinaryArithmeticOp(BinaryArithmeticOpParam ¶ms, const S break; case nnfw::cker::BinaryArithmeticOpType::MUL: optimized::BroadcastMulDispatchQuant8( - params, input1_shape, const_cast(input1_data), input2_shape, - const_cast(input2_data), output_shape, output_data); + params, input1_shape, const_cast(input1_data), input2_shape, + const_cast(input2_data), output_shape, output_data); break; case nnfw::cker::BinaryArithmeticOpType::DIV: case nnfw::cker::BinaryArithmeticOpType::POW: @@ -320,8 +320,8 @@ inline void BroadcastBinaryArithmeticOp(BinaryArithmeticOpParam ¶ms, const S break; case nnfw::cker::BinaryArithmeticOpType::POW: reference::BroadcastBinaryArithmeticOpSlow( - params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, - GetBinaryArtithmeticFn()); + params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, + GetBinaryArtithmeticFn()); break; default: assert(false); diff --git a/compute/cker/include/cker/operation/Common.h b/compute/cker/include/cker/operation/Common.h index d69b38a..24d4cc4 100644 --- a/compute/cker/include/cker/operation/Common.h +++ b/compute/cker/include/cker/operation/Common.h @@ -82,7 +82,7 @@ inline void BiasAndClamp(float clamp_min, float clamp_max, int bias_size, const for (; i < bias_size; i++) { array_ptr[i] = - ActivationFunctionWithMinMax(array_ptr[i] + bias_data[i], clamp_min, clamp_max); + ActivationFunctionWithMinMax(array_ptr[i] + bias_data[i], clamp_min, clamp_max); } } #else // not NEON @@ -91,7 +91,7 @@ inline void BiasAndClamp(float clamp_min, float clamp_max, int bias_size, const for (int i = 0; i < bias_size; i++) { array_data[array_offset + i] = ActivationFunctionWithMinMax( - array_data[array_offset + i] + bias_data[i], clamp_min, clamp_max); + array_data[array_offset + i] + bias_data[i], clamp_min, clamp_max); } } #endif diff --git a/compute/cker/include/cker/operation/Comparison.h b/compute/cker/include/cker/operation/Comparison.h index 47eb603..ac6af84 100644 --- a/compute/cker/include/cker/operation/Comparison.h +++ b/compute/cker/include/cker/operation/Comparison.h @@ -42,7 +42,7 @@ inline void ComparisonImpl(const Shape &input1_shape, const T *input1_data, const Shape &output_shape, bool *output_data) { const int64_t flatsize = // number of data.... - MatchingFlatSize(input1_shape, input2_shape, output_shape); + MatchingFlatSize(input1_shape, input2_shape, output_shape); for (int64_t i = 0; i < flatsize; ++i) { output_data[i] = F(input1_data[i], input2_data[i]); @@ -79,9 +79,9 @@ inline void ComparisonWithScaling(ComparisonParams ¶ms, const Shape &input1_ const int32_t shifted_input1_val = input1_val * (1 << left_shift); const int32_t shifted_input2_val = input2_val * (1 << left_shift); const int32_t scaled_input1_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, input1_multiplier, input1_shift); + shifted_input1_val, input1_multiplier, input1_shift); const int32_t scaled_input2_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, input2_multiplier, input2_shift); + shifted_input2_val, input2_multiplier, input2_shift); output_data[i] = F(scaled_input1_val, scaled_input2_val); } } @@ -111,8 +111,8 @@ BroadcastComparison4DSlowImpl(const Shape &unextended_input1_shape, const T *inp for (int c = 0; c < output_shape.Dims(3); ++c) { output_data[Offset(output_shape, b, y, x, c)] = - F(input1_data[SubscriptToIndex(desc1, b, y, x, c)], - input2_data[SubscriptToIndex(desc2, b, y, x, c)]); + F(input1_data[SubscriptToIndex(desc1, b, y, x, c)], + input2_data[SubscriptToIndex(desc2, b, y, x, c)]); } } } @@ -159,15 +159,15 @@ inline void BroadcastComparison4DSlowWithScaling(ComparisonParams ¶ms, for (int c = 0; c < output_shape.Dims(3); ++c) { const int32_t input1_val = - input1_offset + input1_data[SubscriptToIndex(desc1, b, y, x, c)]; + input1_offset + input1_data[SubscriptToIndex(desc1, b, y, x, c)]; const int32_t input2_val = - input2_offset + input2_data[SubscriptToIndex(desc2, b, y, x, c)]; + input2_offset + input2_data[SubscriptToIndex(desc2, b, y, x, c)]; const int32_t shifted_input1_val = input1_val * (1 << left_shift); const int32_t shifted_input2_val = input2_val * (1 << left_shift); const int32_t scaled_input1_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, input1_multiplier, input1_shift); + shifted_input1_val, input1_multiplier, input1_shift); const int32_t scaled_input2_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, input2_multiplier, input2_shift); + shifted_input2_val, input2_multiplier, input2_shift); output_data[Offset(output_shape, b, y, x, c)] = F(scaled_input1_val, scaled_input2_val); } } @@ -175,55 +175,53 @@ inline void BroadcastComparison4DSlowWithScaling(ComparisonParams ¶ms, } } -#define TFLITE_COMPARISON_OP(name) \ - template \ - inline void name(const Shape &input1_shape, const T *input1_data, const Shape &input2_shape, \ - const T *input2_data, const Shape &output_shape, bool *output_data) \ - { \ - Comparison(input1_shape, input1_data, input2_shape, input2_data, output_shape, \ - output_data); \ - } \ - template \ - inline void name##NoScaling(const Shape &input1_shape, const T *input1_data, \ - const Shape &input2_shape, const T *input2_data, \ - const Shape &output_shape, bool *output_data) \ - { \ - ComparisonImpl(input1_shape, input1_data, input2_shape, input2_data, \ - output_shape, output_data); \ - } \ - template \ - inline void name##WithScaling(ComparisonParams ¶ms, const Shape &input1_shape, \ - const T *input1_data, const Shape &input2_shape, \ - const T *input2_data, const Shape &output_shape, \ - bool *output_data) \ - { \ - ComparisonWithScaling(params, input1_shape, input1_data, input2_shape, \ - input2_data, output_shape, output_data); \ - } \ - template \ - inline void Broadcast4DSlow##name##NoScaling(const Shape &input1_shape, const T *input1_data, \ - const Shape &input2_shape, const T *input2_data, \ - const Shape &output_shape, bool *output_data) \ - { \ - BroadcastComparison4DSlowImpl(input1_shape, input1_data, input2_shape, \ - input2_data, output_shape, output_data); \ - } \ - template \ - inline void Broadcast4DSlow##name(const Shape &input1_shape, const T *input1_data, \ - const Shape &input2_shape, const T *input2_data, \ - const Shape &output_shape, bool *output_data) \ - { \ - BroadcastComparison4DSlow(input1_shape, input1_data, input2_shape, input2_data, \ - output_shape, output_data); \ - } \ - template \ - inline void Broadcast4DSlow##name##WithScaling(ComparisonParams ¶ms, \ - const Shape &input1_shape, const T *input1_data, \ - const Shape &input2_shape, const T *input2_data, \ - const Shape &output_shape, bool *output_data) \ - { \ - BroadcastComparison4DSlowWithScaling( \ - params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data); \ +#define TFLITE_COMPARISON_OP(name) \ + template \ + inline void name(const Shape &input1_shape, const T *input1_data, const Shape &input2_shape, \ + const T *input2_data, const Shape &output_shape, bool *output_data) \ + { \ + Comparison(input1_shape, input1_data, input2_shape, input2_data, output_shape, \ + output_data); \ + } \ + template \ + inline void name##NoScaling(const Shape &input1_shape, const T *input1_data, \ + const Shape &input2_shape, const T *input2_data, \ + const Shape &output_shape, bool *output_data) \ + { \ + ComparisonImpl(input1_shape, input1_data, input2_shape, input2_data, \ + output_shape, output_data); \ + } \ + template \ + inline void name##WithScaling( \ + ComparisonParams ¶ms, const Shape &input1_shape, const T *input1_data, \ + const Shape &input2_shape, const T *input2_data, const Shape &output_shape, bool *output_data) \ + { \ + ComparisonWithScaling(params, input1_shape, input1_data, input2_shape, \ + input2_data, output_shape, output_data); \ + } \ + template \ + inline void Broadcast4DSlow##name##NoScaling(const Shape &input1_shape, const T *input1_data, \ + const Shape &input2_shape, const T *input2_data, \ + const Shape &output_shape, bool *output_data) \ + { \ + BroadcastComparison4DSlowImpl(input1_shape, input1_data, input2_shape, \ + input2_data, output_shape, output_data); \ + } \ + template \ + inline void Broadcast4DSlow##name(const Shape &input1_shape, const T *input1_data, \ + const Shape &input2_shape, const T *input2_data, \ + const Shape &output_shape, bool *output_data) \ + { \ + BroadcastComparison4DSlow(input1_shape, input1_data, input2_shape, input2_data, \ + output_shape, output_data); \ + } \ + template \ + inline void Broadcast4DSlow##name##WithScaling( \ + ComparisonParams ¶ms, const Shape &input1_shape, const T *input1_data, \ + const Shape &input2_shape, const T *input2_data, const Shape &output_shape, bool *output_data) \ + { \ + BroadcastComparison4DSlowWithScaling( \ + params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data); \ } TFLITE_COMPARISON_OP(Equal); diff --git a/compute/cker/include/cker/operation/Concatenation.h b/compute/cker/include/cker/operation/Concatenation.h index 394123e..9aaca00 100644 --- a/compute/cker/include/cker/operation/Concatenation.h +++ b/compute/cker/include/cker/operation/Concatenation.h @@ -142,7 +142,7 @@ inline void ConcatenationWithScaling(const ConcatenationParams ¶ms, for (int j = 0; j < copy_size; ++j) { const int32_t value = - static_cast(std::round(input_ptr[j] * scale + bias)) + output_zeropoint; + static_cast(std::round(input_ptr[j] * scale + bias)) + output_zeropoint; output_ptr[j] = static_cast(std::max(std::min(255, value), 0)); } } diff --git a/compute/cker/include/cker/operation/DepthToSpace.h b/compute/cker/include/cker/operation/DepthToSpace.h new file mode 100644 index 0000000..e57fef0 --- /dev/null +++ b/compute/cker/include/cker/operation/DepthToSpace.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_DEPTH_TO_SPACE_H__ +#define __NNFW_CKER_DEPTH_TO_SPACE_H__ + +#include "cker/Shape.h" +#include "cker/Types.h" + +namespace nnfw +{ +namespace cker +{ + +template +inline void DepthToSpace(const Shape &unextended_input_shape, const T *input_data, + const Shape &unextended_output_shape, T *output_data, int32_t block_size) +{ + assert(unextended_input_shape.DimensionsCount() <= 4); + assert(unextended_output_shape.DimensionsCount() <= 4); + const Shape input_shape = Shape::ExtendedShape(4, unextended_input_shape); + const Shape output_shape = Shape::ExtendedShape(4, unextended_output_shape); + + const int input_depth = input_shape.Dims(3); + const int input_width = input_shape.Dims(2); + const int input_height = input_shape.Dims(1); + + const int output_depth = output_shape.Dims(3); + const int batch_size = output_shape.Dims(0); + + // Number of continuous values that we can copy in one interation. + const int stride = block_size * output_depth; + + for (int batch = 0; batch < batch_size; ++batch) + { + for (int in_h = 0; in_h < input_height; ++in_h) + { + const T *input_ptr = input_data + Offset(input_shape, batch, in_h, 0, 0); + for (int offset_h = 0; offset_h < block_size; ++offset_h) + { + const T *src = input_ptr; + for (int in_w = 0; in_w < input_width; ++in_w) + { + memcpy(output_data, src, stride * sizeof(T)); + output_data += stride; + src += input_depth; + } + input_ptr += stride; + } + } + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_SPACE_TO_DEPTH_H__ diff --git a/compute/cker/include/cker/operation/DepthwiseConv.h b/compute/cker/include/cker/operation/DepthwiseConv.h index 814a9e0..436ddd8 100644 --- a/compute/cker/include/cker/operation/DepthwiseConv.h +++ b/compute/cker/include/cker/operation/DepthwiseConv.h @@ -22,143 +22,159 @@ #include "cker/Types.h" #include "cker/Utils.h" #include "cker/neon/neon_check.h" +#include "cker/operation/optimized/DepthwiseConvFloat.h" #include "cker/operation/optimized/DepthwiseConvUint8.h" +#include "cker/CpuBackendThreadpool.h" namespace nnfw { namespace cker { -inline void DepthwiseConv(const DepthwiseConvParams ¶ms, const Shape &input_shape, - const uint8_t *input_data, const Shape &filter_shape, - const uint8_t *filter_data, const Shape &bias_shape, - const int32_t *bias_data, const Shape &output_shape, uint8_t *output_data) +// TODO(luwa): add multithread to per-channel depthwise_conv +// DepthwiseConv can run with multi threads on the dim specified by thread_dim. +// Each thread processes output elements on dim, thread_dim, in the range of +// [thread_start, thread_end). +// For example, assume thread_start = 2, thread_end = 6, and thread_dim = 1, it +// means that it will calculate DepthwiseConv for output_data[:, 2:5, :, :]. +template struct DepthwiseConvWorkerTask : cpu_backend_threadpool::Task { - const int depth_multiplier = params.depth_multiplier; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - assert(dilation_width_factor >= 1); - assert(dilation_height_factor >= 1); - UNUSED_RELEASE(dilation_width_factor); - UNUSED_RELEASE(dilation_height_factor); - assert(input_shape.DimensionsCount() == 4); - assert(filter_shape.DimensionsCount() == 4); - assert(output_shape.DimensionsCount() == 4); - assert(output_activation_min <= output_activation_max); - UNUSED_RELEASE(output_activation_min); - UNUSED_RELEASE(output_activation_max); - const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); - const int input_depth = input_shape.Dims(3); - assert(output_depth == input_depth * depth_multiplier); - assert(bias_shape.FlatSize() == output_depth); - UNUSED_RELEASE(input_depth); - UNUSED_RELEASE(output_depth); - UNUSED_RELEASE(depth_multiplier); - -// Enable for arm64 except for the Nvidia Linux 4 Tegra (L4T) running on -// Jetson TX-2. This compiler does not support the offsetof() macro. -#if defined(__aarch64__) -// TODO Use below codes - -// const int stride_width = params.stride_width; -// const int stride_height = params.stride_height; -// const int pad_width = params.padding_values.width; -// const int pad_height = params.padding_values.height; -// const int output_shift = params.output_shift; -// -// // Call kernel optimized for depthwise convolutions using 3x3 filters if -// // parameters are supported. -// if (Fast3x3FilterKernelSupported( -// input_shape, filter_shape, stride_width, stride_height, -// dilation_width_factor, dilation_height_factor, pad_width, pad_height, -// depth_multiplier, output_shape, output_shift)) { -// DepthwiseConv3x3Filter(params, input_shape, input_data, filter_shape, -// filter_data, bias_shape, bias_data, output_shape, -// output_data); -// return; -// } -#endif - - optimized::DepthwiseConvGeneral(params, input_shape, input_data, filter_shape, filter_data, - bias_shape, bias_data, output_shape, output_data); + DepthwiseConvWorkerTask(const DepthwiseConvParams ¶ms, const Shape &input_shape, + const T *input_data, const Shape &filter_shape, const T *filter_data, + const Shape &bias_shape, const TS *bias_data, const Shape &output_shape, + T *output_data, int thread_start, int thread_end, int thread_dim) + : params_(params), input_shape_(input_shape), input_data_(input_data), + filter_shape_(filter_shape), filter_data_(filter_data), bias_shape_(bias_shape), + bias_data_(bias_data), output_shape_(output_shape), output_data_(output_data), + thread_start_(thread_start), thread_end_(thread_end), thread_dim_(thread_dim) + { + } + + void Run() override + { + optimized::DepthwiseConvImpl(params_, input_shape_, input_data_, filter_shape_, filter_data_, + bias_shape_, bias_data_, output_shape_, output_data_, + thread_start_, thread_end_, thread_dim_); + } + +private: + const DepthwiseConvParams ¶ms_; + const Shape &input_shape_; + const T *input_data_; + const Shape &filter_shape_; + const T *filter_data_; + const Shape &bias_shape_; + const TS *bias_data_; + const Shape &output_shape_; + T *output_data_; + // const CpuFlags& cpu_flags_; + int thread_start_; + int thread_end_; + int thread_dim_; +}; + +inline int HowManyConvThreads(const Shape &output_shape, const Shape &filter_shape) +{ + // How many scalar multiplications are needed to make it worth using one + // more thread + static constexpr int kMinMulPerThread = 1 << 13; // 8k + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int num_muls = output_shape.FlatSize() * filter_height * filter_width; + // Try to avoid real runtime divisions if possible by dividing by a + // compile-time constant. + int thread_count = std::max(1, num_muls / kMinMulPerThread); + return thread_count; +} + +inline bool MultithreadAlongBatches(int thread_count, int batches) +{ + assert(thread_count >= 2); + // If there are fewer batch entries than the number of threads we want to use, + // then better do intra-batch-entry multithreading. + if (batches < thread_count) + { + return false; + } + // If there are at least 2 batch entries to be handed to each thread, then + // it's safe to proceed with batch-wise multithreading: each thread will have + // approximately equal number of batch entries to handle, so the load + // balancing will be reasonable, and the amount to which the load is not + // perfectly balanced will be offset by the inherent advantages of + // batch-wise multithreading (each thread is more efficient thanks to working + // on larger buffers with less boundary-handling overhead). + if (batches >= 2 * thread_count) + { + return true; + } + // In the limit case were there are at least 1 but not much more than 1 + // batch entries per thread, it may be a good idea to do per-batch + // multithreading if the number of batch entries is a multiple of the number + // of threads, so that each thread will have the same number of batch entries + // to process. + return ((batches % thread_count) == 0); } +template inline void DepthwiseConv(const DepthwiseConvParams ¶ms, const Shape &input_shape, - const float *input_data, const Shape &filter_shape, - const float *filter_data, const Shape &bias_shape, const float *bias_data, - const Shape &output_shape, float *output_data) + const T *input_data, const Shape &filter_shape, const T *filter_data, + const Shape &bias_shape, const TS *bias_data, const Shape &output_shape, + T *output_data, ruy::Context *ruy_context) { - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const int depth_multiplier = params.depth_multiplier; - const float output_activation_min = params.float_activation_min; - const float output_activation_max = params.float_activation_max; assert(input_shape.DimensionsCount() == 4); assert(filter_shape.DimensionsCount() == 4); assert(output_shape.DimensionsCount() == 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int input_depth = input_shape.Dims(3); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); + int thread_count = HowManyConvThreads(output_shape, filter_shape); + + // NOTE Borrow RuyContext to get max_num_threads setting + // TODO Define and use max_num_threads for CPU backend + const auto max_threads = (ruy_context == nullptr) ? 1 : ruy_context->max_num_threads(); + + thread_count = std::max(1, std::min(thread_count, max_threads)); + // Cap the number of threads to 2 for float path to avoid regression in + // performance (b/132294857). + if (std::is_floating_point::value) + { + thread_count = std::min(thread_count, 2); + } + + const int output_batches = output_shape.Dims(0); const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - assert(output_depth == input_depth * depth_multiplier); - assert(bias_shape.FlatSize() == output_depth); - UNUSED_RELEASE(output_depth); - UNUSED_RELEASE(bias_shape); - for (int b = 0; b < batches; ++b) + if (thread_count == 1) + { + optimized::DepthwiseConvImpl(params, input_shape, input_data, filter_shape, filter_data, + bias_shape, bias_data, output_shape, output_data, 0, output_height, + 1); + return; + } + + int thread_dim, thread_dim_size; + if (MultithreadAlongBatches(thread_count, output_batches)) + { + thread_dim = 0; + thread_dim_size = output_batches; + } + else + { + thread_dim = 1; + thread_dim_size = output_height; + } + + std::vector> tasks; + // TODO(b/131746020) don't create new heap allocations every time. + // At least we make it a single heap allocation by using reserve(). + tasks.reserve(thread_count); + int thread_start = 0; + for (int i = 0; i < thread_count; ++i) { - for (int out_y = 0; out_y < output_height; ++out_y) - { - for (int out_x = 0; out_x < output_width; ++out_x) - { - for (int ic = 0; ic < input_depth; ++ic) - { - for (int m = 0; m < depth_multiplier; m++) - { - const int oc = m + ic * depth_multiplier; - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - float total = 0.f; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) - { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) - { - const int in_x = in_x_origin + dilation_width_factor * filter_x; - const int in_y = in_y_origin + dilation_height_factor * filter_y; - // If the location is outside the bounds of the input image, - // use zero as a default value. - if ((in_x >= 0) && (in_x < input_width) && (in_y >= 0) && (in_y < input_height)) - { - float input_value = input_data[Offset(input_shape, b, in_y, in_x, ic)]; - float filter_value = filter_data[Offset(filter_shape, 0, filter_y, filter_x, oc)]; - total += (input_value * filter_value); - } - } - } - float bias_value = 0.0f; - if (bias_data) - { - bias_value = bias_data[oc]; - } - output_data[Offset(output_shape, b, out_y, out_x, oc)] = ActivationFunctionWithMinMax( - total + bias_value, output_activation_min, output_activation_max); - } - } - } - } + int thread_end = thread_start + (thread_dim_size - thread_start) / (thread_count - i); + tasks.emplace_back(params, input_shape, input_data, filter_shape, filter_data, bias_shape, + bias_data, output_shape, output_data, thread_start, thread_end, thread_dim); + thread_start = thread_end; } + cpu_backend_threadpool::Execute(tasks.size(), tasks.data(), ruy_context); } } // namespace cker diff --git a/compute/cker/include/cker/operation/ELU.h b/compute/cker/include/cker/operation/ELU.h new file mode 100644 index 0000000..6bdd7c6 --- /dev/null +++ b/compute/cker/include/cker/operation/ELU.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_ELU_H__ +#define __NNFW_CKER_ELU_H__ + +#include "cker/Shape.h" + +#include + +namespace nnfw +{ +namespace cker +{ + +inline void ELU(const Shape &input_shape, const float *input_data, const Shape &output_shape, + float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < flat_size; ++i) + { + const float val = input_data[i]; + output_data[i] = val < 0.0 ? std::exp(val) - 1 : val; + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_ELU_H__ diff --git a/compute/cker/include/cker/operation/Einsum.h b/compute/cker/include/cker/operation/Einsum.h index 3d1837f..13fccfd 100644 --- a/compute/cker/include/cker/operation/Einsum.h +++ b/compute/cker/include/cker/operation/Einsum.h @@ -394,8 +394,8 @@ private: for (int label = 0; label < num_labels; ++label) { bool removed = (_output_label_counts[label] == 0); - bool unique = num_inputs == 1 || _input_label_counts[0][label] == 0 || - _input_label_counts[1][label] == 0; + bool unique = + num_inputs == 1 || _input_label_counts[0][label] == 0 || _input_label_counts[1][label] == 0; _label_types[label] = getDimensionType(removed, unique); } } @@ -483,8 +483,8 @@ private: if (inputs[i].shape.DimensionsCount() + 1 < (int32_t)labels->size()) { throw std::runtime_error{"Expected input " + std::to_string(i) + " to have rank at least " + - std::to_string(labels->size() - 1) + " but got: " + - std::to_string(inputs[i].shape.DimensionsCount())}; + std::to_string(labels->size() - 1) + + " but got: " + std::to_string(inputs[i].shape.DimensionsCount())}; } int ellipsis_axis = -1; const int num_bcast_dims = inputs[i].shape.DimensionsCount() - labels->size() + 1; @@ -511,7 +511,7 @@ private: } std::vector::iterator it_input = - std::find(_input_has_ellipsis.begin(), _input_has_ellipsis.end(), true); + std::find(_input_has_ellipsis.begin(), _input_has_ellipsis.end(), true); if (it_input == _input_has_ellipsis.end() && !_output_has_ellipsis) { return; @@ -645,11 +645,11 @@ private: // Reduce along the last axis (i.e axis 1) of the rank-2 Tensor. const int32_t output_size = - reshape[kBroadcasting] * reshape[kBatch] * reshape[kFree] * reshape[kContract]; + reshape[kBroadcasting] * reshape[kBatch] * reshape[kFree] * reshape[kContract]; functor::ReduceFunctor::Reduce( - device, output->shaped({output_size}), - input_deduped.shaped({output_size, reshape[kReduce]}), Eigen::array({1}), - Reducer()); + device, output->shaped({output_size}), + input_deduped.shaped({output_size, reshape[kReduce]}), Eigen::array({1}), + Reducer()); } bool shouldSwapFreeAndContract(const Labels &labels, @@ -779,7 +779,7 @@ private: { const int32_t count = label_counts[label]; const int current_axis = - should_inflate ? strided_shape_dims.size() : inflated_shape_dims.size(); + should_inflate ? strided_shape_dims.size() : inflated_shape_dims.size(); const int32_t dim = input.shape.Dims(current_axis); strided_shape_dims.push_back(dim); inflated_shape_dims.insert(inflated_shape_dims.end(), count, dim); @@ -879,7 +879,7 @@ private: for (size_t i = 0; i < inputs.size(); ++i) { const int32_t free_axis = - inputs[i].shape.DimensionsCount() - (swap_free_and_contract[i] ? 1 : 2); + inputs[i].shape.DimensionsCount() - (swap_free_and_contract[i] ? 1 : 2); output_shape.SetDim(i + old_output_shape.DimensionsCount(), inputs[i].shape.Dims(free_axis)); } bool adj_x = swap_free_and_contract[0]; diff --git a/compute/cker/include/cker/operation/Elementwise.h b/compute/cker/include/cker/operation/Elementwise.h index 9d080d8..0e980f1 100644 --- a/compute/cker/include/cker/operation/Elementwise.h +++ b/compute/cker/include/cker/operation/Elementwise.h @@ -98,6 +98,28 @@ inline void Floor(const Shape &input_shape, const float *input_data, const Shape } } +inline void Sqrt(const Shape &input_shape, const float *input_data, const Shape &output_shape, + float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; i++) + { + output_data[i] = std::sqrt(input_data[i]); + } +} + +inline void Square(const Shape &input_shape, const float *input_data, const Shape &output_shape, + float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; i++) + { + output_data[i] = input_data[i] * input_data[i]; + } +} + } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/operation/Fill.h b/compute/cker/include/cker/operation/Fill.h index 14daf98..d657acc 100644 --- a/compute/cker/include/cker/operation/Fill.h +++ b/compute/cker/include/cker/operation/Fill.h @@ -24,27 +24,12 @@ namespace nnfw { namespace cker { -template -inline void Fill(const Shape &input_shape, int *input_data, const T value_data, - const Shape &output_shape, T output_data) +template inline void Fill(const T value_data, const Shape &output_shape, T output_data) { - int input_size = input_shape.FlatSize(); - int output_size = 1; - for (int i = 0; i < input_size; i++) + int output_size = output_shape.FlatSize(); + for (int i = 0; i < output_size; i++) { - output_size *= input_data[i]; - } - - if (output_size == output_shape.FlatSize()) - { - for (int i = 0; i < output_size; i++) - { - output_data[i] = *value_data; - } - } - else - { - throw std::runtime_error("Cker Fill.h: output's size is not matched inferred size of output"); + output_data[i] = *value_data; } } diff --git a/compute/cker/include/cker/operation/FullyConnected.h b/compute/cker/include/cker/operation/FullyConnected.h index 9585324..b7d27e8 100644 --- a/compute/cker/include/cker/operation/FullyConnected.h +++ b/compute/cker/include/cker/operation/FullyConnected.h @@ -117,7 +117,7 @@ inline void FullyConnected(const FullyConnectedParams ¶ms, const Shape &inpu const int filter_dim_count = filter_shape.DimensionsCount(); const int batches = FlatSizeSkipDim(output_shape, output_dim_count - 1); const int output_depth = - MatchingDim(filter_shape, filter_dim_count - 2, output_shape, output_dim_count - 1); + MatchingDim(filter_shape, filter_dim_count - 2, output_shape, output_dim_count - 1); const int accum_depth = filter_shape.Dims(filter_dim_count - 1); for (int b = 0; b < batches; ++b) { @@ -229,7 +229,7 @@ inline void FullyConnectedSparseWeightRandom(const FullyConnectedParams ¶ms, const int weights_dims_count = weights_shape.DimensionsCount(); const int batches = FlatSizeSkipDim(output_shape, output_dims_count - 1); const int output_depth = - MatchingDim(weights_shape, weights_dims_count - 2, output_shape, output_dims_count - 1); + MatchingDim(weights_shape, weights_dims_count - 2, output_shape, output_dims_count - 1); const int accum_depth = weights_shape.Dims(weights_dims_count - 1); UNUSED_RELEASE(bias_shape); @@ -249,7 +249,7 @@ inline void FullyConnectedSparseWeightRandom(const FullyConnectedParams ¶ms, { int idx_1 = w1_indices[pw1]; output_data[b * output_depth + idx_0] += - weights_data[pw1] * input_data[b * accum_depth + idx_1]; + weights_data[pw1] * input_data[b * accum_depth + idx_1]; } } } diff --git a/compute/cker/include/cker/operation/FullyConnectedSparse16x1.h b/compute/cker/include/cker/operation/FullyConnectedSparse16x1.h index 28ae7a3..df397f7 100644 --- a/compute/cker/include/cker/operation/FullyConnectedSparse16x1.h +++ b/compute/cker/include/cker/operation/FullyConnectedSparse16x1.h @@ -70,7 +70,7 @@ inline void FullyConnectedSparseWeight16x1(const FullyConnectedParams ¶ms, const int weights_dims_count = weights_shape.DimensionsCount(); const int batches = FlatSizeSkipDim(output_shape, output_dims_count - 1); const int output_depth = - MatchingDim(weights_shape, weights_dims_count - 2, output_shape, output_dims_count - 1); + MatchingDim(weights_shape, weights_dims_count - 2, output_shape, output_dims_count - 1); const int accum_depth = weights_shape.Dims(weights_dims_count - 1); UNUSED_RELEASE(bias_shape); diff --git a/compute/cker/include/cker/operation/FusedBatchNorm.h b/compute/cker/include/cker/operation/FusedBatchNorm.h index d17a579..8a97d84 100644 --- a/compute/cker/include/cker/operation/FusedBatchNorm.h +++ b/compute/cker/include/cker/operation/FusedBatchNorm.h @@ -105,7 +105,7 @@ public: float rest_size_inv = static_cast(1.0f / static_cast(rest_size)); // This adjustment is for Bessel's correction float rest_size_adjust = - static_cast(rest_size) / static_cast(rest_size_minus_one); + static_cast(rest_size) / static_cast(rest_size_minus_one); Eigen::Tensor batch_mean(depth); Eigen::Tensor batch_variance(depth); @@ -117,12 +117,12 @@ public: batch_variance.device(d) = x_centered.square().sum(reduce_dims) * rest_size_inv; auto scaling_factor = ((batch_variance + param.epsilon).rsqrt() * scale) - .eval() - .reshape(one_by_depth) - .broadcast(bcast_spec); + .eval() + .reshape(one_by_depth) + .broadcast(bcast_spec); auto x_scaled = x_centered * scaling_factor; auto x_shifted = - (x_scaled + offset.reshape(one_by_depth).broadcast(bcast_spec)).template cast(); + (x_scaled + offset.reshape(one_by_depth).broadcast(bcast_spec)).template cast(); UNUSED_RELEASE(rest_size_adjust); diff --git a/compute/cker/include/cker/operation/Helper/BCast.h b/compute/cker/include/cker/operation/Helper/BCast.h index a0abf29..211db98 100644 --- a/compute/cker/include/cker/operation/Helper/BCast.h +++ b/compute/cker/include/cker/operation/Helper/BCast.h @@ -22,7 +22,7 @@ * ToDo : This file will be moved into upper folder when integrate with other * custom operations. * And It should merged with EinsumHelper's BCast. -**/ + **/ #include "cker/Shape.h" #include "cker/eigen/EigenSupport.h" @@ -393,7 +393,7 @@ public: BCast(const Vec &x, const Vec &y, const bool fewer_dims_optimization = true, const bool return_flattened_batch_indices = false) - : BCastList<2>({x, y}, fewer_dims_optimization, return_flattened_batch_indices) + : BCastList<2>({x, y}, fewer_dims_optimization, return_flattened_batch_indices) { } diff --git a/compute/cker/include/cker/operation/Helper/RandomDistributions.h b/compute/cker/include/cker/operation/Helper/RandomDistributions.h index baeafd7..cbebff1 100644 --- a/compute/cker/include/cker/operation/Helper/RandomDistributions.h +++ b/compute/cker/include/cker/operation/Helper/RandomDistributions.h @@ -168,7 +168,7 @@ public: // Must have lo < hi UniformDistribution(int32_t lo, int32_t hi) - : lo_(lo), range_(static_cast(hi) - static_cast(lo)) + : lo_(lo), range_(static_cast(hi) - static_cast(lo)) { } @@ -207,7 +207,7 @@ public: // Must have lo < hi UniformDistribution(int64_t lo, int64_t hi) - : lo_(lo), range_(static_cast(hi) - static_cast(lo)) + : lo_(lo), range_(static_cast(hi) - static_cast(lo)) { } @@ -291,22 +291,22 @@ public: template class UniformFullIntDistribution - : public UniformFullIntDistribution32 + : public UniformFullIntDistribution32 { }; template class UniformFullIntDistribution - : public UniformFullIntDistribution32 + : public UniformFullIntDistribution32 { }; template class UniformFullIntDistribution - : public UniformFullIntDistribution64 + : public UniformFullIntDistribution64 { }; template class UniformFullIntDistribution - : public UniformFullIntDistribution64 + : public UniformFullIntDistribution64 { }; @@ -324,7 +324,7 @@ public: PHILOX_DEVICE_INLINE explicit SingleSampleAdapter(Generator *gen) - : generator_(gen), used_result_index_(Generator::kResultElementCount) + : generator_(gen), used_result_index_(Generator::kResultElementCount) { } @@ -615,8 +615,8 @@ class TruncatedNormalDistribution public: // The number of elements that will be returned. static constexpr int kResultElementCount = (SingleSampleGenerator::kNativeElementCount > 1) - ? SingleSampleGenerator::kNativeElementCount / 2 - : 1; + ? SingleSampleGenerator::kNativeElementCount / 2 + : 1; // Cost of generation of a single element (in cycles). static constexpr int kElementCost = 90; // Indicate that this distribution may take variable number of samples diff --git a/compute/cker/include/cker/operation/Helper/RandomOpCpu.h b/compute/cker/include/cker/operation/Helper/RandomOpCpu.h index 85d2677..6e9ffbd 100644 --- a/compute/cker/include/cker/operation/Helper/RandomOpCpu.h +++ b/compute/cker/include/cker/operation/Helper/RandomOpCpu.h @@ -109,7 +109,7 @@ template struct FillPhiloxRandomTask { const int kGroupSize = Distribution::kResultElementCount; static const int kGeneratorSkipPerOutputGroup = - kGroupSize * kReservedSamplesPerOutput / PhiloxRandom::kResultElementCount; + kGroupSize * kReservedSamplesPerOutput / PhiloxRandom::kResultElementCount; int64_t offset = 0; diff --git a/compute/cker/include/cker/operation/Helper/Tensor.h b/compute/cker/include/cker/operation/Helper/Tensor.h index e6ac008..ec29a15 100644 --- a/compute/cker/include/cker/operation/Helper/Tensor.h +++ b/compute/cker/include/cker/operation/Helper/Tensor.h @@ -29,58 +29,58 @@ template str { // Rank- tensor of scalar type T. typedef Eigen::TensorMap, Eigen::Aligned> - Tensor; + Tensor; typedef Eigen::TensorMap, Eigen::Aligned> - ConstTensor; + ConstTensor; // Unaligned Rank- tensor of scalar type T. typedef Eigen::TensorMap> UnalignedTensor; typedef Eigen::TensorMap> - UnalignedConstTensor; + UnalignedConstTensor; typedef Eigen::TensorMap, Eigen::Aligned> - Tensor32Bit; + Tensor32Bit; // Scalar tensor (implemented as a rank-0 tensor) of scalar type T. typedef Eigen::TensorMap, Eigen::RowMajor, IndexType>, Eigen::Aligned> - Scalar; + Scalar; typedef Eigen::TensorMap< - Eigen::TensorFixedSize, Eigen::RowMajor, IndexType>, Eigen::Aligned> - ConstScalar; + Eigen::TensorFixedSize, Eigen::RowMajor, IndexType>, Eigen::Aligned> + ConstScalar; // Unaligned Scalar tensor of scalar type T. typedef Eigen::TensorMap, Eigen::RowMajor, IndexType>> - UnalignedScalar; + UnalignedScalar; typedef Eigen::TensorMap< - Eigen::TensorFixedSize, Eigen::RowMajor, IndexType>> - UnalignedConstScalar; + Eigen::TensorFixedSize, Eigen::RowMajor, IndexType>> + UnalignedConstScalar; // Rank-1 tensor (vector) of scalar type T. typedef Eigen::TensorMap, Eigen::Aligned> Flat; typedef Eigen::TensorMap, Eigen::Aligned> - ConstFlat; + ConstFlat; typedef Eigen::TensorMap, Eigen::Aligned> Vec; typedef Eigen::TensorMap, Eigen::Aligned> - ConstVec; + ConstVec; // Unaligned Rank-1 tensor (vector) of scalar type T. typedef Eigen::TensorMap> UnalignedFlat; typedef Eigen::TensorMap> - UnalignedConstFlat; + UnalignedConstFlat; typedef Eigen::TensorMap> UnalignedVec; typedef Eigen::TensorMap> UnalignedConstVec; // Rank-2 tensor (matrix) of scalar type T. typedef Eigen::TensorMap, Eigen::Aligned> Matrix; typedef Eigen::TensorMap, Eigen::Aligned> - ConstMatrix; + ConstMatrix; // Unaligned Rank-2 tensor (matrix) of scalar type T. typedef Eigen::TensorMap> UnalignedMatrix; typedef Eigen::TensorMap> - UnalignedConstMatrix; + UnalignedConstMatrix; }; typedef typename TTypes::Tensor32Bit::Index Index32; diff --git a/compute/cker/include/cker/operation/InstanceNorm.h b/compute/cker/include/cker/operation/InstanceNorm.h index 6445e8a..8fa8b03 100644 --- a/compute/cker/include/cker/operation/InstanceNorm.h +++ b/compute/cker/include/cker/operation/InstanceNorm.h @@ -78,8 +78,8 @@ inline void InstanceNorm(const InstanceNormParams ¶ms, const Shape &input_sh double input_value = input_data[Offset(output_shape, batch, height, width, channel)]; double output_value = input_value * a + b; output_data[Offset(output_shape, batch, height, width, channel)] = - ActivationFunctionWithMinMax((float)output_value, output_activation_min, - output_activation_max); + ActivationFunctionWithMinMax((float)output_value, output_activation_min, + output_activation_max); } } } diff --git a/compute/cker/include/cker/operation/L2Normalize.h b/compute/cker/include/cker/operation/L2Normalize.h index a0075c3..c1fca91 100644 --- a/compute/cker/include/cker/operation/L2Normalize.h +++ b/compute/cker/include/cker/operation/L2Normalize.h @@ -77,7 +77,7 @@ void L2NormalizeQuant8(L2NormParams ¶ms, const Shape &input_shape, const uin { int32_t diff = *input_data - input_zero_point; int32_t rescaled_diff = MultiplyByQuantizedMultiplierSmallerThanOneExp( - 128 * diff, inv_l2norm_multiplier, inv_l2norm_shift); + 128 * diff, inv_l2norm_multiplier, inv_l2norm_shift); int32_t unclamped_output_val = 128 + rescaled_diff; int32_t output_val = std::min(static_cast(255), std::max(static_cast(0), unclamped_output_val)); diff --git a/compute/cker/include/cker/operation/LSTM.h b/compute/cker/include/cker/operation/LSTM.h index 27beaae..a8f1f8c 100644 --- a/compute/cker/include/cker/operation/LSTM.h +++ b/compute/cker/include/cker/operation/LSTM.h @@ -283,23 +283,23 @@ void CalculateLstmOutputFloat(int n_batch, int n_cell, int n_output, const float // contiguous, and we manually loop over the batched outputs. // LINT.IfChange inline void LstmStepFloat( - const float *input_ptr, const float *input_to_input_weights_ptr, - const float *input_to_forget_weights_ptr, const float *input_to_cell_weights_ptr, - const float *input_to_output_weights_ptr, const float *aux_input_ptr, - const float *aux_input_to_input_weights_ptr, const float *aux_input_to_forget_weights_ptr, - const float *aux_input_to_cell_weights_ptr, const float *aux_input_to_output_weights_ptr, - const float *recurrent_to_input_weights_ptr, const float *recurrent_to_forget_weights_ptr, - const float *recurrent_to_cell_weights_ptr, const float *recurrent_to_output_weights_ptr, - const float *cell_to_input_weights_ptr, const float *cell_to_forget_weights_ptr, - const float *cell_to_output_weights_ptr, const float *input_layer_norm_coefficients_ptr, - const float *forget_layer_norm_coefficients_ptr, const float *cell_layer_norm_coefficients_ptr, - const float *output_layer_norm_coefficients_ptr, const float *input_gate_bias_ptr, - const float *forget_gate_bias_ptr, const float *cell_gate_bias_ptr, - const float *output_gate_bias_ptr, const float *projection_weights_ptr, - const float *projection_bias_ptr, const LSTMParams *params, int n_batch, int n_cell, - int n_input, int n_aux_input, int n_output, int output_batch_leading_dim, - float *output_state_ptr, float *cell_state_ptr, float *scratch0, float *scratch1, - float *scratch2, float *scratch3, float *output_ptr) + const float *input_ptr, const float *input_to_input_weights_ptr, + const float *input_to_forget_weights_ptr, const float *input_to_cell_weights_ptr, + const float *input_to_output_weights_ptr, const float *aux_input_ptr, + const float *aux_input_to_input_weights_ptr, const float *aux_input_to_forget_weights_ptr, + const float *aux_input_to_cell_weights_ptr, const float *aux_input_to_output_weights_ptr, + const float *recurrent_to_input_weights_ptr, const float *recurrent_to_forget_weights_ptr, + const float *recurrent_to_cell_weights_ptr, const float *recurrent_to_output_weights_ptr, + const float *cell_to_input_weights_ptr, const float *cell_to_forget_weights_ptr, + const float *cell_to_output_weights_ptr, const float *input_layer_norm_coefficients_ptr, + const float *forget_layer_norm_coefficients_ptr, const float *cell_layer_norm_coefficients_ptr, + const float *output_layer_norm_coefficients_ptr, const float *input_gate_bias_ptr, + const float *forget_gate_bias_ptr, const float *cell_gate_bias_ptr, + const float *output_gate_bias_ptr, const float *projection_weights_ptr, + const float *projection_bias_ptr, const LSTMParams *params, int n_batch, int n_cell, int n_input, + int n_aux_input, int n_output, int output_batch_leading_dim, float *output_state_ptr, + float *cell_state_ptr, float *scratch0, float *scratch1, float *scratch2, float *scratch3, + float *output_ptr) { // Since we have already checked that weights are all there or none, we can // check the existence of only one to the get the condition. @@ -314,7 +314,7 @@ inline void LstmStepFloat( // Check if inputs are all zeros so we can skip some computations. const bool is_input_all_zeros = IsZeroVector(input_ptr, n_batch * n_input); const bool is_aux_input_all_zeros = - (aux_input_ptr == nullptr || IsZeroVector(aux_input_ptr, n_batch * n_aux_input)); + (aux_input_ptr == nullptr || IsZeroVector(aux_input_ptr, n_batch * n_aux_input)); if (!use_cifg) { // Calculate the input gate. (If not CIFG.) @@ -336,11 +336,11 @@ inline void LstmStepFloat( forget_gate_scratch, is_input_all_zeros, is_aux_input_all_zeros); // Calculate the cell update gate. CalculateLstmGateFloat( - input_ptr, input_to_cell_weights_ptr, aux_input_ptr, aux_input_to_cell_weights_ptr, - output_state_ptr, recurrent_to_cell_weights_ptr, /*cell_state=*/nullptr, - /*cell_to_gate_weights=*/nullptr, cell_layer_norm_coefficients_ptr, cell_gate_bias_ptr, - n_batch, n_input, n_aux_input, n_output, n_cell, params->activation, cell_gate_scratch, - is_input_all_zeros, is_aux_input_all_zeros); + input_ptr, input_to_cell_weights_ptr, aux_input_ptr, aux_input_to_cell_weights_ptr, + output_state_ptr, recurrent_to_cell_weights_ptr, /*cell_state=*/nullptr, + /*cell_to_gate_weights=*/nullptr, cell_layer_norm_coefficients_ptr, cell_gate_bias_ptr, n_batch, + n_input, n_aux_input, n_output, n_cell, params->activation, cell_gate_scratch, + is_input_all_zeros, is_aux_input_all_zeros); // Update the cell state. UpdateLstmCellFloat(n_batch, n_cell, cell_state_ptr, input_gate_scratch, forget_gate_scratch, cell_gate_scratch, use_cifg, params->cell_clip); diff --git a/compute/cker/include/cker/operation/LeakyReLU.h b/compute/cker/include/cker/operation/LeakyReLU.h new file mode 100644 index 0000000..e12d01b --- /dev/null +++ b/compute/cker/include/cker/operation/LeakyReLU.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_LEKAY_RELU_H__ +#define __NNFW_CKER_LEKAY_RELU_H__ + +#include "cker/Shape.h" +#include "cker/Types.h" + +#include + +namespace nnfw +{ +namespace cker +{ + +inline void LeakyReLU(const LeakyReluParams ¶ms, const Shape &input_shape, + const float *input_data, const Shape &output_shape, float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; i++) + { + const float val = input_data[i]; + // Note that alpha might be > 1 or < 0, so we don't use std::max here. + output_data[i] = val > 0 ? val : val * params.alpha; + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_RELU_H__ diff --git a/compute/cker/include/cker/operation/LogSoftMax.h b/compute/cker/include/cker/operation/LogSoftMax.h index 326a44f..eb7bdd9 100644 --- a/compute/cker/include/cker/operation/LogSoftMax.h +++ b/compute/cker/include/cker/operation/LogSoftMax.h @@ -71,7 +71,7 @@ inline void LogSoftmax(const SoftmaxParams ¶ms, const Shape &input_shape, for (int c = 0; c < depth; ++c) { output_data[(i * depth + c) * inner_size + j] = - (input_data[(i * depth + c) * inner_size + j] - max) * beta - log_sum; + (input_data[(i * depth + c) * inner_size + j] - max) * beta - log_sum; } } } @@ -124,10 +124,10 @@ inline void LogSoftmax(const SoftmaxParams ¶ms, float input_scale, const Sha for (int c = 0; c < depth; ++c) { const float log_prob = - scale * input_data[(i * depth + c) * inner_size] * beta - precomputed; + scale * input_data[(i * depth + c) * inner_size] * beta - precomputed; const int32_t prob_quantized = std::rint(log_prob) + params.zero_point; output_data[(i * depth + c) * inner_size] = - static_cast(std::max(std::min(clamp_max, prob_quantized), clamp_min)); + static_cast(std::max(std::min(clamp_max, prob_quantized), clamp_min)); } } } diff --git a/compute/cker/include/cker/operation/LogicalAnd.h b/compute/cker/include/cker/operation/LogicalAnd.h new file mode 100644 index 0000000..e877f5f --- /dev/null +++ b/compute/cker/include/cker/operation/LogicalAnd.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_LOGICAL_AND_H__ +#define __NNFW_CKER_LOGICAL_AND_H__ + +#include "cker/Shape.h" +#include "cker/Utils.h" + +namespace nnfw +{ +namespace cker +{ + +template +inline void LogicalAndBroadcast(const Shape &unextended_input1_shape, const T *input1_data, + const Shape &unextended_input2_shape, const T *input2_data, + const Shape &unextended_output_shape, T *output_data) +{ + assert(unextended_input1_shape.DimensionsCount() <= 4); + assert(unextended_input2_shape.DimensionsCount() <= 4); + assert(unextended_output_shape.DimensionsCount() <= 4); + const Shape output_shape = Shape::ExtendedShape(4, unextended_output_shape); + + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(unextended_input1_shape, unextended_input2_shape, &desc1, + &desc2); + + for (int b = 0; b < output_shape.Dims(0); ++b) + { + for (int y = 0; y < output_shape.Dims(1); ++y) + { + for (int x = 0; x < output_shape.Dims(2); ++x) + { + for (int c = 0; c < output_shape.Dims(3); ++c) + { + auto out_idx = Offset(output_shape, b, y, x, c); + auto in1_idx = SubscriptToIndex(desc1, b, y, x, c); + auto in2_idx = SubscriptToIndex(desc2, b, y, x, c); + auto in1_val = input1_data[in1_idx]; + auto in2_val = input2_data[in2_idx]; + output_data[out_idx] = in1_val && in2_val; + } + } + } + } +} + +template +inline void LogicalAndElementwise(const Shape &shape, const T *input1_data, const T *input2_data, + T *output_data) +{ + + int num_elements = shape.FlatSize(); + + for (int t = 0; t < num_elements; t++) + { + output_data[t] = input1_data[t] && input2_data[t]; + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_LOGICAL_AND_H__ diff --git a/compute/cker/include/cker/operation/MatrixBandPart.h b/compute/cker/include/cker/operation/MatrixBandPart.h index 5674ff3..ef28684 100644 --- a/compute/cker/include/cker/operation/MatrixBandPart.h +++ b/compute/cker/include/cker/operation/MatrixBandPart.h @@ -43,11 +43,11 @@ void MatrixBandPart(const T num_lower_diags, const T num_upper_diags, const Shap if (!(num_lower_diags <= row_num)) throw std::runtime_error( - "MatrixBandPart : num_lower must be negative or less or equal to number of rows"); + "MatrixBandPart : num_lower must be negative or less or equal to number of rows"); if (!(num_upper_diags <= col_num)) throw std::runtime_error( - "MatrixBandPart : num_upper must be negative or less or equal to number of columns"); + "MatrixBandPart : num_upper must be negative or less or equal to number of columns"); std::fill(output_data, output_data + output_shape.FlatSize(), 0); // output matrix init @@ -60,9 +60,10 @@ void MatrixBandPart(const T num_lower_diags, const T num_upper_diags, const Shap auto input = input_data + (batch * row_num * col_num + row * col_num); const T band_start = - num_lower_diags < 0 ? 0 : std::min(col_num, std::max(T{0}, row - num_lower_diags)); - const T band_end = num_upper_diags < 0 ? col_num : std::min(static_cast(col_num), - row + num_upper_diags + 1); + num_lower_diags < 0 ? 0 : std::min(col_num, std::max(T{0}, row - num_lower_diags)); + const T band_end = num_upper_diags < 0 + ? col_num + : std::min(static_cast(col_num), row + num_upper_diags + 1); for (T band_idx = band_start; band_idx < band_end; band_idx++) { diff --git a/compute/cker/include/cker/operation/MaxPool.h b/compute/cker/include/cker/operation/MaxPool.h index ea3fcac..5dc84d3 100644 --- a/compute/cker/include/cker/operation/MaxPool.h +++ b/compute/cker/include/cker/operation/MaxPool.h @@ -67,10 +67,10 @@ void MaxPool(const PoolParams ¶ms, const Shape &input_shape, const fl int hpad = h + params.padding_values.height; int wpad = w + params.padding_values.width; int h_start = - (hpad < params.filter_height) ? 0 : (hpad - params.filter_height) / stride_height + 1; + (hpad < params.filter_height) ? 0 : (hpad - params.filter_height) / stride_height + 1; int h_end = std::min(hpad / stride_height + 1, output_height); int w_start = - (wpad < params.filter_width) ? 0 : (wpad - params.filter_width) / stride_width + 1; + (wpad < params.filter_width) ? 0 : (wpad - params.filter_width) / stride_width + 1; int w_end = std::min(wpad / stride_width + 1, output_width); // compute elementwise sum for (int ph = h_start; ph < h_end; ++ph) @@ -79,8 +79,8 @@ void MaxPool(const PoolParams ¶ms, const Shape &input_shape, const fl { int out_offset = NodeOffset(b, ph, pw, output_height, output_width); out_mat.col(out_offset) = - out_mat.col(out_offset) - .cwiseMax(in_mat.col(NodeOffset(b, h, w, input_height, input_width))); + out_mat.col(out_offset) + .cwiseMax(in_mat.col(NodeOffset(b, h, w, input_height, input_width))); } } } @@ -139,8 +139,8 @@ void MaxPool(const PoolParams ¶ms, const Shape &input_shape, const const int filter_y_end = std::min(params.filter_height, input_height - in_y_origin); memset(acc, 0, tranche_depth * sizeof(acc[0])); const uint8_t *input_ptr = - input_data + depth_base + - depth * (in_x_origin + input_width * (in_y_origin + input_height * batch)); + input_data + depth_base + + depth * (in_x_origin + input_width * (in_y_origin + input_height * batch)); for (int fy = filter_y_start; fy < filter_y_end; fy++) { const uint8_t *input_row_ptr = input_ptr + depth * (fy * input_width + filter_x_start); diff --git a/compute/cker/include/cker/operation/OneHot.h b/compute/cker/include/cker/operation/OneHot.h index c0dbc6d..ddc27b4 100644 --- a/compute/cker/include/cker/operation/OneHot.h +++ b/compute/cker/include/cker/operation/OneHot.h @@ -55,7 +55,7 @@ void OneHot(const int32_t depth, const T on_value, const T off_value, int32_t ax for (int k = 0; k < suffix_dim_size; ++k, ++output_data) { *output_data = - static_cast(indices_data[i * suffix_dim_size + k]) == j ? on_value : off_value; + static_cast(indices_data[i * suffix_dim_size + k]) == j ? on_value : off_value; } } } diff --git a/compute/cker/include/cker/operation/Range.h b/compute/cker/include/cker/operation/Range.h index 5c3a773..d6ccc68 100644 --- a/compute/cker/include/cker/operation/Range.h +++ b/compute/cker/include/cker/operation/Range.h @@ -35,8 +35,8 @@ template inline int GetSize(T start, T limit, T delta) } int size = (std::is_integral::value - ? ((std::abs(limit - start) + std::abs(delta) - 1) / std::abs(delta)) - : std::ceil(std::abs((limit - start) / delta))); + ? ((std::abs(limit - start) + std::abs(delta) - 1) / std::abs(delta)) + : std::ceil(std::abs((limit - start) / delta))); return size; } diff --git a/compute/cker/include/cker/operation/Reduce.h b/compute/cker/include/cker/operation/Reduce.h index 2b2e8d3..dbf9381 100644 --- a/compute/cker/include/cker/operation/Reduce.h +++ b/compute/cker/include/cker/operation/Reduce.h @@ -50,7 +50,7 @@ inline void OptimizedReduceSum(const float *input_data, const Shape &input_shape { int r_idx = 0; float tmp_data[4] = { - 0, + 0, }; float32x4_t tmp_data_32x4 = vld1q_f32(tmp_data); for (; r_idx <= reduce_size - 32; r_idx += 32) @@ -143,7 +143,7 @@ inline bool ReduceImpl(const In *input_data, const Shape &input_shape, const Sha { size_t input_offset = ReducedOutputOffset(input_num_dims, input_dims, input_iter, 0, nullptr); size_t output_offset = - ReducedOutputOffset(input_num_dims, input_dims, input_iter, num_axis, axis); + ReducedOutputOffset(input_num_dims, input_dims, input_iter, num_axis, axis); output_data[output_offset] = reducer(output_data[output_offset], input_data[input_offset]); } while (NextIndex(input_num_dims, input_dims, input_iter)); return true; @@ -319,7 +319,7 @@ public: for (size_t idx = 0; idx < num_outputs; ++idx) { const U value = - static_cast(std::round(temp_sum[idx] * scale + bias)) + output_zero_point; + static_cast(std::round(temp_sum[idx] * scale + bias)) + output_zero_point; output_data[idx] = static_cast(value); } } @@ -329,7 +329,7 @@ public: for (size_t idx = 0; idx < num_outputs; ++idx) { float float_mean = - static_cast(temp_sum[idx]) / static_cast(num_elements_in_axis); + static_cast(temp_sum[idx]) / static_cast(num_elements_in_axis); float result = std::min(std::round(float_mean * scale + bias) + output_zero_point, static_cast(std::numeric_limits::max())); result = std::max(result, static_cast(std::numeric_limits::min())); diff --git a/compute/cker/include/cker/operation/ReduceMean.h b/compute/cker/include/cker/operation/ReduceMean.h index 2e4fc62..924e850 100644 --- a/compute/cker/include/cker/operation/ReduceMean.h +++ b/compute/cker/include/cker/operation/ReduceMean.h @@ -72,9 +72,9 @@ inline bool ReduceMeanImpl(const In *input_data, const Shape &input_shape, const { size_t input_offset = ReducedOutputOffset(input_num_dims, input_dims, input_iter, 0, nullptr); size_t output_offset = - ReducedOutputOffset(input_num_dims, input_dims, input_iter, num_axis, axis); + ReducedOutputOffset(input_num_dims, input_dims, input_iter, num_axis, axis); output_data[output_offset] = - reducer(output_data[output_offset], input_data[input_offset], normalizer); + reducer(output_data[output_offset], input_data[input_offset], normalizer); } while (NextIndex(input_num_dims, input_dims, input_iter)); return true; } @@ -102,7 +102,7 @@ inline size_t ReduceSumQuantImpl(const In *input_data, const Shape &input_shape, { size_t input_offset = ReducedOutputOffset(input_num_dims, input_dims, input_iter, 0, nullptr); size_t output_offset = - ReducedOutputOffset(input_num_dims, input_dims, input_iter, num_axis, axis); + ReducedOutputOffset(input_num_dims, input_dims, input_iter, num_axis, axis); temp_sum[output_offset] = reducer(temp_sum[output_offset], input_data[input_offset]); } while (NextIndex(input_num_dims, input_dims, input_iter)); return normalizer; @@ -185,8 +185,8 @@ public: } size_t normalizer = - ReduceSumQuantImpl(input_data, input_shape, resolved_axis_data(), num_resolved_axis, - temp_index_data(), reducer, _temp_sum.data()); + ReduceSumQuantImpl(input_data, input_shape, resolved_axis_data(), num_resolved_axis, + temp_index_data(), reducer, _temp_sum.data()); if (num_outputs > 0) { float scale = input_scale / output_scale; @@ -231,6 +231,37 @@ void MeanQ8Asymm(const Shape &input_shape, const In *input_data, float input_sca sum_reducer); } +template +void MeanAxis1And2(const Shape &input_shape, const In *input_data, const Shape &output_shape, + Out *output_data) +{ + UNUSED_RELEASE(output_shape); + assert(input_shape.DimensionsCount() == 4); + assert(output_shape.DimensionsCount() == 4); + + const int output_batch = output_shape.Dims(0); + const int output_depth = output_shape.Dims(3); + + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + + for (int out_b = 0; out_b < output_batch; ++out_b) + { + for (int out_d = 0; out_d < output_depth; ++out_d) + { + float value = 0; + for (int in_h = 0; in_h < input_height; ++in_h) + { + for (int in_w = 0; in_w < input_width; ++in_w) + { + value += input_data[Offset(input_shape, out_b, in_h, in_w, out_d)]; + } + } + output_data[Offset(output_shape, out_b, 0, 0, out_d)] = value / (input_width * input_height); + } + } +} + } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/operation/ResizeBilinear.h b/compute/cker/include/cker/operation/ResizeBilinear.h index 7fc1e91..8d9a749 100644 --- a/compute/cker/include/cker/operation/ResizeBilinear.h +++ b/compute/cker/include/cker/operation/ResizeBilinear.h @@ -62,7 +62,7 @@ inline void ResizeBilinearKernel2x2(int32_t x0, int32_t x1, int32_t y0, int32_t // Bottom right corner. output_data[output_offset + output_x_offset + output_y_offset] = - (output + ((x1y0 + x1y1) / 2)) / 2; + (output + ((x1y0 + x1y1) / 2)) / 2; } } @@ -192,8 +192,8 @@ inline void ResizeBilinearGenericSmallChannel(int32_t batches, int32_t input_hei &x1); int32_t input_offset[4] = { - Offset(input_shape, b, y0, x0, 0), Offset(input_shape, b, y0, x1, 0), - Offset(input_shape, b, y1, x0, 0), Offset(input_shape, b, y1, x1, 0)}; + Offset(input_shape, b, y0, x0, 0), Offset(input_shape, b, y0, x1, 0), + Offset(input_shape, b, y1, x0, 0), Offset(input_shape, b, y1, x1, 0)}; float scale[4] = {(1 - (input_y - y0)) * (1 - (input_x - x0)), (1 - (input_y - y0)) * (input_x - x0), (input_y - y0) * (1 - (input_x - x0)), (input_y - y0) * (input_x - x0)}; @@ -202,8 +202,8 @@ inline void ResizeBilinearGenericSmallChannel(int32_t batches, int32_t input_hei { const T *input_ptr = &input_data[d]; *output_ptr++ = static_cast( - input_ptr[input_offset[0]] * scale[0] + input_ptr[input_offset[1]] * scale[1] + - input_ptr[input_offset[2]] * scale[2] + input_ptr[input_offset[3]] * scale[3]); + input_ptr[input_offset[0]] * scale[0] + input_ptr[input_offset[1]] * scale[1] + + input_ptr[input_offset[2]] * scale[2] + input_ptr[input_offset[3]] * scale[3]); } } } @@ -253,16 +253,16 @@ void ResizeBilinear(ResizeBilinearParams ¶ms, const Shape &input_shape, int32_t depth = MatchingDim(input_shape, 3, output_shape, 3); float height_scale = (params.align_corners && params.output_height > 1) - ? (static_cast(input_height - 1) / (params.output_height - 1)) - : (static_cast(input_height) / params.output_height); + ? (static_cast(input_height - 1) / (params.output_height - 1)) + : (static_cast(input_height) / params.output_height); float width_scale = (params.align_corners && params.output_width > 1) - ? (static_cast(input_width - 1) / (params.output_width - 1)) - : (static_cast(input_width) / params.output_width); + ? (static_cast(input_width - 1) / (params.output_width - 1)) + : (static_cast(input_width) / params.output_width); ResizeBilinearGenericSmallChannel( - batches, input_height, input_width, depth, params.output_height, params.output_width, - height_scale, width_scale, input_shape, input_data, output_data, params.half_pixel_centers); + batches, input_height, input_width, depth, params.output_height, params.output_width, + height_scale, width_scale, input_shape, input_data, output_data, params.half_pixel_centers); } } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/operation/Select.h b/compute/cker/include/cker/operation/Select.h index ab2de94..644fe0a 100644 --- a/compute/cker/include/cker/operation/Select.h +++ b/compute/cker/include/cker/operation/Select.h @@ -34,7 +34,7 @@ void Select(const Shape &input_condition_shape, const D *input_condition_data, const T *input_y_data, const Shape &output_shape, T *output_data) { const int64_t flatsize = - MatchingFlatSize(input_condition_shape, input_x_shape, input_y_shape, output_shape); + MatchingFlatSize(input_condition_shape, input_x_shape, input_y_shape, output_shape); for (int64_t i = 0; i < flatsize; ++i) { output_data[i] = (input_condition_data[i] != 0) ? input_x_data[i] : input_y_data[i]; @@ -101,7 +101,7 @@ void BroadcastSelect4DSlow(const Shape &input_condition_shape, const D *input_co const int x_index = SubscriptToIndex(desc_x, b, y, x, c); const int y_index = SubscriptToIndex(desc_y, b, y, x, c); output_data[Offset(extended_output_shape, b, y, x, c)] = - input_condition_data[condition_index] ? input_x_data[x_index] : input_y_data[y_index]; + input_condition_data[condition_index] ? input_x_data[x_index] : input_y_data[y_index]; } } } diff --git a/compute/cker/include/cker/operation/Slice.h b/compute/cker/include/cker/operation/Slice.h index a072cff..ef97fd5 100644 --- a/compute/cker/include/cker/operation/Slice.h +++ b/compute/cker/include/cker/operation/Slice.h @@ -43,16 +43,16 @@ inline void Slice(const SliceParams &op_params, const Shape &input_shape, : start_b + op_params.size[0]; const int start_h = begin_count < 3 ? 0 : op_params.begin[begin_count - 3]; const int stop_h = (size_count < 3 || op_params.size[size_count - 3] == -1) - ? input_shape.Dims(1) - : start_h + op_params.size[size_count - 3]; + ? input_shape.Dims(1) + : start_h + op_params.size[size_count - 3]; const int start_w = begin_count < 2 ? 0 : op_params.begin[begin_count - 2]; const int stop_w = (size_count < 2 || op_params.size[size_count - 2] == -1) - ? input_shape.Dims(2) - : start_w + op_params.size[size_count - 2]; + ? input_shape.Dims(2) + : start_w + op_params.size[size_count - 2]; const int start_d = begin_count < 1 ? 0 : op_params.begin[begin_count - 1]; const int stop_d = (size_count < 1 || op_params.size[size_count - 1] == -1) - ? input_shape.Dims(3) - : start_d + op_params.size[size_count - 1]; + ? input_shape.Dims(3) + : start_d + op_params.size[size_count - 1]; for (int in_b = start_b; in_b < stop_b; ++in_b) { diff --git a/compute/cker/include/cker/operation/SoftMax.h b/compute/cker/include/cker/operation/SoftMax.h index 0e0f364..620c1f9 100644 --- a/compute/cker/include/cker/operation/SoftMax.h +++ b/compute/cker/include/cker/operation/SoftMax.h @@ -65,7 +65,7 @@ inline void Softmax(const SoftmaxParams ¶ms, const Shape &input_shape, const for (int c = 0; c < depth; ++c) { output_data[i * depth + c] = - std::exp((input_data[i * depth + c] - max) * static_cast(params.beta)) / sum; + std::exp((input_data[i * depth + c] - max) * static_cast(params.beta)) / sum; } } } @@ -163,11 +163,11 @@ inline void Softmax(const SoftmaxParams ¶ms, const Shape &input_shape, if (input_diff >= diff_min) { const int32_t input_diff_rescaled = MultiplyByQuantizedMultiplierGreaterThanOne( - input_diff, input_beta_multiplier, input_beta_left_shift); + input_diff, input_beta_multiplier, input_beta_left_shift); const FixedPointScaledDiff scaled_diff_f8 = - FixedPointScaledDiff::FromRaw(input_diff_rescaled); + FixedPointScaledDiff::FromRaw(input_diff_rescaled); sum_of_exps = sum_of_exps + gemmlowp::Rescale( - exp_on_negative_values(scaled_diff_f8)); + exp_on_negative_values(scaled_diff_f8)); } } @@ -178,11 +178,11 @@ inline void Softmax(const SoftmaxParams ¶ms, const Shape &input_shape, // no later adjustment will be needed. int num_bits_over_unit = kAccumulationIntegerBits - headroom_plus_one; int32_t shifted_sum_minus_one = - static_cast((static_cast(fixed_sum_of_exps) << headroom_plus_one) - - (static_cast(1) << 31)); + static_cast((static_cast(fixed_sum_of_exps) << headroom_plus_one) - + (static_cast(1) << 31)); FixedPoint0 shifted_scale = - one_over_one_plus_x_for_x_in_0_1(FixedPoint0::FromRaw(shifted_sum_minus_one)); + one_over_one_plus_x_for_x_in_0_1(FixedPoint0::FromRaw(shifted_sum_minus_one)); for (int c = 0; c < depth; ++c) { @@ -190,16 +190,16 @@ inline void Softmax(const SoftmaxParams ¶ms, const Shape &input_shape, if (input_diff >= diff_min) { const int32_t input_diff_rescaled = MultiplyByQuantizedMultiplierGreaterThanOne( - input_diff, input_beta_multiplier, input_beta_left_shift); + input_diff, input_beta_multiplier, input_beta_left_shift); const FixedPointScaledDiff scaled_diff_f8 = - FixedPointScaledDiff::FromRaw(input_diff_rescaled); + FixedPointScaledDiff::FromRaw(input_diff_rescaled); FixedPoint0 exp_in_0 = exp_on_negative_values(scaled_diff_f8); int32_t unsat_output = gemmlowp::RoundingDivideByPOT((shifted_scale * exp_in_0).raw(), num_bits_over_unit + 31 - 8); output_data[i * depth + c] = static_cast( - std::max(std::min(unsat_output, static_cast(255)), static_cast(0))); + std::max(std::min(unsat_output, static_cast(255)), static_cast(0))); } else { diff --git a/compute/cker/include/cker/operation/SpaceToBatchND.h b/compute/cker/include/cker/operation/SpaceToBatchND.h index feeb358..aff36e2 100644 --- a/compute/cker/include/cker/operation/SpaceToBatchND.h +++ b/compute/cker/include/cker/operation/SpaceToBatchND.h @@ -79,9 +79,9 @@ inline void SpaceToBatchND(const SpaceToBatchParams ¶ms, const Shape &unexte else { const T *in = - input_data + Offset(input_shape, input_batch, - (out_h * block_shape_height + shift_h) - padding_top, - (out_w * block_shape_width + shift_w) - padding_left, 0); + input_data + Offset(input_shape, input_batch, + (out_h * block_shape_height + shift_h) - padding_top, + (out_w * block_shape_width + shift_w) - padding_left, 0); memcpy(out, in, depth * sizeof(T)); } } diff --git a/compute/cker/include/cker/operation/StatelessRandomUniform.h b/compute/cker/include/cker/operation/StatelessRandomUniform.h index d5952ae..cdd812a 100644 --- a/compute/cker/include/cker/operation/StatelessRandomUniform.h +++ b/compute/cker/include/cker/operation/StatelessRandomUniform.h @@ -95,7 +95,7 @@ inline void StatelessRandomUniform(const Shape &shape_shape, const int *shape_da GenerateKey(seed_t, &key, &counter); Fill>( - random::PhiloxRandom(counter, key), &output_t); + random::PhiloxRandom(counter, key), &output_t); } } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/operation/Tile.h b/compute/cker/include/cker/operation/Tile.h index 1dcdd9b..4243346 100644 --- a/compute/cker/include/cker/operation/Tile.h +++ b/compute/cker/include/cker/operation/Tile.h @@ -55,7 +55,7 @@ std::pair TileOneDimension(const Shape &in_dimensions, const T *in_dat { int stride_size = 0, tiled_stride_size = 0; std::tie(stride_size, tiled_stride_size) = - TileOneDimension(in_dimensions, copy_from_data, multipliers, copy_to_data, dimension + 1); + TileOneDimension(in_dimensions, copy_from_data, multipliers, copy_to_data, dimension + 1); copy_from_data += stride_size; copy_to_data += tiled_stride_size; total_stride_size += stride_size; diff --git a/compute/cker/include/cker/operation/Transpose.h b/compute/cker/include/cker/operation/Transpose.h index 9d8cd34..62eb432 100644 --- a/compute/cker/include/cker/operation/Transpose.h +++ b/compute/cker/include/cker/operation/Transpose.h @@ -555,9 +555,9 @@ void Transpose(const TransposeParams &unshrunk_params, const Shape &unshrunk_inp const int total_size = shrunk_input_shape.FlatSize(); const int non_flatten_size = - Flatten(shrunk_input_shape, shrunk_output_shape, shrunk_params, + Flatten(shrunk_input_shape, shrunk_output_shape, shrunk_params, - &non_flatten_input_shape, &non_flatten_output_shape, &non_flatten_params); + &non_flatten_input_shape, &non_flatten_output_shape, &non_flatten_params); assert(non_flatten_params.perm[0] != 0); for (int i = 0; i < total_size; i += non_flatten_size) diff --git a/compute/cker/include/cker/operation/TransposeConv.h b/compute/cker/include/cker/operation/TransposeConv.h index 7db3a11..d41f860 100644 --- a/compute/cker/include/cker/operation/TransposeConv.h +++ b/compute/cker/include/cker/operation/TransposeConv.h @@ -90,11 +90,11 @@ inline void TransposeConv(const TransposeConvParams ¶ms, const Shape &input_ (out_y < output_height)) { float input_value = - input_data[Offset(input_shape, batch, in_y, in_x, in_channel)]; - float filter_value = filter_data[Offset(filter_shape, out_channel, filter_y, - filter_x, in_channel)]; + input_data[Offset(input_shape, batch, in_y, in_x, in_channel)]; + float filter_value = + filter_data[Offset(filter_shape, out_channel, filter_y, filter_x, in_channel)]; output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] += - input_value * filter_value; + input_value * filter_value; } } } diff --git a/compute/cker/include/cker/operation/optimized/BinaryArithmeticOps.h b/compute/cker/include/cker/operation/optimized/BinaryArithmeticOps.h index 912b01a..8c1d31b 100644 --- a/compute/cker/include/cker/operation/optimized/BinaryArithmeticOps.h +++ b/compute/cker/include/cker/operation/optimized/BinaryArithmeticOps.h @@ -130,12 +130,12 @@ inline int32_t quant8_sum(const BinaryArithmeticOpParam ¶ms, const uint8_t i const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); const int32_t scaled_input1_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, params.input1_shift); + shifted_input1_val, params.input1_multiplier, params.input1_shift); const int32_t scaled_input2_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, params.input2_shift); + shifted_input2_val, params.input2_multiplier, params.input2_shift); const int32_t raw_sum = scaled_input1_val + scaled_input2_val; const int32_t raw_output = MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sum, params.output_multiplier, params.output_shift) + + raw_sum, params.output_multiplier, params.output_shift) + params.output_offset; const int32_t clamped_output = std::min(params.quantized_activation_max, std::max(params.quantized_activation_min, raw_output)); @@ -192,9 +192,9 @@ inline void AddElementwiseQuant8(int size, const BinaryArithmeticOpParam ¶ms const int16x4_t s1_narrowed = vmovn_s32(s1); const int16x4_t s2_narrowed = vmovn_s32(s2); const int16x8_t s = - vaddq_s16(vcombine_s16(s1_narrowed, s2_narrowed), vdupq_n_s16(params.output_offset)); - const uint8x8_t clamped = vmax_u8(output_activation_min_vector, - vmin_u8(output_activation_max_vector, vqmovun_s16(s))); + vaddq_s16(vcombine_s16(s1_narrowed, s2_narrowed), vdupq_n_s16(params.output_offset)); + const uint8x8_t clamped = + vmax_u8(output_activation_min_vector, vmin_u8(output_activation_max_vector, vqmovun_s16(s))); vst1_u8(output_data + i, clamped); } #endif // NEON @@ -205,12 +205,12 @@ inline void AddElementwiseQuant8(int size, const BinaryArithmeticOpParam ¶ms const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); const int32_t scaled_input1_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, params.input1_shift); + shifted_input1_val, params.input1_multiplier, params.input1_shift); const int32_t scaled_input2_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, params.input2_shift); + shifted_input2_val, params.input2_multiplier, params.input2_shift); const int32_t raw_sum = scaled_input1_val + scaled_input2_val; const int32_t raw_output = MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sum, params.output_multiplier, params.output_shift) + + raw_sum, params.output_multiplier, params.output_shift) + params.output_offset; const int32_t clamped_output = std::min(params.quantized_activation_max, std::max(params.quantized_activation_min, raw_output)); @@ -387,7 +387,7 @@ inline void BinaryOpElementwise(int size, const BinaryArithmeticOpParam ¶ms, auto a2 = vld1q_f32(input2_data + i); auto x = OPERATOR::calculate(a1, a2); // vaddq auto x_clamped = - ACTIVATION::applyCeiling(ACTIVATION::applyFloor(x, activation_min), activation_max); + ACTIVATION::applyCeiling(ACTIVATION::applyFloor(x, activation_min), activation_max); vst1q_f32(output_data + i, x_clamped); } #endif // USE_NEON @@ -395,7 +395,7 @@ inline void BinaryOpElementwise(int size, const BinaryArithmeticOpParam ¶ms, { auto x = OPERATOR::calculate(input1_data[i], input2_data[i]); output_data[i] = ACTIVATION::applyCeiling( - ACTIVATION::applyFloor(x, params.float_activation_min), params.float_activation_max); + ACTIVATION::applyFloor(x, params.float_activation_min), params.float_activation_max); } } @@ -441,7 +441,7 @@ inline void BinaryOpScalarBroadcast(int size, const BinaryArithmeticOpParam &par auto a2 = vld1q_f32(input2_data + i); auto x = OPERATOR::calculate(broadcast_value_dup, a2); auto x_clamped = - ACTIVATION::applyCeiling(ACTIVATION::applyFloor(x, activation_min), activation_max); + ACTIVATION::applyCeiling(ACTIVATION::applyFloor(x, activation_min), activation_max); vst1q_f32(output_data + i, x_clamped); } #endif // USE_NEON @@ -449,13 +449,13 @@ inline void BinaryOpScalarBroadcast(int size, const BinaryArithmeticOpParam &par { auto x = OPERATOR::calculate(broadcast_value, input2_data[i]); output_data[i] = ACTIVATION::applyCeiling( - ACTIVATION::applyFloor(x, params.float_activation_min), params.float_activation_max); + ACTIVATION::applyFloor(x, params.float_activation_min), params.float_activation_max); } } using BinaryOpImplFloatFuncs = - std::pair; + std::pair; template inline BinaryOpImplFloatFuncs @@ -514,23 +514,22 @@ inline void BroadcastAddDispatchQuant8(const BinaryArithmeticOpParam ¶ms, if (params.broadcast_category == BroadcastableOpCategory::kGenericBroadcast) { const std::function - fn = [](const BinaryArithmeticOpParam ¶ms, const uint8_t &a, - const uint8_t &b) -> uint8_t { + fn = + [](const BinaryArithmeticOpParam ¶ms, const uint8_t &a, const uint8_t &b) -> uint8_t { return static_cast(quant8_sum(params, a, b)); }; - reference::BroadcastBinaryArithmeticOpSlowQuant8(params, input1_shape, input1_data, - input2_shape, input2_data, output_shape, - output_data, fn); + reference::BroadcastBinaryArithmeticOpSlowQuant8( + params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, fn); } else { BinaryBroadcastFiveFold( - params, params.broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast, - input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, - static_cast(AddElementwiseQuant8), - static_cast(AddScalarBroadcastQuant8)); + params, params.broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast, + input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, + static_cast(AddElementwiseQuant8), + static_cast(AddScalarBroadcastQuant8)); } } @@ -542,7 +541,7 @@ inline void BroadcastAddDispatch(const BinaryArithmeticOpParam ¶ms, const Sh if (params.broadcast_category == BroadcastableOpCategory::kGenericBroadcast) { const std::function fn = - [](const float &a, const float &b) -> float { return a + b; }; + [](const float &a, const float &b) -> float { return a + b; }; reference::BroadcastBinaryArithmeticOpSlow(params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, fn); } @@ -550,10 +549,10 @@ inline void BroadcastAddDispatch(const BinaryArithmeticOpParam ¶ms, const Sh { auto implFuncs = getBinaryOpWithActivationImplFloat(params); - BinaryBroadcastFiveFold(params, params.broadcast_category == - BroadcastableOpCategory::kSecondInputBroadcastsFast, - input1_shape, input1_data, input2_shape, input2_data, output_shape, - output_data, implFuncs.first, implFuncs.second); + BinaryBroadcastFiveFold( + params, params.broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast, + input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, + implFuncs.first, implFuncs.second); } } @@ -580,14 +579,14 @@ inline void BroadcastSubDispatch(const BinaryArithmeticOpParam ¶ms, const Sh else if (params.broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast) { auto implFuncs = - getBinaryOpWithActivationImplFloat>(params); + getBinaryOpWithActivationImplFloat>(params); BinaryBroadcastFiveFold(params, true, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, implFuncs.first, implFuncs.second); } else { const std::function fn = - [](const float &a, const float &b) -> float { return a - b; }; + [](const float &a, const float &b) -> float { return a - b; }; reference::BroadcastBinaryArithmeticOpSlow(params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, fn); } @@ -599,11 +598,11 @@ inline int32_t quant8_mul(const BinaryArithmeticOpParam ¶ms, const uint8_t i const int32_t input1_val = params.input1_offset + input1_data; const int32_t input2_val = params.input2_offset + input2_data; const int32_t unclamped_result = - params.output_offset + MultiplyByQuantizedMultiplier(input1_val * input2_val, - params.output_multiplier, - params.output_shift); + params.output_offset + MultiplyByQuantizedMultiplier(input1_val * input2_val, + params.output_multiplier, + params.output_shift); const int32_t clamped_output = std::min( - params.quantized_activation_max, std::max(params.quantized_activation_min, unclamped_result)); + params.quantized_activation_max, std::max(params.quantized_activation_min, unclamped_result)); return clamped_output; } @@ -652,8 +651,8 @@ inline void MulElementwiseQuant8(int size, const BinaryArithmeticOpParam ¶ms const auto p1_narrowed = vqmovn_s32(p1); const auto p2_narrowed = vqmovn_s32(p2); const auto p = vaddq_s16(vcombine_s16(p1_narrowed, p2_narrowed), output_offset_vector); - const auto clamped = vmax_u8(output_activation_min_vector, - vmin_u8(output_activation_max_vector, vqmovun_s16(p))); + const auto clamped = + vmax_u8(output_activation_min_vector, vmin_u8(output_activation_max_vector, vqmovun_s16(p))); vst1_u8(output_data + i, clamped); } #endif // NEON @@ -663,12 +662,11 @@ inline void MulElementwiseQuant8(int size, const BinaryArithmeticOpParam ¶ms const int32_t input1_val = params.input1_offset + input1_data[i]; const int32_t input2_val = params.input2_offset + input2_data[i]; const int32_t unclamped_result = - params.output_offset + MultiplyByQuantizedMultiplier(input1_val * input2_val, - params.output_multiplier, - params.output_shift); - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, unclamped_result)); + params.output_offset + MultiplyByQuantizedMultiplier(input1_val * input2_val, + params.output_multiplier, + params.output_shift); + const int32_t clamped_output = std::min( + params.quantized_activation_max, std::max(params.quantized_activation_min, unclamped_result)); output_data[i] = static_cast(clamped_output); } } @@ -711,22 +709,21 @@ inline void BroadcastMulDispatchQuant8(const BinaryArithmeticOpParam ¶ms, if (params.broadcast_category == BroadcastableOpCategory::kGenericBroadcast) { const std::function - fn = [](const BinaryArithmeticOpParam ¶ms, const uint8_t &a, - const uint8_t &b) -> uint8_t { + fn = + [](const BinaryArithmeticOpParam ¶ms, const uint8_t &a, const uint8_t &b) -> uint8_t { return static_cast(quant8_mul(params, a, b)); }; - reference::BroadcastBinaryArithmeticOpSlowQuant8(params, input1_shape, input1_data, - input2_shape, input2_data, output_shape, - output_data, fn); + reference::BroadcastBinaryArithmeticOpSlowQuant8( + params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, fn); return; } BinaryBroadcastFiveFold( - params, params.broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast, - input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, - static_cast(MulElementwiseQuant8), - static_cast(MulSimpleBroadcastQuant8)); + params, params.broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast, + input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, + static_cast(MulElementwiseQuant8), + static_cast(MulSimpleBroadcastQuant8)); } inline void BroadcastMulDispatch(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, @@ -738,16 +735,16 @@ inline void BroadcastMulDispatch(const BinaryArithmeticOpParam ¶ms, const Sh { // TODO: Use GetBinaryArithmeticFn const std::function fn = - [](const float &a, const float &b) -> float { return a * b; }; + [](const float &a, const float &b) -> float { return a * b; }; reference::BroadcastBinaryArithmeticOpSlow(params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, fn); return; } auto implFuncs = getBinaryOpWithActivationImplFloat(params); - BinaryBroadcastFiveFold(params, params.broadcast_category == - BroadcastableOpCategory::kSecondInputBroadcastsFast, - input1_shape, input1_data, input2_shape, input2_data, output_shape, - output_data, implFuncs.first, implFuncs.second); + BinaryBroadcastFiveFold( + params, params.broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast, + input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, + implFuncs.first, implFuncs.second); } inline void Div(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, @@ -760,7 +757,7 @@ inline void Div(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape (*implFuncs.first)(flat_size, params, input1_data, input2_data, output_data); #else const std::function fn = - [](const float &a, const float &b) -> float { return a / b; }; + [](const float &a, const float &b) -> float { return a / b; }; reference::BinaryArithmeticOp(params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, fn); #endif // __aarch64__ @@ -781,7 +778,7 @@ inline void BroadcastDivDispatch(const BinaryArithmeticOpParam ¶ms, const Sh else if (params.broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast) { auto implFuncs = - getBinaryOpWithActivationImplFloat>(params); + getBinaryOpWithActivationImplFloat>(params); BinaryBroadcastFiveFold(params, true, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, implFuncs.first, implFuncs.second); } @@ -789,7 +786,7 @@ inline void BroadcastDivDispatch(const BinaryArithmeticOpParam ¶ms, const Sh #endif // __aarch64__ { const std::function fn = - [](const float &a, const float &b) -> float { return a / b; }; + [](const float &a, const float &b) -> float { return a / b; }; reference::BroadcastBinaryArithmeticOpSlow(params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, fn); } diff --git a/compute/cker/include/cker/operation/optimized/Conv.h b/compute/cker/include/cker/operation/optimized/Conv.h index 0f62014..26fc443 100644 --- a/compute/cker/include/cker/operation/optimized/Conv.h +++ b/compute/cker/include/cker/operation/optimized/Conv.h @@ -48,7 +48,7 @@ struct GemmlowpOutputPipeline typedef std::tuple, gemmlowp::OutputStageScaleInt32ByFixedPointAndExponent, gemmlowp::OutputStageClamp, gemmlowp::OutputStageSaturatingCastToUint8> - Pipeline; + Pipeline; static Pipeline MakeExp(const int32_t *bias_data, int output_rows, int32_t output_offset, int32_t output_multiplier, int output_left_shift, int32_t output_activation_min, int32_t output_activation_max) @@ -106,7 +106,7 @@ inline void Conv(const ConvParams ¶ms, const Shape &input_shape, const uint8 const int filter_height = filter_shape.Dims(1); const bool need_dilated_im2col = dilation_width_factor != 1 || dilation_height_factor != 1; const bool need_im2col = - stride_width != 1 || stride_height != 1 || filter_width != 1 || filter_height != 1; + stride_width != 1 || stride_height != 1 || filter_width != 1 || filter_height != 1; if (need_dilated_im2col) { assert(im2col_data); @@ -141,7 +141,7 @@ inline void Conv(const ConvParams ¶ms, const Shape &input_shape, const uint8 // the other calls commented out. This is a partial rollback of cl/196819423. // const int gemm_input_cols = FlatSizeSkipDim(*gemm_input_shape, 3); const int gemm_input_cols = - gemm_input_shape->Dims(0) * gemm_input_shape->Dims(1) * gemm_input_shape->Dims(2); + gemm_input_shape->Dims(0) * gemm_input_shape->Dims(1) * gemm_input_shape->Dims(2); const int filter_rows = filter_shape.Dims(0); // See b/79927784. // const int filter_cols = FlatSizeSkipDim(filter_shape, 0); @@ -156,17 +156,17 @@ inline void Conv(const ConvParams ¶ms, const Shape &input_shape, const uint8 assert(bias_shape.FlatSize() == output_rows); UNUSED_RELEASE(bias_shape); gemmlowp::MatrixMap filter_matrix( - filter_data, filter_rows, filter_cols); + filter_data, filter_rows, filter_cols); gemmlowp::MatrixMap input_matrix( - gemm_input_data, gemm_input_rows, gemm_input_cols); + gemm_input_data, gemm_input_rows, gemm_input_cols); gemmlowp::MatrixMap output_matrix(output_data, output_rows, output_cols); const auto &output_pipeline = - GemmlowpOutputPipeline::MakeExp(bias_data, output_rows, output_offset, output_multiplier, - output_shift, output_activation_min, output_activation_max); + GemmlowpOutputPipeline::MakeExp(bias_data, output_rows, output_offset, output_multiplier, + output_shift, output_activation_min, output_activation_max); gemmlowp::GemmWithOutputPipeline( - gemm_context, filter_matrix, input_matrix, &output_matrix, filter_offset, input_offset, - output_pipeline); + gemm_context, filter_matrix, input_matrix, &output_matrix, filter_offset, input_offset, + output_pipeline); } } // namespace optimized @@ -202,10 +202,10 @@ public: T *output_data, int output_height, int output_width) { const bool is_1x1_kernel = - (filter_height == 1 && filter_width == 1 && stride_rows == 1 && stride_cols == 1); + (filter_height == 1 && filter_width == 1 && stride_rows == 1 && stride_cols == 1); const bool is_same_height_width = - (filter_height == input_height && filter_width == input_width && pad_width == 0 && - pad_height == 0); + (filter_height == input_height && filter_width == input_width && pad_width == 0 && + pad_height == 0); if (is_1x1_kernel || is_same_height_width) { // is_1x1_kernel: For 1x1 kernel, the 2D convolution is reduced to matrix multiplication. diff --git a/compute/cker/include/cker/operation/optimized/DepthwiseConvFloat.h b/compute/cker/include/cker/operation/optimized/DepthwiseConvFloat.h new file mode 100644 index 0000000..d439793 --- /dev/null +++ b/compute/cker/include/cker/operation/optimized/DepthwiseConvFloat.h @@ -0,0 +1,1250 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_OPTIMIZED_DEPTHWISE_CONV_FLOAT_H__ +#define __NNFW_CKER_OPTIMIZED_DEPTHWISE_CONV_FLOAT_H__ + +#include "cker/Shape.h" +#include "cker/Types.h" +#include "cker/Utils.h" +#include "cker/neon/neon_check.h" + +namespace nnfw +{ +namespace cker +{ +namespace optimized +{ + +// Implementation of float DepthwiseConv + +template +struct FloatDepthwiseConvKernel +{ +}; + +#ifdef USE_NEON + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)input_depth; + (void)depth_multiplier; + (void)input_ptr_increment; + // Load the filters + float32x4_t filter[2]; + for (int i = 0; i < 2; i++) + { + filter[i] = vld1q_f32(filter_ptr + 4 * i); + } + int outp = 0; + // Handle 2 output pixels at a time. + for (; outp <= num_output_pixels - 2; outp += 2) + { + // Load the inputs + float32x4_t input[4]; + for (int i = 0; i < 4; i++) + { + input[i] = vld1q_f32(input_ptr + 4 * i); + } + input_ptr += 16; + // Load the accumulators from acc_buffer + float32x4_t acc[4]; + for (int i = 0; i < 4; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate + acc[0] = vmlaq_f32(acc[0], input[0], filter[0]); + acc[1] = vmlaq_f32(acc[1], input[1], filter[1]); + acc[2] = vmlaq_f32(acc[2], input[2], filter[0]); + acc[3] = vmlaq_f32(acc[3], input[3], filter[1]); + // Store the accumulators back to acc_buffer + for (int i = 0; i < 4; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 16; + } + // Handle one output pixel at a time. + for (; outp < num_output_pixels; outp++) + { + // Load the inputs + float32x4_t input[2]; + for (int i = 0; i < 2; i++) + { + input[i] = vld1q_f32(input_ptr + 4 * i); + } + input_ptr += 8; + // Load the accumulators from acc_buffer + float32x4_t acc[2]; + for (int i = 0; i < 2; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate + for (int i = 0; i < 2; i++) + { + acc[i] = vmlaq_f32(acc[i], input[i], filter[i]); + } + // Store the accumulators back to acc_buffer + for (int i = 0; i < 2; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 8; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)input_depth; + (void)depth_multiplier; + (void)input_ptr_increment; + + const float32x2_t filters = vld1_f32(filter_ptr); + const float32x4_t filters_dup2 = vcombine_f32(filters, filters); + int outp = 0; + // Handle 8 output pixels at a time. + for (; outp <= num_output_pixels - 8; outp += 8) + { + // Load the inputs + float32x4_t input[4]; + for (int i = 0; i < 4; i++) + { + input[i] = vld1q_f32(input_ptr + 4 * i); + } + input_ptr += 16; + // Load the accumulators from acc_buffer + float32x4_t acc[4]; + for (int i = 0; i < 4; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate + for (int i = 0; i < 4; i++) + { + acc[i] = vmlaq_f32(acc[i], input[i], filters_dup2); + } + // Store the accumulators back to acc_buffer + for (int i = 0; i < 4; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 16; + } + // Handle 4 output pixels at a time. + for (; outp <= num_output_pixels - 4; outp += 4) + { + // Load the inputs + float32x4_t input[2]; + for (int i = 0; i < 2; i++) + { + input[i] = vld1q_f32(input_ptr + 4 * i); + } + input_ptr += 8; + // Load the accumulators from acc_buffer + float32x4_t acc[2]; + for (int i = 0; i < 2; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate + for (int i = 0; i < 2; i++) + { + acc[i] = vmlaq_f32(acc[i], input[i], filters_dup2); + } + // Store the accumulators back to acc_buffer + for (int i = 0; i < 2; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 8; + } + // Handle 2 output pixels at a time. + for (; outp <= num_output_pixels - 2; outp += 2) + { + // Load the inputs + const float32x4_t input = vld1q_f32(input_ptr); + input_ptr += 4; + // Load the accumulators from acc_buffer + float32x4_t acc = vld1q_f32(acc_buffer_ptr); + // Multiply-accumulate + acc = vmlaq_f32(acc, input, filters_dup2); + // Store the accumulators back to acc_buffer + vst1q_f32(acc_buffer_ptr, acc); + acc_buffer_ptr += 4; + } + // Handle 1 output pixel at a time + for (; outp < num_output_pixels; outp++) + { + // Load the inputs + const float32x2_t input = vld1_f32(input_ptr); + input_ptr += 2; + // Load the accumulators from acc_buffer + float32x2_t acc = vld1_f32(acc_buffer_ptr); + // Multiply-accumulate + acc = vmla_f32(acc, input, filters); + // Store the accumulators back to acc_buffer + vst1_f32(acc_buffer_ptr, acc); + acc_buffer_ptr += 2; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)depth_multiplier; + + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + const float *local_filter_ptr = filter_ptr; + const float *local_input_ptr = input_ptr; + int ic = 0; + // Handle 16 input channels at a time. + for (; ic <= input_depth - 16; ic += 16) + { + // Load the filters + float32x4_t filter_0 = vld1q_f32(local_filter_ptr + 4 * 0); + float32x4_t filter_1 = vld1q_f32(local_filter_ptr + 4 * 1); + float32x4_t filter_2 = vld1q_f32(local_filter_ptr + 4 * 2); + float32x4_t filter_3 = vld1q_f32(local_filter_ptr + 4 * 3); + local_filter_ptr += 16; + // Load the inputs + float32x4_t input_0 = vld1q_f32(local_input_ptr + 4 * 0); + float32x4_t input_1 = vld1q_f32(local_input_ptr + 4 * 1); + float32x4_t input_2 = vld1q_f32(local_input_ptr + 4 * 2); + float32x4_t input_3 = vld1q_f32(local_input_ptr + 4 * 3); + local_input_ptr += 16; + // Load the accumulators from acc_buffer + float32x4_t acc_0 = vld1q_f32(acc_buffer_ptr + 4 * 0); + float32x4_t acc_1 = vld1q_f32(acc_buffer_ptr + 4 * 1); + float32x4_t acc_2 = vld1q_f32(acc_buffer_ptr + 4 * 2); + float32x4_t acc_3 = vld1q_f32(acc_buffer_ptr + 4 * 3); + // Multiply-accumulate + acc_0 = vmlaq_f32(acc_0, input_0, filter_0); + acc_1 = vmlaq_f32(acc_1, input_1, filter_1); + acc_2 = vmlaq_f32(acc_2, input_2, filter_2); + acc_3 = vmlaq_f32(acc_3, input_3, filter_3); + // Store the accumulators back to acc_buffer + vst1q_f32(acc_buffer_ptr + 4 * 0, acc_0); + vst1q_f32(acc_buffer_ptr + 4 * 1, acc_1); + vst1q_f32(acc_buffer_ptr + 4 * 2, acc_2); + vst1q_f32(acc_buffer_ptr + 4 * 3, acc_3); + acc_buffer_ptr += 16; + } + // Handle 4 input channels at a time. + for (; ic <= input_depth - 4; ic += 4) + { + // Load the filters + float32x4_t filter; + filter = vld1q_f32(local_filter_ptr); + local_filter_ptr += 4; + // Load the inputs + float32x4_t input; + input = vld1q_f32(local_input_ptr); + local_input_ptr += 4; + // Load the accumulators from acc_buffer + float32x4_t acc; + acc = vld1q_f32(acc_buffer_ptr); + // Multiply-accumulate + acc = vmlaq_f32(acc, input, filter); + // Store the accumulators back to acc_buffer + vst1q_f32(acc_buffer_ptr, acc); + acc_buffer_ptr += 4; + } + // Handle one input channel at a time. + for (; ic < input_depth; ic++) + { + const float input_val = *local_input_ptr++; + const float filter_val = *local_filter_ptr++; + *acc_buffer_ptr++ += filter_val * input_val; + } + input_ptr += input_ptr_increment; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)depth_multiplier; + + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + const float *local_filter_ptr = filter_ptr; + const float *local_input_ptr = input_ptr; + int ic = 0; + // Handle 2 input channels at a time. + for (; ic <= input_depth - 2; ic += 2) + { + // Load the filters + float32x4_t filter[4]; + for (int i = 0; i < 4; i++) + { + filter[i] = vld1q_f32(local_filter_ptr + 4 * i); + } + local_filter_ptr += 16; + // Load the inputs + const float32x2_t input = vld1_f32(local_input_ptr); + local_input_ptr += 2; + // Load the accumulators from acc_buffer + float32x4_t acc[4]; + for (int i = 0; i < 4; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate + acc[0] = vmlaq_lane_f32(acc[0], filter[0], input, 0); + acc[1] = vmlaq_lane_f32(acc[1], filter[1], input, 0); + acc[2] = vmlaq_lane_f32(acc[2], filter[2], input, 1); + acc[3] = vmlaq_lane_f32(acc[3], filter[3], input, 1); + // Store the accumulators back to acc_buffer + for (int i = 0; i < 4; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 16; + } + // Handle one input channel at a time. + for (; ic < input_depth; ic++) + { + // Load the filters + float32x4_t filter[2]; + for (int i = 0; i < 2; i++) + { + filter[i] = vld1q_f32(local_filter_ptr + 4 * i); + } + local_filter_ptr += 8; + // Load the inputs + const float input_val = *local_input_ptr++; + // Load the accumulators from acc_buffer + float32x4_t acc[2]; + for (int i = 0; i < 2; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate + for (int i = 0; i < 2; i++) + { + acc[i] = vmlaq_n_f32(acc[i], filter[i], input_val); + } + // Store the accumulators back to acc_buffer + for (int i = 0; i < 2; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 8; + } + input_ptr += input_ptr_increment; + } + } +}; + +// Note this implementation is very slow for input_depths < 8 +// (e.g. comparable to reference implementation) see, specializations for +// input_depth=3 below. +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)depth_multiplier; + + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + const float *local_filter_ptr = filter_ptr; + const float *local_input_ptr = input_ptr; + int ic = 0; + // Handle 8 input channels at a time. + for (; ic <= input_depth - 8; ic += 8) + { + // Load the filters + float32x4_t filter[4]; + for (int i = 0; i < 4; i++) + { + filter[i] = vld1q_f32(local_filter_ptr + 4 * i); + } + local_filter_ptr += 16; + // Load the inputs + float32x4x2_t input_dup2[2]; + for (int i = 0; i < 2; i++) + { + const float32x4_t input = vld1q_f32(local_input_ptr + 4 * i); + input_dup2[i] = vzipq_f32(input, input); + } + local_input_ptr += 8; + // Load the accumulators from acc_buffer + float32x4_t acc[4]; + for (int i = 0; i < 4; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate + acc[0] = vmlaq_f32(acc[0], filter[0], input_dup2[0].val[0]); + acc[1] = vmlaq_f32(acc[1], filter[1], input_dup2[0].val[1]); + acc[2] = vmlaq_f32(acc[2], filter[2], input_dup2[1].val[0]); + acc[3] = vmlaq_f32(acc[3], filter[3], input_dup2[1].val[1]); + // Store the accumulators back to acc_buffer + for (int i = 0; i < 4; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 16; + } + // Handle 4 input channels at a time. + for (; ic <= input_depth - 4; ic += 4) + { + // Load the filters + float32x2_t filter[4]; + for (int i = 0; i < 4; i++) + { + filter[i] = vld1_f32(local_filter_ptr + 2 * i); + } + local_filter_ptr += 8; + // Load the inputs + const float32x4_t input = vld1q_f32(local_input_ptr); + local_input_ptr += 4; + // Load the accumulators from acc_buffer + float32x2_t acc[4]; + for (int i = 0; i < 4; i++) + { + acc[i] = vld1_f32(acc_buffer_ptr + 2 * i); + } + // Multiply-accumulate + acc[0] = vmla_lane_f32(acc[0], filter[0], vget_low_f32(input), 0); + acc[1] = vmla_lane_f32(acc[1], filter[1], vget_low_f32(input), 1); + acc[2] = vmla_lane_f32(acc[2], filter[2], vget_high_f32(input), 0); + acc[3] = vmla_lane_f32(acc[3], filter[3], vget_high_f32(input), 1); + // Store the accumulators back to acc_buffer + for (int i = 0; i < 4; i++) + { + vst1_f32(acc_buffer_ptr + 2 * i, acc[i]); + } + acc_buffer_ptr += 8; + } + // Handle 2 input channels at a time. + for (; ic <= input_depth - 2; ic += 2) + { + // Load the filters + const float32x4_t filter = vld1q_f32(local_filter_ptr); + local_filter_ptr += 4; + // Load the inputs + const float32x2_t input = vld1_f32(local_input_ptr); + local_input_ptr += 2; + // Load the accumulators from acc_buffer + float32x2_t acc[2]; + for (int i = 0; i < 2; i++) + { + acc[i] = vld1_f32(acc_buffer_ptr + 2 * i); + } + // Multiply-accumulate + acc[0] = vmla_lane_f32(acc[0], vget_low_f32(filter), input, 0); + acc[1] = vmla_lane_f32(acc[1], vget_high_f32(filter), input, 1); + // Store the accumulators back to acc_buffer + for (int i = 0; i < 2; i++) + { + vst1_f32(acc_buffer_ptr + 2 * i, acc[i]); + } + acc_buffer_ptr += 4; + } + // Handle one input channel at a time. + for (; ic < input_depth; ic++) + { + // Load the inputs + const float input_val = *local_input_ptr++; + // Multiply-accumulate + for (int i = 0; i < 2; i++) + { + acc_buffer_ptr[i] += local_filter_ptr[i] * input_val; + } + local_filter_ptr += 2; + acc_buffer_ptr += 2; + } + input_ptr += input_ptr_increment; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)input_depth; + (void)depth_multiplier; + + // Load the filters + float32x2_t filter[3]; + for (int i = 0; i < 3; i++) + { + filter[i] = vld1_f32(filter_ptr + 2 * i); + } + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + const float32x2_t input01 = vld1_f32(input_ptr); + const float32x2_t input2 = vld1_dup_f32(input_ptr + 2); + // Load the accumulators from acc_buffer + float32x2_t acc[3]; + for (int i = 0; i < 3; i++) + { + acc[i] = vld1_f32(acc_buffer_ptr + 2 * i); + } + // Multiply-accumulate for each input channel there 2 outputs + acc[0] = vmla_lane_f32(acc[0], filter[0], input01, 0); + acc[1] = vmla_lane_f32(acc[1], filter[1], input01, 1); + acc[2] = vmla_lane_f32(acc[2], filter[2], input2, 0); + // Store the accumulators back to acc_buffer + for (int i = 0; i < 3; i++) + { + vst1_f32(acc_buffer_ptr + 2 * i, acc[i]); + } + acc_buffer_ptr += 6; + input_ptr += input_ptr_increment; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)input_depth; + (void)depth_multiplier; + + // Load the filters + float32x4_t filter[3]; + for (int i = 0; i < 3; i++) + { + filter[i] = vld1q_f32(filter_ptr + 4 * i); + } + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + // NOTE: we only want 3 values, so we read it as two ops where + // the second op just duplicates the lane + const float32x2_t input01 = vld1_f32(input_ptr); + const float32x2_t input2 = vld1_dup_f32(input_ptr + 2); + // Load the accumulators from acc_buffer + float32x4_t acc[3]; + for (int i = 0; i < 3; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate all outputs. + acc[0] = vmlaq_lane_f32(acc[0], filter[0], input01, 0); + acc[1] = vmlaq_lane_f32(acc[1], filter[1], input01, 1); + acc[2] = vmlaq_lane_f32(acc[2], filter[2], input2, 0); + // Store the accumulators back to acc_buffer + for (int i = 0; i < 3; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 12; + input_ptr += input_ptr_increment; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)input_depth; + (void)depth_multiplier; + + // Load the filters + float32x4_t filter[2]; + for (int i = 0; i < 2; i++) + { + filter[i] = vld1q_f32(filter_ptr + 4 * i); + } + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + // Load the inputs + const float input_val = *input_ptr; + input_ptr += input_ptr_increment; + // Load the accumulators from acc_buffer + float32x4_t acc[2]; + for (int i = 0; i < 2; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate + for (int i = 0; i < 2; i++) + { + acc[i] = vmlaq_n_f32(acc[i], filter[i], input_val); + } + // Store the accumulators back to acc_buffer + for (int i = 0; i < 2; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 8; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)input_depth; + (void)depth_multiplier; + + // Load the filters + float32x4_t filter_0 = vld1q_f32(filter_ptr + 4 * 0); + float32x4_t filter_1 = vld1q_f32(filter_ptr + 4 * 1); + float32x4_t filter_2 = vld1q_f32(filter_ptr + 4 * 2); + float32x4_t filter_3 = vld1q_f32(filter_ptr + 4 * 3); + float32x4_t filter_4 = vld1q_f32(filter_ptr + 4 * 4); + float32x4_t filter_5 = vld1q_f32(filter_ptr + 4 * 5); + float32x4_t filter_6 = vld1q_f32(filter_ptr + 4 * 6); + float32x4_t filter_7 = vld1q_f32(filter_ptr + 4 * 7); + + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + // Load the inputs + const float input_val = *input_ptr; + input_ptr += input_ptr_increment; + // Load the accumulators from acc_buffer + float32x4_t acc_0 = vld1q_f32(acc_buffer_ptr + 4 * 0); + float32x4_t acc_1 = vld1q_f32(acc_buffer_ptr + 4 * 1); + float32x4_t acc_2 = vld1q_f32(acc_buffer_ptr + 4 * 2); + float32x4_t acc_3 = vld1q_f32(acc_buffer_ptr + 4 * 3); + float32x4_t acc_4 = vld1q_f32(acc_buffer_ptr + 4 * 4); + float32x4_t acc_5 = vld1q_f32(acc_buffer_ptr + 4 * 5); + float32x4_t acc_6 = vld1q_f32(acc_buffer_ptr + 4 * 6); + float32x4_t acc_7 = vld1q_f32(acc_buffer_ptr + 4 * 7); + // Multiply-accumulate + acc_0 = vmlaq_n_f32(acc_0, filter_0, input_val); + acc_1 = vmlaq_n_f32(acc_1, filter_1, input_val); + acc_2 = vmlaq_n_f32(acc_2, filter_2, input_val); + acc_3 = vmlaq_n_f32(acc_3, filter_3, input_val); + acc_4 = vmlaq_n_f32(acc_4, filter_4, input_val); + acc_5 = vmlaq_n_f32(acc_5, filter_5, input_val); + acc_6 = vmlaq_n_f32(acc_6, filter_6, input_val); + acc_7 = vmlaq_n_f32(acc_7, filter_7, input_val); + // Store the accumulators back to acc_buffer + vst1q_f32(acc_buffer_ptr + 4 * 0, acc_0); + vst1q_f32(acc_buffer_ptr + 4 * 1, acc_1); + vst1q_f32(acc_buffer_ptr + 4 * 2, acc_2); + vst1q_f32(acc_buffer_ptr + 4 * 3, acc_3); + vst1q_f32(acc_buffer_ptr + 4 * 4, acc_4); + vst1q_f32(acc_buffer_ptr + 4 * 5, acc_5); + vst1q_f32(acc_buffer_ptr + 4 * 6, acc_6); + vst1q_f32(acc_buffer_ptr + 4 * 7, acc_7); + acc_buffer_ptr += 32; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)input_depth; + (void)depth_multiplier; + + // Load the filters + float32x4_t filter_0 = vld1q_f32(filter_ptr + 4 * 0); + float32x4_t filter_1 = vld1q_f32(filter_ptr + 4 * 1); + float32x4_t filter_2 = vld1q_f32(filter_ptr + 4 * 2); + float32x4_t filter_3 = vld1q_f32(filter_ptr + 4 * 3); + float32x4_t filter_4 = vld1q_f32(filter_ptr + 4 * 4); + + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + // Load the inputs + const float input_val = *input_ptr; + input_ptr += input_ptr_increment; + // Load the accumulators from acc_buffer + float32x4_t acc_0 = vld1q_f32(acc_buffer_ptr + 4 * 0); + float32x4_t acc_1 = vld1q_f32(acc_buffer_ptr + 4 * 1); + float32x4_t acc_2 = vld1q_f32(acc_buffer_ptr + 4 * 2); + float32x4_t acc_3 = vld1q_f32(acc_buffer_ptr + 4 * 3); + float32x4_t acc_4 = vld1q_f32(acc_buffer_ptr + 4 * 4); + // Multiply-accumulate + acc_0 = vmlaq_n_f32(acc_0, filter_0, input_val); + acc_1 = vmlaq_n_f32(acc_1, filter_1, input_val); + acc_2 = vmlaq_n_f32(acc_2, filter_2, input_val); + acc_3 = vmlaq_n_f32(acc_3, filter_3, input_val); + acc_4 = vmlaq_n_f32(acc_4, filter_4, input_val); + // Store the accumulators back to acc_buffer + vst1q_f32(acc_buffer_ptr + 4 * 0, acc_0); + vst1q_f32(acc_buffer_ptr + 4 * 1, acc_1); + vst1q_f32(acc_buffer_ptr + 4 * 2, acc_2); + vst1q_f32(acc_buffer_ptr + 4 * 3, acc_3); + vst1q_f32(acc_buffer_ptr + 4 * 4, acc_4); + acc_buffer_ptr += 20; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)depth_multiplier; + + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + const float *local_filter_ptr = filter_ptr; + const float *local_input_ptr = input_ptr; + for (int ic = 0; ic < input_depth; ic++) + { + // Load the filters + float32x4_t filter[4]; + for (int i = 0; i < 4; i++) + { + filter[i] = vld1q_f32(local_filter_ptr + 4 * i); + } + local_filter_ptr += 16; + // Load the inputs + const float input_val = *local_input_ptr++; + // Load the accumulators from acc_buffer + float32x4_t acc[4]; + for (int i = 0; i < 4; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate + for (int i = 0; i < 4; i++) + { + acc[i] = vmlaq_n_f32(acc[i], filter[i], input_val); + } + // Store the accumulators back to acc_buffer + for (int i = 0; i < 4; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 16; + } + input_ptr += input_ptr_increment; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)input_depth; + (void)depth_multiplier; + + // Load the filters + float32x4_t filter[2]; + for (int i = 0; i < 2; i++) + { + filter[i] = vld1q_f32(filter_ptr + 4 * i); + } + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + // Load the inputs + float32x4_t input[2]; + for (int i = 0; i < 2; i++) + { + input[i] = vld1q_f32(input_ptr + 4 * i); + } + // Load the accumulators from acc_buffer + float32x4_t acc[2]; + for (int i = 0; i < 2; i++) + { + acc[i] = vld1q_f32(acc_buffer_ptr + 4 * i); + } + // Multiply-accumulate + for (int i = 0; i < 2; i++) + { + acc[i] = vmlaq_f32(acc[i], input[i], filter[i]); + } + // Store the accumulators back to acc_buffer + for (int i = 0; i < 2; i++) + { + vst1q_f32(acc_buffer_ptr + 4 * i, acc[i]); + } + acc_buffer_ptr += 8; + input_ptr += input_ptr_increment; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)input_depth; + (void)depth_multiplier; + + float32x2_t filter = vld1_f32(filter_ptr); + float32x4_t filter_x4 = vcombine_f32(filter, filter); + int outp = 0; + + // Handle two output pixels at a time. + for (; outp <= num_output_pixels - 2; outp += 2) + { + // Load the inputs + float32x2_t input_1 = vld1_f32(input_ptr); + input_ptr += input_ptr_increment; + float32x2_t input_2 = vld1_f32(input_ptr); + input_ptr += input_ptr_increment; + float32x4_t input = vcombine_f32(input_1, input_2); + + // Load the accumulators from acc_buffer + float32x4_t acc = vld1q_f32(acc_buffer_ptr); + + // Multiply-accumulate + acc = vmlaq_f32(acc, input, filter_x4); + + // Store the accumulators back to acc_buffer + vst1q_f32(acc_buffer_ptr, acc); + acc_buffer_ptr += 4; + } + // Handle one output pixel at a time. + for (; outp < num_output_pixels; outp++) + { + // Load the inputs + float32x2_t input = vld1_f32(input_ptr); + input_ptr += input_ptr_increment; + + // Load the accumulators from acc_buffer + float32x2_t acc = vld1_f32(acc_buffer_ptr); + + // Multiply-accumulate + acc = vmla_f32(acc, input, filter); + + // Store the accumulators back to acc_buffer + vst1_f32(acc_buffer_ptr, acc); + acc_buffer_ptr += 2; + } + } +}; + +template <> struct FloatDepthwiseConvKernel +{ + static void Run(int num_output_pixels, int input_depth, int depth_multiplier, + const float *input_ptr, int input_ptr_increment, const float *filter_ptr, + float *acc_buffer_ptr) + { + (void)input_depth; + (void)depth_multiplier; + + float32x4_t filter = vld1q_f32(filter_ptr); + + // Handle one output pixel at a time. + for (int outp = 0; outp < num_output_pixels; outp++) + { + // Load the inputs + float32x4_t input = vld1q_f32(input_ptr); + // Load the accumulators from acc_buffer + float32x4_t acc = vld1q_f32(acc_buffer_ptr); + // Multiply-accumulate + acc = vmlaq_f32(acc, input, filter); + // Store the accumulators back to acc_buffer + vst1q_f32(acc_buffer_ptr, acc); + acc_buffer_ptr += 4; + input_ptr += input_ptr_increment; + } + } +}; +#endif + +// Accumulates the effect of one row of the filter, on a segment of one row +// of the output, accessing the corresponding one row of the input. +template +void FloatDepthwiseConvAccumRow(int stride, int dilation_factor, int input_depth, int input_width, + const float *input_data, int pad_width, int depth_multiplier, + int filter_width, const float *filter_data, int out_x_buffer_start, + int out_x_buffer_end, int output_depth, float *acc_buffer) +{ + // Sanity check parameters. This is important in particular to ensure + // that we keep the number of template instantiations minimal, so we don't + // increase binary size unnecessarily. + static_assert(kFixedDepthMultiplier || !kFixedInputDepth, ""); + static_assert(kFixedInputDepth || kAllowStrided, ""); + assert(stride == 1 || kAllowStrided); + if (kFixedInputDepth) + { + assert(input_depth == kFixedInputDepth); + } + if (kFixedDepthMultiplier) + { + assert(depth_multiplier == kFixedDepthMultiplier); + } + assert(output_depth == input_depth * depth_multiplier); + const int input_ptr_increment = stride * input_depth; + const float *filter_base_ptr = filter_data; + for (int filter_x = 0; filter_x < filter_width; ++filter_x) + { + // For the current (filter_x, filter_y) point in the filter, + // compute the boundaries of the corresponding output row segment. + int out_x_loop_start_unclamped = 0; + int out_x_loop_end_unclamped = 0; + if (kAllowStrided) + { + if (stride == 2) + { + out_x_loop_start_unclamped = (pad_width - dilation_factor * filter_x + 1) / 2; + out_x_loop_end_unclamped = (pad_width + input_width - dilation_factor * filter_x + 1) / 2; + } + else if (stride == 4) + { + out_x_loop_start_unclamped = (pad_width - dilation_factor * filter_x + 3) / 4; + out_x_loop_end_unclamped = (pad_width + input_width - dilation_factor * filter_x + 3) / 4; + } + else + { + out_x_loop_start_unclamped = (pad_width - dilation_factor * filter_x + stride - 1) / stride; + out_x_loop_end_unclamped = + (pad_width + input_width - dilation_factor * filter_x + stride - 1) / stride; + } + } + else + { + out_x_loop_start_unclamped = pad_width - dilation_factor * filter_x; + out_x_loop_end_unclamped = pad_width + input_width - dilation_factor * filter_x; + } + // The kernel will have to iterate on the segment of the + // output row that starts at out_x_loop_start and out_x_loop_end. + const int out_x_loop_start = std::max(out_x_buffer_start, out_x_loop_start_unclamped); + const int out_x_loop_end = std::min(out_x_buffer_end, out_x_loop_end_unclamped); + + float *acc_buffer_ptr = acc_buffer + (out_x_loop_start - out_x_buffer_start) * output_depth; + const int in_x_origin = (out_x_loop_start * stride) - pad_width + dilation_factor * filter_x; + const float *input_ptr = input_data + in_x_origin * input_depth; + const int num_output_pixels = out_x_loop_end - out_x_loop_start; + FloatDepthwiseConvKernel::Run( + num_output_pixels, input_depth, depth_multiplier, input_ptr, input_ptr_increment, + filter_base_ptr, acc_buffer_ptr); + filter_base_ptr += output_depth; + } +} + +// generic fallback of FloatDepthwiseConvAccumRow, portable, non-templatized. +inline void FloatDepthwiseConvAccumRowGeneric(int stride, int dilation_factor, int input_depth, + int input_width, const float *input_data, + int pad_width, int depth_multiplier, int filter_width, + const float *filter_data, int out_x_buffer_start, + int out_x_buffer_end, int output_depth, + float *acc_buffer) +{ + const float *filter_base_ptr = filter_data; + for (int filter_x = 0; filter_x < filter_width; ++filter_x) + { + const int out_x_loop_start = + std::max(out_x_buffer_start, (pad_width - dilation_factor * filter_x + stride - 1) / stride); + const int out_x_loop_end = + std::min(out_x_buffer_end, + (pad_width + input_width - dilation_factor * filter_x + stride - 1) / stride); + + float *acc_buffer_ptr = acc_buffer + (out_x_loop_start - out_x_buffer_start) * output_depth; + const int in_x_origin = (out_x_loop_start * stride) - pad_width + dilation_factor * filter_x; + const float *input_ptr = input_data + in_x_origin * input_depth; + const int input_ptr_increment = (stride - 1) * input_depth; + for (int out_x = out_x_loop_start; out_x < out_x_loop_end; out_x++) + { + const float *filter_ptr = filter_base_ptr; + for (int ic = 0; ic < input_depth; ++ic) + { + const float input_val = *input_ptr++; + for (int m = 0; m < depth_multiplier; m++) + { + const float filter_val = *filter_ptr++; + *acc_buffer_ptr++ += filter_val * input_val; + } + } + input_ptr += input_ptr_increment; + } + filter_base_ptr += output_depth; + } +} + +// Initializes the accumulator buffer with bias values. +inline void DepthwiseConvInitAccBuffer(int num_output_pixels, int output_depth, + const float *bias_data, float *acc_buffer) +{ + // TODO(benoitjacob): This might need optimized specializations + // for small output_depth values, if that ever becomes an important + // case (like it was for some quantized DepthwiseConv cases). + for (int i = 0; i < num_output_pixels; i++) + { + memcpy(acc_buffer + i * output_depth, bias_data, sizeof(acc_buffer[0]) * output_depth); + } +} + +// DepthwiseConv can run with multi threads on the dim specified by thread_dim. +// Each thread processes output elements on dim, thread_dim, in the range of +// [thread_start, thread_end). +// For example, assume thread_start = 2, thread_end = 6, and thread_dim = 1, it +// means that it will calculate DepthwiseConv for output_data[:, 2:5, :, :]. +inline void DepthwiseConvImpl(const DepthwiseConvParams ¶ms, const Shape &input_shape, + const float *input_data, const Shape &filter_shape, + const float *filter_data, const Shape &bias_shape, + const float *bias_data, const Shape &output_shape, float *output_data, + int thread_start, int thread_end, int thread_dim) +{ + UNUSED_RELEASE(bias_shape); + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const int depth_multiplier = params.depth_multiplier; + const float output_activation_min = params.float_activation_min; + const float output_activation_max = params.float_activation_max; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + assert(input_shape.DimensionsCount() == 4); + assert(filter_shape.DimensionsCount() == 4); + assert(output_shape.DimensionsCount() == 4); + assert(thread_dim == 0 || thread_dim == 1); + + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int input_depth = input_shape.Dims(3); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + assert(output_depth == input_depth * depth_multiplier); + assert(bias_shape.FlatSize() == output_depth); + + static const int kAccBufferMaxSize = 4832; + float acc_buffer[kAccBufferMaxSize]; + assert(kAccBufferMaxSize >= output_depth); + const int kOutputPixelsInAccBuffer = kAccBufferMaxSize / output_depth; + const int kAccBufferActualSize = kOutputPixelsInAccBuffer * output_depth; + assert(kOutputPixelsInAccBuffer * output_depth <= kAccBufferActualSize); + assert(kAccBufferActualSize <= kAccBufferMaxSize); + assert(kOutputPixelsInAccBuffer >= 1); + + UNUSED_RELEASE(kAccBufferActualSize); + + // row_accum_func will point to the core accumulation function to be used + // for this DepthwiseConv op. + using row_accum_func_t = decltype(&FloatDepthwiseConvAccumRowGeneric); + row_accum_func_t row_accum_func = nullptr; + +#define TFMINI_USE_DEPTHWISECONV_KERNEL(ALLOW_STRIDED, FIXED_INPUT_DEPTH, FIXED_DEPTH_MULTIPLIER) \ + if (!row_accum_func && (stride_width == 1 || ALLOW_STRIDED) && \ + (input_depth == FIXED_INPUT_DEPTH || FIXED_INPUT_DEPTH == 0) && \ + depth_multiplier == FIXED_DEPTH_MULTIPLIER) \ + { \ + row_accum_func = \ + FloatDepthwiseConvAccumRow; \ + } + +#ifdef USE_NEON + // We go over our list of kernels by decreasing order of preference + // for the cases where multiple kernels could apply. + + // Start with the fastest kernels: AllowStrided=false, fixed input depth. + + TFMINI_USE_DEPTHWISECONV_KERNEL(false, 8, 1) + TFMINI_USE_DEPTHWISECONV_KERNEL(false, 2, 1) + + // Next come the strided kernels: AllowStrided=true, fixed input depth. + // They are a bit less efficient, but allow stride!=1. + + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 8, 1) + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 1, 8) + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 1, 20) + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 1, 32) + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 2, 1) + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 3, 2) + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 3, 4) + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 4, 1) + + // Finally, the kernels allowing a variable input depth, + // these are the least efficient but most general kernels. + + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 0, 1) + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 0, 2) + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 0, 8) + TFMINI_USE_DEPTHWISECONV_KERNEL(true, 0, 16) + +#endif // USE_NEON + +#undef TFMINI_USE_DEPTHWISECONV_KERNEL + + // No matching fast kernel found, use slow fallback. + if (!row_accum_func) + { + row_accum_func = FloatDepthwiseConvAccumRowGeneric; + } + + const int input_height_stride = input_shape.Dims(3) * input_shape.Dims(2); + const int input_batch_stride = input_height_stride * input_shape.Dims(1); + const int filter_height_stride = filter_shape.Dims(3) * filter_shape.Dims(2); + + // Now that we have determined row_accum_func, we can start work. + int batch_start = 0; + int batch_end = batches; + int row_start = 0; + int row_end = output_height; + int output_ptr_offset = 0; + + switch (thread_dim) + { + case 0: + // Multithread along with the batch axis + assert(thread_start >= 0); + assert(thread_end <= batches); + batch_start = thread_start; + batch_end = thread_end; + output_ptr_offset = batch_start * FlatSizeSkipDim(output_shape, 0); + break; + case 1: + // Multithread along with the row axis + assert(thread_start >= 0); + assert(thread_end <= output_height); + row_start = thread_start; + row_end = thread_end; + output_ptr_offset = row_start * output_width * output_depth; + break; + } + + float *output_ptr = output_data + output_ptr_offset; + int batch_step = (output_height + row_start - row_end) * output_width * output_depth; + + for (int b = batch_start; b < batch_end; ++b) + { + for (int out_y = row_start; out_y < row_end; ++out_y) + { + const int in_y_origin = (out_y * stride_height) - pad_height; + const int filter_y_start = + std::max(0, (-in_y_origin + dilation_height_factor - 1) / dilation_height_factor); + const int filter_y_end = + std::min(filter_height, (input_height - in_y_origin + dilation_height_factor - 1) / + dilation_height_factor); + for (int out_x_buffer_start = 0; out_x_buffer_start < output_width; + out_x_buffer_start += kOutputPixelsInAccBuffer) + { + const int out_x_buffer_end = + std::min(output_width, out_x_buffer_start + kOutputPixelsInAccBuffer); + // We call a 'pixel' a group of activation that share all but the + // 'depth'/'channel' coordinate. num_output_pixels is the number of + // output pixels that we will accumulate in this loop iteration. + const int num_output_pixels = out_x_buffer_end - out_x_buffer_start; + // Initialize our local accumulator with the bias values, so we don't + // have to add them later. + DepthwiseConvInitAccBuffer(num_output_pixels, output_depth, bias_data, acc_buffer); + // Accumulation loop. Most of the time should be spent in here. + for (int filter_y = filter_y_start; filter_y < filter_y_end; ++filter_y) + { + const int in_y = in_y_origin + dilation_height_factor * filter_y; + row_accum_func(stride_width, dilation_width_factor, input_depth, input_width, + input_data + in_y * input_height_stride + b * input_batch_stride, + pad_width, depth_multiplier, filter_width, + filter_data + filter_y * filter_height_stride, out_x_buffer_start, + out_x_buffer_end, output_depth, acc_buffer); + } + // Finished accumulating. Now store to destination. + const int num_output_values = output_depth * num_output_pixels; + int i = 0; +// TODO(benoitjacob) optimized code goes here +#ifdef USE_NEON + // Handle 16 values at a time + for (; i <= num_output_values - 16; i += 16) + { + float32x4_t acc[4]; + for (int k = 0; k < 4; k++) + { + acc[k] = vld1q_f32(acc_buffer + i + 4 * k); + } + for (int k = 0; k < 4; k++) + { + acc[k] = vmaxq_f32(vdupq_n_f32(output_activation_min), + vminq_f32(vdupq_n_f32(output_activation_max), acc[k])); + } + for (int k = 0; k < 4; k++) + { + vst1q_f32(output_ptr + 4 * k, acc[k]); + } + output_ptr += 16; + } + // Handle 4 values at a time + for (; i <= num_output_values - 4; i += 4) + { + float32x4_t acc = vld1q_f32(acc_buffer + i); + + acc = vmaxq_f32(vdupq_n_f32(output_activation_min), + vminq_f32(vdupq_n_f32(output_activation_max), acc)); + + vst1q_f32(output_ptr, acc); + output_ptr += 4; + } +#endif + // Handle leftover values, one by one. This is very slow. + for (; i < num_output_values; i++) + { + float acc = acc_buffer[i]; + acc = std::max(output_activation_min, std::min(output_activation_max, acc)); + + *output_ptr++ = acc; + } + } + } + output_ptr += batch_step; + } +} + +} // nnfw +} // cker +} // optimized + +#endif diff --git a/compute/cker/include/cker/operation/optimized/DepthwiseConvUint8.h b/compute/cker/include/cker/operation/optimized/DepthwiseConvUint8.h index d383b12..5ca56fd 100644 --- a/compute/cker/include/cker/operation/optimized/DepthwiseConvUint8.h +++ b/compute/cker/include/cker/operation/optimized/DepthwiseConvUint8.h @@ -32,6 +32,8 @@ namespace cker { namespace optimized { +namespace depthwise_conv +{ // Implementation of quantized DepthwiseConv @@ -44,8 +46,8 @@ struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -57,7 +59,7 @@ template <> struct QuantizedDepthwiseConvKernel for (int i = 0; i < 2; i++) { filter[i] = - vaddq_s16(vreinterpretq_s16_u16(vmovl_u8(filter_u8.val[i])), vdupq_n_s16(filter_offset)); + vaddq_s16(vreinterpretq_s16_u16(vmovl_u8(filter_u8.val[i])), vdupq_n_s16(filter_offset)); } // Handle one output pixel at a time. for (int outp = 0; outp < num_output_pixels; outp++) @@ -80,9 +82,9 @@ template <> struct QuantizedDepthwiseConvKernel for (int i = 0; i < 2; i++) { acc[0].val[i] = - vmlal_s16(acc[0].val[i], vget_low_s16(filter[i]), vget_low_s16(input_dup2.val[i])); + vmlal_s16(acc[0].val[i], vget_low_s16(filter[i]), vget_low_s16(input_dup2.val[i])); acc[1].val[i] = - vmlal_s16(acc[1].val[i], vget_high_s16(filter[i]), vget_high_s16(input_dup2.val[i])); + vmlal_s16(acc[1].val[i], vget_high_s16(filter[i]), vget_high_s16(input_dup2.val[i])); } // Store the accumulators back to acc_buffer for (int i = 0; i < 2; i++) @@ -98,8 +100,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -174,8 +176,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -206,9 +208,9 @@ template <> struct QuantizedDepthwiseConvKernel for (int i = 0; i < 2; i++) { acc[2 * i + 0] = - vmlal_s16(acc[2 * i + 0], vget_low_s16(filter), vget_low_s16(input_dup2.val[i])); + vmlal_s16(acc[2 * i + 0], vget_low_s16(filter), vget_low_s16(input_dup2.val[i])); acc[2 * i + 1] = - vmlal_s16(acc[2 * i + 1], vget_high_s16(filter), vget_high_s16(input_dup2.val[i])); + vmlal_s16(acc[2 * i + 1], vget_high_s16(filter), vget_high_s16(input_dup2.val[i])); } // Store the accumulators back to acc_buffer for (int i = 0; i < 4; i++) @@ -253,8 +255,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -338,8 +340,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -409,8 +411,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -534,8 +536,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -600,8 +602,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -703,8 +705,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -778,8 +780,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -864,8 +866,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -873,7 +875,7 @@ template <> struct QuantizedDepthwiseConvKernel // We will do that by register-level table-look-up using VTBL instructions. // Here we prepare the registers containing the table-lookup indices. static const uint8_t dup3_indices_array[3][8] = { - {0, 0, 0, 1, 1, 1, 2, 2}, {2, 3, 3, 3, 4, 4, 4, 5}, {5, 5, 6, 6, 6, 7, 7, 7}}; + {0, 0, 0, 1, 1, 1, 2, 2}, {2, 3, 3, 3, 4, 4, 4, 5}, {5, 5, 6, 6, 6, 7, 7, 7}}; uint8x8_t dup3_indices[3]; for (int i = 0; i < 3; i++) { @@ -928,9 +930,9 @@ template <> struct QuantizedDepthwiseConvKernel for (int j = 0; j < 3; j++) { acc[0].val[j] = - vmlal_s16(acc[0].val[j], vget_low_s16(input_dup3[j]), vget_low_s16(filter[j])); + vmlal_s16(acc[0].val[j], vget_low_s16(input_dup3[j]), vget_low_s16(filter[j])); acc[1].val[j] = - vmlal_s16(acc[1].val[j], vget_high_s16(input_dup3[j]), vget_high_s16(filter[j])); + vmlal_s16(acc[1].val[j], vget_high_s16(input_dup3[j]), vget_high_s16(filter[j])); } // Store the accumulators back to acc_buffer for (int i = 0; i < 2; i++) @@ -944,10 +946,10 @@ template <> struct QuantizedDepthwiseConvKernel // Handle one input channel at a time. for (; ic < input_depth; ic++) { - const uint16_t input_val = *local_input_ptr++ + input_offset; + const int16_t input_val = *local_input_ptr++ + input_offset; for (int i = 0; i < 3; i++) { - const uint16_t filter_val = local_filter_ptr[i] + filter_offset; + const int16_t filter_val = local_filter_ptr[i] + filter_offset; *acc_buffer_ptr++ += static_cast(filter_val) * input_val; } local_filter_ptr += 3; @@ -960,8 +962,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -1002,9 +1004,9 @@ template <> struct QuantizedDepthwiseConvKernel for (int j = 0; j < 2; j++) { acc[0].val[j] = - vmlal_s16(acc[0].val[j], vget_low_s16(filter[j]), vget_low_s16(input_dup2.val[j])); + vmlal_s16(acc[0].val[j], vget_low_s16(filter[j]), vget_low_s16(input_dup2.val[j])); acc[1].val[j] = - vmlal_s16(acc[1].val[j], vget_high_s16(filter[j]), vget_high_s16(input_dup2.val[j])); + vmlal_s16(acc[1].val[j], vget_high_s16(filter[j]), vget_high_s16(input_dup2.val[j])); } // Store the accumulators back to acc_buffer. for (int i = 0; i < 2; i++) @@ -1018,10 +1020,10 @@ template <> struct QuantizedDepthwiseConvKernel for (; ic < input_depth; ic++) { // Load the inputs. - const uint16_t input_val = *local_input_ptr++ + input_offset; + const int16_t input_val = *local_input_ptr++ + input_offset; for (int i = 0; i < 2; i++) { - const uint16_t filter_val = local_filter_ptr[i] + filter_offset; + const int16_t filter_val = local_filter_ptr[i] + filter_offset; *acc_buffer_ptr++ += static_cast(filter_val) * input_val; } local_filter_ptr += 2; @@ -1034,8 +1036,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -1112,8 +1114,8 @@ template <> struct QuantizedDepthwiseConvKernel // Handle one input channel at a time. for (; ic < input_depth; ic++) { - const uint16_t input_val = *local_input_ptr++ + input_offset; - const uint16_t filter_val = *local_filter_ptr++ + filter_offset; + const int16_t input_val = *local_input_ptr++ + input_offset; + const int16_t filter_val = *local_filter_ptr++ + filter_offset; *acc_buffer_ptr++ += static_cast(filter_val) * input_val; } input_ptr += input_ptr_increment; @@ -1124,8 +1126,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -1174,7 +1176,7 @@ template <> struct QuantizedDepthwiseConvKernel { acc[2 * i + 0] = vmlal_s16(acc[2 * i + 0], vget_low_s16(input[i]), vget_low_s16(filter[i])); acc[2 * i + 1] = - vmlal_s16(acc[2 * i + 1], vget_high_s16(input[i]), vget_high_s16(filter[i])); + vmlal_s16(acc[2 * i + 1], vget_high_s16(input[i]), vget_high_s16(filter[i])); } // Store the accumulators back to acc_buffer for (int i = 0; i < 4; i++) @@ -1189,8 +1191,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -1228,8 +1230,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -1253,7 +1255,7 @@ template <> struct QuantizedDepthwiseConvKernel { uint8_t input_u8 = *input_ptr; input_ptr += input_ptr_increment; - uint16_t input = static_cast(input_u8 + input_offset); + int16_t input = static_cast(input_u8) + input_offset; // Load the accumulators from acc_buffer int32x4_t acc[4]; for (int i = 0; i < 4; i++) @@ -1279,8 +1281,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -1302,7 +1304,7 @@ template <> struct QuantizedDepthwiseConvKernel { uint8_t input_u8 = *input_ptr; input_ptr += input_ptr_increment; - uint16_t input = static_cast(input_u8 + input_offset); + int16_t input = static_cast(input_u8) + input_offset; // Load the accumulators from acc_buffer int32x4_t acc_0 = vld1q_s32(acc_buffer_ptr + 4 * 0); int32x4_t acc_1 = vld1q_s32(acc_buffer_ptr + 4 * 1); @@ -1338,8 +1340,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -1363,7 +1365,7 @@ template <> struct QuantizedDepthwiseConvKernel { uint8_t input_u8 = *input_ptr; input_ptr += input_ptr_increment; - uint16_t input = static_cast(input_u8 + input_offset); + int16_t input = static_cast(input_u8) + input_offset; // Load the accumulators from acc_buffer int32x4_t acc_0 = vld1q_s32(acc_buffer_ptr + 4 * 0); int32x4_t acc_1 = vld1q_s32(acc_buffer_ptr + 4 * 1); @@ -1390,21 +1392,21 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; // Load the filters, add filter_offset. const uint8x8_t filter_u8 = vld1_u8(filter_ptr); const int16x8_t filter = - vaddq_s16(vreinterpretq_s16_u16(vmovl_u8(filter_u8)), vdupq_n_s16(filter_offset)); + vaddq_s16(vreinterpretq_s16_u16(vmovl_u8(filter_u8)), vdupq_n_s16(filter_offset)); // Handle one output pixel at a time. for (int outp = 0; outp < num_output_pixels; outp++) { uint8_t input_u8 = *input_ptr; input_ptr += input_ptr_increment; - uint16_t input = static_cast(input_u8 + input_offset); + int16_t input = static_cast(input_u8) + input_offset; // Load the accumulators from acc_buffer int32x4_t acc[2]; for (int i = 0; i < 2; i++) @@ -1427,8 +1429,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -1455,7 +1457,7 @@ template <> struct QuantizedDepthwiseConvKernel input_u16 = vset_lane_u16((reinterpret_cast(input_ptr))[0], input_u16, 1); input_ptr += input_ptr_increment; const int16x4_t input_s16 = - vreinterpret_s16_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_u16(input_u16)))); + vreinterpret_s16_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_u16(input_u16)))); const int16x4_t input = vadd_s16(input_s16, vdup_n_s16(input_offset)); // Multiply-accumulate. @@ -1490,8 +1492,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -1555,8 +1557,8 @@ template <> struct QuantizedDepthwiseConvKernel template <> struct QuantizedDepthwiseConvKernel { static void Run(int num_output_pixels, int input_depth, int depth_multiplier, - const uint8_t *input_ptr, uint16_t input_offset, int input_ptr_increment, - const uint8_t *filter_ptr, uint16_t filter_offset, int32_t *acc_buffer_ptr) + const uint8_t *input_ptr, int16_t input_offset, int input_ptr_increment, + const uint8_t *filter_ptr, int16_t filter_offset, int32_t *acc_buffer_ptr) { (void)input_depth; (void)depth_multiplier; @@ -1652,9 +1654,9 @@ void QuantizedDepthwiseConvAccumRow(int stride, int dilation_factor, int input_d else { out_x_loop_start_unclampled = - (pad_width - dilation_factor * filter_x + stride - 1) / stride; + (pad_width - dilation_factor * filter_x + stride - 1) / stride; out_x_loop_end_unclampled = - (pad_width + input_width - dilation_factor * filter_x + stride - 1) / stride; + (pad_width + input_width - dilation_factor * filter_x + stride - 1) / stride; } } else @@ -1672,8 +1674,8 @@ void QuantizedDepthwiseConvAccumRow(int stride, int dilation_factor, int input_d const uint8_t *input_ptr = input_data + in_x_origin * input_depth; const int num_output_pixels = out_x_loop_end - out_x_loop_start; QuantizedDepthwiseConvKernel::Run( - num_output_pixels, input_depth, depth_multiplier, input_ptr, input_offset, - input_ptr_increment, filter_base_ptr, filter_offset, acc_buffer_ptr); + num_output_pixels, input_depth, depth_multiplier, input_ptr, input_offset, + input_ptr_increment, filter_base_ptr, filter_offset, acc_buffer_ptr); filter_base_ptr += output_depth; } } @@ -1690,11 +1692,11 @@ inline void QuantizedDepthwiseConvAccumRowGeneric(int stride, int dilation_facto const uint8_t *filter_base_ptr = filter_data; for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - const int out_x_loop_start = std::max( - out_x_buffer_start, (pad_width - dilation_factor * filter_x + stride - 1) / stride); + const int out_x_loop_start = + std::max(out_x_buffer_start, (pad_width - dilation_factor * filter_x + stride - 1) / stride); const int out_x_loop_end = - std::min(out_x_buffer_end, - (pad_width + input_width - dilation_factor * filter_x + stride - 1) / stride); + std::min(out_x_buffer_end, + (pad_width + input_width - dilation_factor * filter_x + stride - 1) / stride); int32_t *acc_buffer_ptr = acc_buffer + (out_x_loop_start - out_x_buffer_start) * output_depth; const int in_x_origin = (out_x_loop_start * stride) - pad_width + dilation_factor * filter_x; @@ -1813,7 +1815,8 @@ inline void DepthwiseConvGeneral(const DepthwiseConvParams ¶ms, const Shape const uint8_t *input_data, const Shape &filter_shape, const uint8_t *filter_data, const Shape &bias_shape, const int32_t *bias_data, const Shape &output_shape, - uint8_t *output_data) + uint8_t *output_data, int thread_start, int thread_end, + int thread_dim) { (void)bias_shape; const int stride_width = params.stride_width; @@ -1852,6 +1855,8 @@ inline void DepthwiseConvGeneral(const DepthwiseConvParams ¶ms, const Shape assert(kOutputPixelsInAccBuffer * output_depth <= kAccBufferActualSize); assert(kAccBufferActualSize <= kAccBufferMaxSize); assert(kOutputPixelsInAccBuffer >= 1); + assert(thread_dim == 0 || thread_dim == 1); + UNUSED_RELEASE(kAccBufferActualSize); // row_accum_func will point to the core accumulation function to be used @@ -1865,7 +1870,7 @@ inline void DepthwiseConvGeneral(const DepthwiseConvParams ¶ms, const Shape depth_multiplier == FIXED_DEPTH_MULTIPLIER) \ { \ row_accum_func = \ - QuantizedDepthwiseConvAccumRow; \ + QuantizedDepthwiseConvAccumRow; \ } #ifdef USE_NEON @@ -1919,22 +1924,49 @@ inline void DepthwiseConvGeneral(const DepthwiseConvParams ¶ms, const Shape const int filter_height_stride = filter_shape.Dims(3) * filter_shape.Dims(2); // Now that we have determined row_accum_func, we can start work. - uint8_t *output_ptr = output_data; - for (int b = 0; b < batches; ++b) + int batch_start = 0; + int batch_end = batches; + int row_start = 0; + int row_end = output_height; + int output_ptr_offset = 0; + + switch (thread_dim) + { + case 0: + // Multithread along with the batch axis + assert(thread_start >= 0); + assert(thread_end <= batches); + batch_start = thread_start; + batch_end = thread_end; + output_ptr_offset = batch_start * FlatSizeSkipDim(output_shape, 0); + break; + case 1: + // Multithread along with the row axis + assert(thread_start >= 0); + assert(thread_end <= output_height); + row_start = thread_start; + row_end = thread_end; + output_ptr_offset = row_start * output_width * output_depth; + break; + } + + uint8_t *output_ptr = output_data + output_ptr_offset; + int batch_step = (output_height + row_start - row_end) * output_width * output_depth; + for (int b = batch_start; b < batch_end; ++b) { - for (int out_y = 0; out_y < output_height; ++out_y) + for (int out_y = row_start; out_y < row_end; ++out_y) { const int in_y_origin = (out_y * stride_height) - pad_height; const int filter_y_start = - std::max(0, (-in_y_origin + dilation_height_factor - 1) / dilation_height_factor); + std::max(0, (-in_y_origin + dilation_height_factor - 1) / dilation_height_factor); const int filter_y_end = - std::min(filter_height, (input_height - in_y_origin + dilation_height_factor - 1) / - dilation_height_factor); + std::min(filter_height, (input_height - in_y_origin + dilation_height_factor - 1) / + dilation_height_factor); for (int out_x_buffer_start = 0; out_x_buffer_start < output_width; out_x_buffer_start += kOutputPixelsInAccBuffer) { const int out_x_buffer_end = - std::min(output_width, out_x_buffer_start + kOutputPixelsInAccBuffer); + std::min(output_width, out_x_buffer_start + kOutputPixelsInAccBuffer); // We call a 'pixel' a group of activation that share all but the // 'depth'/'channel' coordinate. num_output_pixels is the number of // output pixels that we will accumulate in this loop iteration. @@ -1952,7 +1984,7 @@ inline void DepthwiseConvGeneral(const DepthwiseConvParams ¶ms, const Shape filter_data + filter_y * filter_height_stride, filter_offset, out_x_buffer_start, out_x_buffer_end, output_depth, acc_buffer); } - // Finished accumulating int32 values. Now need to convert them to + // Finished accumulating int32_t values. Now need to convert them to // the final 8bit form and store them. const int num_output_values = output_depth * num_output_pixels; int i = 0; @@ -2113,9 +2145,111 @@ inline void DepthwiseConvGeneral(const DepthwiseConvParams ¶ms, const Shape } } } + output_ptr += batch_step; } } +} // namespace depthwise_conv + +// template +inline void DepthwiseConvWithRounding(const DepthwiseConvParams ¶ms, const Shape &input_shape, + const uint8_t *input_data, const Shape &filter_shape, + const uint8_t *filter_data, const Shape &bias_shape, + const int32_t *bias_data, const Shape &output_shape, + uint8_t *output_data, int thread_start, int thread_end, + int thread_dim) +{ + const int depth_multiplier = params.depth_multiplier; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + assert(dilation_width_factor >= 1); + assert(dilation_height_factor >= 1); + assert(input_shape.DimensionsCount() == 4); + assert(filter_shape.DimensionsCount() == 4); + assert(output_shape.DimensionsCount() == 4); + assert(output_activation_min <= output_activation_max); + const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); + const int input_depth = input_shape.Dims(3); + assert(output_depth == input_depth * depth_multiplier); + assert(bias_shape.FlatSize() == output_depth); + + UNUSED_RELEASE(depth_multiplier); + UNUSED_RELEASE(output_activation_min); + UNUSED_RELEASE(output_activation_max); + UNUSED_RELEASE(dilation_width_factor); + UNUSED_RELEASE(dilation_height_factor); + UNUSED_RELEASE(output_depth); + UNUSED_RELEASE(input_depth); + +// Enable for arm64 except for the Nvidia Linux 4 Tegra (L4T) running on +// Jetson TX-2. This compiler does not support the offsetof() macro. +#if defined(__aarch64__) && !defined(GOOGLE_L4T) +// TODO Use below codes +// // Dispatch to dot-product 3x3 kernels when supported. +// +// ruy::Context *ruy_context = cpu_backend_context->ruy_context(); +// const bool has_dot_product_instructions = +// ruy_context != nullptr && +// (ruy_context->GetRuntimeEnabledPaths() & ruy::Path::kNeonDotprod) != ruy::Path::kNone; +// if (has_dot_product_instructions) +// { +// using optimized_ops::depthwise_conv::DotProduct3x3KernelType; +// DotProduct3x3KernelType kernel_type = +// optimized_ops::depthwise_conv::CategorizeDotProductKernel( +// input_shape, filter_shape, params); +// if (kernel_type != DotProduct3x3KernelType::kNone) +// { +// optimized_ops::depthwise_conv::DepthwiseConvDotProduct3x3< +// DepthwiseConvImplementation::kUseNeon3x3DotProduct>(params, input_shape, input_data, +// filter_shape, filter_data, +// bias_shape, +// bias_data, output_shape, +// output_data); +// return; +// } +// } +// +// // Dispatch to non-dot-product 3x3 kernels when supported. +// +// const int stride_width = params.stride_width; +// const int stride_height = params.stride_height; +// const int pad_width = params.padding_values.width; +// const int pad_height = params.padding_values.height; +// const int output_shift = params.output_shift; +// +// // Call kernel optimized for depthwise convolutions using 3x3 filters if +// // parameters are supported. +// if (depthwise_conv::Fast3x3FilterKernelSupported(input_shape, filter_shape, stride_width, +// stride_height, dilation_width_factor, +// dilation_height_factor, pad_width, pad_height, +// depth_multiplier, output_shape, output_shift)) +// { +// depthwise_conv::DepthwiseConv3x3Filter( +// params, input_shape, input_data, filter_shape, filter_data, bias_shape, bias_data, +// output_shape, output_data, thread_start, thread_end, thread_dim); +// return; +// } +#endif + + depthwise_conv::DepthwiseConvGeneral(params, input_shape, input_data, filter_shape, filter_data, + bias_shape, bias_data, output_shape, output_data, + thread_start, thread_end, thread_dim); +} + +inline void DepthwiseConvImpl(const DepthwiseConvParams ¶ms, const Shape &input_shape, + const uint8_t *input_data, const Shape &filter_shape, + const uint8_t *filter_data, const Shape &bias_shape, + const int32_t *bias_data, const Shape &output_shape, + uint8_t *output_data, int thread_start, int thread_end, + int thread_dim) +{ + return DepthwiseConvWithRounding(params, input_shape, input_data, filter_shape, filter_data, + bias_shape, bias_data, output_shape, output_data, thread_start, + thread_end, thread_dim); +} + } // namespace optimized } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/operation/optimized/OptimizedUtils.h b/compute/cker/include/cker/operation/optimized/OptimizedUtils.h index ae1f9e7..f5edc94 100644 --- a/compute/cker/include/cker/operation/optimized/OptimizedUtils.h +++ b/compute/cker/include/cker/operation/optimized/OptimizedUtils.h @@ -111,7 +111,7 @@ inline void ExtractPatchIntoBufferColumn(const Shape &input_shape, int w, int h, { const int bottom_row_elements = (bottom_padding * kwidth * in_depth); const int bottom_start = - output_row_offset + ((top_padding + (ih_end - ih_start)) * kwidth * in_depth); + output_row_offset + ((top_padding + (ih_end - ih_start)) * kwidth * in_depth); memset(conv_buffer_data + bottom_start, zero_byte, (bottom_row_elements * sizeof(T))); } } @@ -159,7 +159,7 @@ void DilatedIm2col(const ConvParams ¶ms, const Shape &input_shape, const T * for (int batch = 0; batch < batches; ++batch) { const T zero_byte = - zero_bytes_len > 1 ? static_cast(zero_bytes[batch]) : static_cast(zero_bytes[0]); + zero_bytes_len > 1 ? static_cast(zero_bytes[batch]) : static_cast(zero_bytes[0]); for (int out_y = 0; out_y < output_height; ++out_y) { for (int out_x = 0; out_x < output_width; ++out_x) diff --git a/compute/cker/include/cker/operation/reference/BatchMatMul.h b/compute/cker/include/cker/operation/reference/BatchMatMul.h index e8ffd40..1b3020d 100644 --- a/compute/cker/include/cker/operation/reference/BatchMatMul.h +++ b/compute/cker/include/cker/operation/reference/BatchMatMul.h @@ -87,9 +87,8 @@ inline void BatchMatMul(const Shape &lhs_shape, const float *lhs_data, const Sha { const float *lhs_ptr2 = lhs_ptr1 + b2 * lhs_ext2; const float *rhs_ptr2 = rhs_ptr1 + b2 * rhs_ext2; - float *out_ptr = - output_data + - ((b0 * batch_dim1 * batch_dim2) + b1 * batch_dim2 + b2) * lhs_rows * rhs_cols; + float *out_ptr = output_data + ((b0 * batch_dim1 * batch_dim2) + b1 * batch_dim2 + b2) * + lhs_rows * rhs_cols; for (int j = 0; j < rhs_cols; ++j) { for (int i = 0; i < lhs_rows; ++i) diff --git a/compute/cker/include/cker/operation/reference/BinaryArithmeticOps.h b/compute/cker/include/cker/operation/reference/BinaryArithmeticOps.h index f7e3924..93cb21e 100644 --- a/compute/cker/include/cker/operation/reference/BinaryArithmeticOps.h +++ b/compute/cker/include/cker/operation/reference/BinaryArithmeticOps.h @@ -56,17 +56,16 @@ inline void BinaryArithmeticOp(const BinaryArithmeticOpParam ¶ms, const Shap const int size = MatchingElementsSize(input1_shape, input2_shape, output_shape); for (int i = 0; i < size; i++) { - output_data[i] = - ActivationFunctionWithMinMax(fn(input1_data[i], input2_data[i]), - params.float_activation_min, params.float_activation_max); + output_data[i] = ActivationFunctionWithMinMax( + fn(input1_data[i], input2_data[i]), params.float_activation_min, params.float_activation_max); } } template inline void BroadcastBinaryArithmeticOpSlowQuant8( - const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, const T *input1_data, - const Shape &input2_shape, const T *input2_data, const Shape &output_shape, T *output_data, - const std::function &fn) + const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, const T *input1_data, + const Shape &input2_shape, const T *input2_data, const Shape &output_shape, T *output_data, + const std::function &fn) { NdArrayDesc<4> desc1; NdArrayDesc<4> desc2; @@ -100,10 +99,10 @@ inline void BroadcastBinaryArithmeticOpSlowQuant8( for (int c = 0; c < extended_output_shape.Dims(3); ++c) { output_data[Offset(extended_output_shape, b, y, x, c)] = - ActivationFunctionWithMinMax( - fn(params, input1_data[SubscriptToIndex(desc1, b, y, x, c)], - input2_data[SubscriptToIndex(desc2, b, y, x, c)]), - params.quantized_activation_min, params.quantized_activation_max); + ActivationFunctionWithMinMax( + fn(params, input1_data[SubscriptToIndex(desc1, b, y, x, c)], + input2_data[SubscriptToIndex(desc2, b, y, x, c)]), + params.quantized_activation_min, params.quantized_activation_max); } } } @@ -143,9 +142,9 @@ inline void BroadcastBinaryArithmeticOpSlow(const BinaryArithmeticOpParam ¶m for (int c = 0; c < extended_output_shape.Dims(3); ++c) { output_data[Offset(extended_output_shape, b, y, x, c)] = ActivationFunctionWithMinMax( - fn(input1_data[SubscriptToIndex(desc1, b, y, x, c)], - input2_data[SubscriptToIndex(desc2, b, y, x, c)]), - params.quantized_activation_min, params.quantized_activation_max); + fn(input1_data[SubscriptToIndex(desc1, b, y, x, c)], + input2_data[SubscriptToIndex(desc2, b, y, x, c)]), + params.quantized_activation_min, params.quantized_activation_max); } } } @@ -154,9 +153,9 @@ inline void BroadcastBinaryArithmeticOpSlow(const BinaryArithmeticOpParam ¶m template <> inline void BroadcastBinaryArithmeticOpSlow( - const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, const float *input1_data, - const Shape &input2_shape, const float *input2_data, const Shape &output_shape, - float *output_data, const std::function &fn) + const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, const float *input1_data, + const Shape &input2_shape, const float *input2_data, const Shape &output_shape, + float *output_data, const std::function &fn) { NdArrayDesc<4> desc1; NdArrayDesc<4> desc2; @@ -171,10 +170,10 @@ inline void BroadcastBinaryArithmeticOpSlow( { for (int c = 0; c < extended_output_shape.Dims(3); ++c) { - output_data[Offset(extended_output_shape, b, y, x, c)] = ActivationFunctionWithMinMax( - fn(input1_data[SubscriptToIndex(desc1, b, y, x, c)], - input2_data[SubscriptToIndex(desc2, b, y, x, c)]), - params.float_activation_min, params.float_activation_max); + output_data[Offset(extended_output_shape, b, y, x, c)] = + ActivationFunctionWithMinMax(fn(input1_data[SubscriptToIndex(desc1, b, y, x, c)], + input2_data[SubscriptToIndex(desc2, b, y, x, c)]), + params.float_activation_min, params.float_activation_max); } } } diff --git a/compute/cker/include/cker/operation/reference/Conv.h b/compute/cker/include/cker/operation/reference/Conv.h index 86e8b51..43a5bf2 100644 --- a/compute/cker/include/cker/operation/reference/Conv.h +++ b/compute/cker/include/cker/operation/reference/Conv.h @@ -98,8 +98,8 @@ inline void Conv(const ConvParams ¶ms, const Shape &input_shape, const float bias_value = bias_data[out_channel]; } output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = - ActivationFunctionWithMinMax(total + bias_value, output_activation_min, - output_activation_max); + ActivationFunctionWithMinMax(total + bias_value, output_activation_min, + output_activation_max); } } } @@ -183,7 +183,7 @@ inline void Conv(const ConvParams ¶ms, const Shape &input_shape, const uint8 acc = std::max(acc, output_activation_min); acc = std::min(acc, output_activation_max); output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = - static_cast(acc); + static_cast(acc); } } } diff --git a/compute/cker/include/cker/ruy/RuySupport.h b/compute/cker/include/cker/ruy/RuySupport.h index 7b4ff20..62eeaf6 100644 --- a/compute/cker/include/cker/ruy/RuySupport.h +++ b/compute/cker/include/cker/ruy/RuySupport.h @@ -52,7 +52,7 @@ void MakeRuyMatrix(const MatrixParams ¶ms, DataPointer data_ptr, ruy::Matrix *dst, bool use_caching = false) { ruy::Order ruy_order = - params.order == Order::kColMajor ? ruy::Order::kColMajor : ruy::Order::kRowMajor; + params.order == Order::kColMajor ? ruy::Order::kColMajor : ruy::Order::kRowMajor; ruy::MakeSimpleLayout(params.rows, params.cols, ruy_order, dst->mutable_layout()); // Note that ruy::Matrix::data is a ConstCheckingPtr, not a plain pointer. // It does care whether we assign to it a Scalar* or a const Scalar*. diff --git a/compute/ruy/CMakeLists.txt b/compute/ruy/CMakeLists.txt new file mode 100644 index 0000000..d98ee1c --- /dev/null +++ b/compute/ruy/CMakeLists.txt @@ -0,0 +1,11 @@ +nnfw_find_package(Ruy REQUIRED) + +add_library(nnfw_lib_ruy INTERFACE) +target_link_libraries(nnfw_lib_ruy INTERFACE ruy) +target_link_libraries(nnfw_lib_ruy INTERFACE ruy_instrumentation) +target_compile_definitions(nnfw_lib_ruy INTERFACE USE_RUY_GEMV) +if(PROFILE_RUY) + target_link_libraries(nnfw_lib_ruy INTERFACE ruy_profiler) +endif(PROFILE_RUY) + +target_include_directories(nnfw_lib_ruy INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) diff --git a/compute/ruy/include/ruy/NeonTensorUtils.h b/compute/ruy/include/ruy/NeonTensorUtils.h new file mode 100644 index 0000000..fb8b0a3 --- /dev/null +++ b/compute/ruy/include/ruy/NeonTensorUtils.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_RUY_NEON_TENSOR_UTILS_H__ +#define __NNFW_RUY_NEON_TENSOR_UTILS_H__ + +#include "ruy/neon/neon_check.h" + +#ifdef USE_NEON + +#define kFloatWeightsPerNeonLane 4 + +namespace nnfw +{ +namespace ruy +{ + +inline bool NeonIsZeroVector(const float *vector, int v_size) +{ + // If v_size is not divisible by kFloatWeightsPerNeonLane, we cannot + // use the main vectorized loop, and we need to process sequentially. + // postamble_start shows the start index where this should happen. + const int postamble_start = v_size - (v_size & (kFloatWeightsPerNeonLane - 1)); + + const float32x4_t zero_x4_float = vmovq_n_f32(0.0f); + for (int v = 0; v < postamble_start; v += kFloatWeightsPerNeonLane) + { + const float32x4_t i_x4_float = vld1q_f32(vector + v); + uint32x4_t cmp_result = vceqq_f32(i_x4_float, zero_x4_float); + if (vgetq_lane_u32(cmp_result, 0) == 0) + return false; + if (vgetq_lane_u32(cmp_result, 1) == 0) + return false; + if (vgetq_lane_u32(cmp_result, 2) == 0) + return false; + if (vgetq_lane_u32(cmp_result, 3) == 0) + return false; + } + + // Postamble loop + for (int v = postamble_start; v < v_size; ++v) + { + if (vector[v] != 0.0) + return false; + } + return true; +} + +} // namespace ruy +} // namespace nnfw + +#endif // USE_NEON + +#endif // __NNFW_RUY_NEON_TENSOR_UTILS_H__ diff --git a/compute/ruy/include/ruy/PortableTensorUtils.h b/compute/ruy/include/ruy/PortableTensorUtils.h new file mode 100644 index 0000000..2d2c36c --- /dev/null +++ b/compute/ruy/include/ruy/PortableTensorUtils.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_RUY_PORTABLE_TENSOR_UTILS_H__ +#define __NNFW_RUY_PORTABLE_TENSOR_UTILS_H__ + +namespace nnfw +{ +namespace ruy +{ + +inline bool PortableIsZeroVector(const float *vector, int v_size) +{ + for (int i = 0; i < v_size; ++i) + { + if (*vector++ != 0.0f) + return false; + } + return true; +} + +} // namespace ruy +} // namespace nnfw + +#endif // __NNFW_RUY_PORTABLE_TENSOR_UTILS_H__ diff --git a/compute/ruy/include/ruy/RuySupport.h b/compute/ruy/include/ruy/RuySupport.h new file mode 100644 index 0000000..7086a96 --- /dev/null +++ b/compute/ruy/include/ruy/RuySupport.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_RUY_RUY_SUPPORT_H__ +#define __NNFW_RUY_RUY_SUPPORT_H__ + +#include +#include +#include +#include +#include "Types.h" + +namespace nnfw +{ +namespace ruy +{ +namespace ruy_support +{ + +inline ::ruy::CachePolicy ToRuyCachePolicy(CachePolicy cache_policy) +{ + switch (cache_policy) + { + case CachePolicy::kNeverCache: + return ::ruy::CachePolicy::kNeverCache; + case CachePolicy::kCacheIfLargeSpeedup: + return ::ruy::CachePolicy::kCacheIfLargeSpeedup; + case CachePolicy::kAlwaysCache: + return ::ruy::CachePolicy::kAlwaysCache; + default: + assert(false); + return ::ruy::CachePolicy::kNeverCache; + } +} + +template +void MakeRuyMatrix(const MatrixParams ¶ms, DataPointer data_ptr, + ::ruy::Matrix *dst, bool use_caching = false) +{ + ::ruy::Order ruy_order = + params.order == Order::kColMajor ? ::ruy::Order::kColMajor : ::ruy::Order::kRowMajor; + ::ruy::MakeSimpleLayout(params.rows, params.cols, ruy_order, dst->mutable_layout()); + // Note that ruy::Matrix::data is a ConstCheckingPtr, not a plain pointer. + // It does care whether we assign to it a Scalar* or a const Scalar*. + dst->set_data(data_ptr); + dst->set_zero_point(params.zero_point); + if (use_caching) + { + dst->set_cache_policy(ToRuyCachePolicy(params.cache_policy)); + } +} + +template +void MakeRuyMulParams(const GemmParamsType ¶ms, RuySpecType *ruy_mul_params) +{ + // This validation has already been performed by the Gemm API entry point, + // but it doesn't hurt to test specifically this again here, where it's + // being used. + ValidateGemmParams(params); + + ruy_mul_params->set_multiplier_fixedpoint(params.multiplier_fixedpoint); + ruy_mul_params->set_multiplier_exponent(params.multiplier_exponent); + ruy_mul_params->set_multiplier_fixedpoint_perchannel(params.multiplier_fixedpoint_perchannel); + ruy_mul_params->set_multiplier_exponent_perchannel(params.multiplier_exponent_perchannel); + ruy_mul_params->set_bias(params.bias); + ruy_mul_params->set_clamp_min(params.clamp_min); + ruy_mul_params->set_clamp_max(params.clamp_max); +} + +} // namespace ruy_support +} // namespace ruy +} // namespace nnfw + +#endif // __NNFW_RUY_RUY_SUPPORT_H__ diff --git a/compute/ruy/include/ruy/Shape.h b/compute/ruy/include/ruy/Shape.h new file mode 100644 index 0000000..981c5b4 --- /dev/null +++ b/compute/ruy/include/ruy/Shape.h @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_RUY_SHAPE_H__ +#define __NNFW_RUY_SHAPE_H__ + +#include +#include +#include +#include + +#define UNUSED_RELEASE(a) (void)(a) + +namespace nnfw +{ +namespace ruy +{ + +class Shape +{ +public: + // Shapes with dimensions up to 5 are stored directly in the structure, while + // larger shapes are separately allocated. + static constexpr int kMaxSmallSize = 5; + + Shape &operator=(Shape const &) = delete; + + Shape() : _size(0) {} + + explicit Shape(int dimensions_count) : _size(dimensions_count) + { + if (dimensions_count > kMaxSmallSize) + { + _dims_pointer = new int32_t[dimensions_count]; + } + } + + Shape(int shape_size, int32_t value) : _size(0) + { + Resize(shape_size); + for (int i = 0; i < shape_size; ++i) + { + SetDim(i, value); + } + } + + Shape(int dimensions_count, const int32_t *dims_data) : _size(0) + { + ReplaceWith(dimensions_count, dims_data); + } + + Shape(const std::initializer_list init_list) : _size(0) { BuildFrom(init_list); } + + // Avoid using this constructor. We should be able to delete it when C++17 + // rolls out. + Shape(Shape const &other) : _size(other.DimensionsCount()) + { + if (_size > kMaxSmallSize) + { + _dims_pointer = new int32_t[_size]; + } + std::memcpy(DimsData(), other.DimsData(), sizeof(int32_t) * _size); + } + + bool operator==(const Shape &comp) const + { + return this->_size == comp._size && + std::memcmp(DimsData(), comp.DimsData(), _size * sizeof(int32_t)) == 0; + } + + ~Shape() + { + if (_size > kMaxSmallSize) + { + delete[] _dims_pointer; + } + } + + inline int32_t DimensionsCount() const { return _size; } + inline int32_t Dims(int i) const + { + assert(i >= 0); + assert(i < _size); + return _size > kMaxSmallSize ? _dims_pointer[i] : _dims[i]; + } + inline void SetDim(int i, int32_t val) + { + assert(i >= 0); + assert(i < _size); + if (_size > kMaxSmallSize) + { + _dims_pointer[i] = val; + } + else + { + _dims[i] = val; + } + } + + inline int32_t *DimsData() { return _size > kMaxSmallSize ? _dims_pointer : _dims; } + inline const int32_t *DimsData() const { return _size > kMaxSmallSize ? _dims_pointer : _dims; } + // The caller must ensure that the shape is no bigger than 4-D. + inline const int32_t *DimsDataUpTo4D() const { return _dims; } + + inline void Resize(int dimensions_count) + { + if (_size > kMaxSmallSize) + { + delete[] _dims_pointer; + } + _size = dimensions_count; + if (dimensions_count > kMaxSmallSize) + { + _dims_pointer = new int32_t[dimensions_count]; + } + } + + inline void ReplaceWith(int dimensions_count, const int32_t *dims_data) + { + Resize(dimensions_count); + int32_t *dst_dims = DimsData(); + std::memcpy(dst_dims, dims_data, dimensions_count * sizeof(int32_t)); + } + + inline void ReplaceWith(const Shape &other) + { + ReplaceWith(other.DimensionsCount(), other.DimsData()); + } + + inline void ReplaceWith(Shape &&other) + { + Resize(0); + std::swap(_size, other._size); + if (_size <= kMaxSmallSize) + std::copy(other._dims, other._dims + kMaxSmallSize, _dims); + else + _dims_pointer = other._dims_pointer; + } + + template inline void BuildFrom(const T &src_iterable) + { + const int dimensions_count = std::distance(src_iterable.begin(), src_iterable.end()); + Resize(dimensions_count); + int32_t *data = DimsData(); + for (auto it : src_iterable) + { + *data = it; + ++data; + } + } + + // This will probably be factored out. Old code made substantial use of 4-D + // shapes, and so this function is used to extend smaller shapes. Note that + // (a) as Dims<4>-dependent code is eliminated, the reliance on this should be + // reduced, and (b) some kernels are stricly 4-D, but then the shapes of their + // inputs should already be 4-D, so this function should not be needed. + inline static Shape ExtendedShape(int new_shape_size, const Shape &shape) + { + return Shape(new_shape_size, shape, 1); + } + + inline void BuildFrom(const std::initializer_list init_list) + { + BuildFrom>(init_list); + } + + // Returns the total count of elements, that is the size when flattened into a + // vector. + inline int FlatSize() const + { + int buffer_size = 1; + const int *dims_data = DimsData(); + for (int i = 0; i < _size; i++) + { + const int dim = dims_data[i]; + assert(dim >= 1); + buffer_size *= dim; + } + return buffer_size; + } + + bool operator!=(const Shape &comp) const { return !((*this) == comp); } + +private: + // For use only by ExtendedShape(), written to guarantee (return-value) copy + // elision in C++17. + // This creates a shape padded to the desired size with the specified value. + Shape(int new_shape_size, const Shape &shape, int pad_value) : _size(0) + { + assert(new_shape_size >= shape.DimensionsCount()); + assert(new_shape_size <= kMaxSmallSize); + Resize(new_shape_size); + const int size_increase = new_shape_size - shape.DimensionsCount(); + for (int i = 0; i < size_increase; ++i) + { + SetDim(i, pad_value); + } + std::memcpy(DimsData() + size_increase, shape.DimsData(), + sizeof(int32_t) * shape.DimensionsCount()); + } + + int32_t _size; + union { + int32_t _dims[kMaxSmallSize]; + int32_t *_dims_pointer{nullptr}; + }; +}; + +inline int MatchingDim(const Shape &shape1, int index1, const Shape &shape2, int index2) +{ + UNUSED_RELEASE(shape2); + UNUSED_RELEASE(index2); + assert(shape1.Dims(index1) == shape2.Dims(index2)); + return shape1.Dims(index1); +} + +template +int MatchingDim(const Shape &shape1, int index1, const Shape &shape2, int index2, Args... args) +{ + assert(shape1.Dims(index1) == shape2.Dims(index2)); + UNUSED_RELEASE(shape2); + UNUSED_RELEASE(index2); + return MatchingDim(shape1, index1, args...); +} + +inline Shape GetShape(const std::vector &data) { return Shape(data.size(), data.data()); } + +inline int Offset(const Shape &shape, int i0, int i1, int i2, int i3) +{ + assert(shape.DimensionsCount() == 4); + const int *dims_data = shape.DimsDataUpTo4D(); + assert(i0 >= 0 && i0 < dims_data[0]); + assert(i1 >= 0 && i1 < dims_data[1]); + assert(i2 >= 0 && i2 < dims_data[2]); + assert(i3 >= 0 && i3 < dims_data[3]); + return ((i0 * dims_data[1] + i1) * dims_data[2] + i2) * dims_data[3] + i3; +} + +inline int Offset(const Shape &shape, int *index) +{ + return Offset(shape, index[0], index[1], index[2], index[3]); +} + +inline int FlatSizeSkipDim(const Shape &shape, int skip_dim) +{ + const int dims_count = shape.DimensionsCount(); + assert(skip_dim >= 0 && skip_dim < dims_count); + const auto *dims_data = shape.DimsData(); + int flat_size = 1; + for (int i = 0; i < dims_count; ++i) + { + flat_size *= (i == skip_dim) ? 1 : dims_data[i]; + } + return flat_size; +} + +// Flat size calculation, checking that dimensions match with one or more other +// arrays. +template inline bool checkMatching(const Shape &shape, Ts... check_shapes) +{ + const Shape check_shapes_array[sizeof...(Ts)] = {std::forward(check_shapes)...}; + for (const auto &check_shape : check_shapes_array) + { + // Check matching of shapes except the case of that two shapes can be scalar + if (shape.DimensionsCount() > 1 || check_shape.DimensionsCount() > 1 || shape.FlatSize() != 1 || + check_shape.FlatSize() != 1) + { + if (shape.DimensionsCount() != check_shape.DimensionsCount()) + { + return false; + } + for (int i = 0; i < shape.DimensionsCount(); ++i) + { + if (shape.Dims(i) != check_shape.Dims(i)) + { + return false; + } + } + } + } + return true; +} + +struct UNUSED_ALL +{ + template UNUSED_ALL(Args const &...) {} +}; +template inline int MatchingFlatSize(const Shape &shape, Ts... check_shapes) +{ + UNUSED_ALL{check_shapes...}; + assert(checkMatching(shape, std::forward(check_shapes)...)); + return shape.FlatSize(); +} + +inline int MatchingFlatSizeSkipDim(const Shape &shape, int skip_dim, const Shape &check_shape_0) +{ + UNUSED_RELEASE(check_shape_0); + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) + { + if (i != skip_dim) + { + assert(shape.Dims(i) == check_shape_0.Dims(i)); + } + } + return FlatSizeSkipDim(shape, skip_dim); +} + +inline int MatchingFlatSizeSkipDim(const Shape &shape, int skip_dim, const Shape &check_shape_0, + const Shape &check_shape_1) +{ + UNUSED_RELEASE(check_shape_0); + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) + { + if (i != skip_dim) + { + assert(shape.Dims(i) == check_shape_0.Dims(i)); + } + } + return MatchingFlatSizeSkipDim(shape, skip_dim, check_shape_1); +} + +inline int MatchingElementsSize(const Shape &shape, const Shape &check_shape_0, + const Shape &check_shape_1) +{ + const int size_1 = shape.FlatSize(); + const int size_2 = check_shape_0.FlatSize(); + const int size_3 = check_shape_1.FlatSize(); + assert(size_1 == size_2); + assert(size_2 == size_3); + UNUSED_RELEASE(size_2); + UNUSED_RELEASE(size_3); + return size_1; +} + +} // namespace ruy +} // namespace nnfw + +#endif // __NNFW_RUY_SHAPE_H__ diff --git a/compute/ruy/include/ruy/TensorUtils.h b/compute/ruy/include/ruy/TensorUtils.h new file mode 100644 index 0000000..149037c --- /dev/null +++ b/compute/ruy/include/ruy/TensorUtils.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_RUY_TENSOR_UTILS_H__ +#define __NNFW_RUY_TENSOR_UTILS_H__ + +#include "ruy/PortableTensorUtils.h" +#include "ruy/NeonTensorUtils.h" + +namespace nnfw +{ +namespace ruy +{ + +inline bool IsZeroVector(const float *vector, int v_size) +{ + return NEON_OR_PORTABLE(IsZeroVector, vector, v_size); +} + +} // namespace ruy +} // namespace nnfw + +#endif // __NNFW_RUY_TENSOR_UTILS_H__ diff --git a/compute/ruy/include/ruy/Types.h b/compute/ruy/include/ruy/Types.h new file mode 100644 index 0000000..b19b597 --- /dev/null +++ b/compute/ruy/include/ruy/Types.h @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_RUY_TYPES_H__ +#define __NNFW_RUY_TYPES_H__ + +#include +#include +#include +#include +#include +#include "Shape.h" + +namespace nnfw +{ +namespace ruy +{ + +enum class FusedActivationFunctionType +{ + kNone = 0, + kRelu6 = 1, + kRelu1 = 2, + kRelu = 3, + kTanh = 4, + kSigmoid = 6, +}; + +enum class PaddingType +{ + kNone = 0, + kSame = 1, + kValid = 2, +}; + +struct PaddingValues +{ + int16_t width; + int16_t height; +}; + +struct ConvParams +{ + PaddingType padding_type; + PaddingValues padding_values; + // TODO(starka): This was just "stride", so check that width+height is OK. + int16_t stride_width; + int16_t stride_height; + int16_t dilation_width_factor; + int16_t dilation_height_factor; + // uint8_t inference params. + // TODO(b/65838351): Use smaller types if appropriate. + int32_t input_offset; + int32_t weights_offset; + int32_t output_offset; + int32_t output_multiplier; + int output_shift; + // uint8_t, etc, activation params. + int32_t quantized_activation_min; + int32_t quantized_activation_max; + // float activation params. + float float_activation_min; + float float_activation_max; + bool is_replaced_weights{false}; +}; + +struct FullyConnectedParams +{ + FusedActivationFunctionType activation{FusedActivationFunctionType::kNone}; + // uint8 inference params. + // TODO(b/65838351): Use smaller types if appropriate. + int32_t input_offset; + int32_t weights_offset; + float weights_scale; + int32_t output_offset; + int32_t output_multiplier; + int output_shift; + // uint8, etc, activation params. + int32_t quantized_activation_min; + int32_t quantized_activation_max; + // float activation params - no one use this params, but ruy might use them later. + float float_activation_min; + float float_activation_max; + // Mark the operands as cacheable if they are unchanging, e.g. weights. + bool lhs_cacheable; + bool rhs_cacheable; + // FullyConnectedWeightsFormat weights_format; +}; + +enum class Order +{ + kColMajor, + kRowMajor +}; + +enum class CachePolicy : std::uint8_t +{ + kNeverCache, + kCacheIfLargeSpeedup, + kAlwaysCache, +}; + +// MatrixParams encapsulates the parameters that Gemm needs about each +// matrix, besides the buffer data pointer. +// Compare to ruy::Matrix, which also encapsulates the data pointer. +// Rationale for leaving the data pointer out of here: doing so +// requires complicated const-correctness mechanics. See +// ruy::ConstCheckingPtr. +template struct MatrixParams +{ + // Storage layout order. For now we only do plain linear non-strided + // layout. It would be easy to support a stride if needed. + Order order = Order::kColMajor; + // Number of rows of the matrix. + int rows = 0; + // Number of columns of the matrix. + int cols = 0; + // The zero_point, i.e. which Scalar value is to be interpreted as zero. + // When Scalar is floating-point, this must be 0. + Scalar zero_point = 0; + // When the data pointed to by this matrix is constant data, so that it is + // valid to assume that equality of pointers implies equality of data, + // a CachePolicy may be used instead of the default kNeverCache, + // which will enable ruy to take advantage of this constancy of the data to + // cache the packing work, which can be a large speedup in matrix*vector + // and other narrow shapes. + CachePolicy cache_policy = CachePolicy::kNeverCache; +}; + +// Enumeration of broad categories of Gemm. +// +// The primary reason for this to exist is to allow Gemm to compile +// only uniform-quantized or only per-channel-quantized code paths. +// This is unneeded with ruy as the back-end, as this is only a runtime +// difference in ruy, but with gemmlowp these really are separate code +// paths and templatizing in a QuantizationFlavor is necessary to avoid +// compiling unused gemmlowp code. Indeed, TFLite currently uses +// uint8 with uniform quantization and int8 with per-channel quantization, +// and does not use uint8 with per-channel. We want to avoid compiling +// the gemmlowp uint8 per-channel path when gemmlowp is the back-end. +// +// It's possible to drop this in the future if gemmlowp goes away and no +// other then-relevant backend library handles quantized paths in a way that +// requires knowing this at compile-time. +enum class QuantizationFlavor +{ + // Floating-point Gemm: the accumulators are not multiplied by any + // 'multiplier'. + kFloatingPoint, + // Quantized Gemm using a single multiplier for all accumulators. + kIntegerWithUniformMultiplier, + // Quantized Gemm using a separate multipliers for accumulators of each + // row of the destination matrix. This is what is called 'per-channel' + // in GemmParams. Here we use the more specific 'per-row' terminology + // to allow for the possibility of 'per-column' in the future, and to + // allow for that to be a separate code path in some back-end such as + // gemmlowp. + kIntegerWithPerRowMultiplier +}; + +// Additional parameters that Gemm needs, beyond what falls into +// the MatrixParams that it takes. Compare to ruy::Spec. +// +// Decoupling AccumScalar from DstScalar (rather than deducing it from that) +// is useful future-proofing. Think of a float16 path using float32 accum. +// +// QuantizationFlavor is passed here even though it's technically not used +// in this class. This is so that we retain the ability in the future to +// specialize this class for quantization flavor, and this allows for +// Gemm to be templatized in quantization_flavor via the GemmParams that it +// takes, allowing for automatic template parameter deduction to take place, +// so that most call sites don't need to specify a QuantizationFlavor +// (only those that need perchannel quantization do). +template ::value + ? QuantizationFlavor::kFloatingPoint + : QuantizationFlavor::kIntegerWithUniformMultiplier> +struct GemmParams +{ + // Only for non-floating-point cases. The fixed-point part (i.e. the mantissa) + // of the multiplier by which accumulators are multiplied before being casted + // to the destination type. + AccumScalar multiplier_fixedpoint = 0; + // Only for non-floating-point cases. The exponent part of the aforementioned + // multiplier. + int multiplier_exponent = 0; + // Per-channel variant of multiplier_fixedpoint. If not nullptr, this must + // point to a buffer of as many values as there are rows in the destination + // matrix. Each row of the destination matrix will use the corresponding + // buffer element instead of multiplier_fixedpoint. + const AccumScalar *multiplier_fixedpoint_perchannel = nullptr; + // Per-channel variant of multiplier_exponent. If not nullptr, this must + // point to a buffer of as many values as there are rows in the destination + // matrix. Each row of the destination matrix will use the corresponding + // buffer element instead of multiplier_exponent. + // + // Either none or both of multiplier_exponent_perchannel and + // multiplier_fixedpoint_perchannel must be nullptr. + const int *multiplier_exponent_perchannel = nullptr; + // The bias vector data, if not null. + const AccumScalar *bias = nullptr; + // min clamp bound of destination values. + DstScalar clamp_min = std::is_floating_point::value + ? -std::numeric_limits::infinity() + : std::numeric_limits::lowest(); + // max clamp bound of destination values. + DstScalar clamp_max = std::is_floating_point::value + ? std::numeric_limits::infinity() + : std::numeric_limits::max(); +}; + +// Validates self-consistency of GemmParams. +template +void ValidateGemmParams(const GemmParams ¶ms) +{ + // Guard consistency of the quantized multiplier fields. + if (quantization_flavor == QuantizationFlavor::kFloatingPoint) + { + assert(!params.multiplier_fixedpoint); + assert(!params.multiplier_exponent); + assert(!params.multiplier_fixedpoint_perchannel); + assert(!params.multiplier_exponent_perchannel); + } + else if (quantization_flavor == QuantizationFlavor::kIntegerWithUniformMultiplier && + !std::is_same::value) + { + assert(params.multiplier_fixedpoint); + // Nothing to check about multiplier_exponent + assert(!params.multiplier_fixedpoint_perchannel); + assert(!params.multiplier_exponent_perchannel); + } + else if (quantization_flavor == QuantizationFlavor::kIntegerWithPerRowMultiplier && + !std::is_same::value) + { + assert(!params.multiplier_fixedpoint); + assert(!params.multiplier_exponent); + assert(params.multiplier_fixedpoint_perchannel); + assert(params.multiplier_exponent_perchannel); + } + else + { + // For the get raw accumulator case, we should make sure none of the + // quantization params are set. + assert(!params.multiplier_fixedpoint); + assert(!params.multiplier_exponent); + assert(!params.multiplier_fixedpoint_perchannel); + assert(!params.multiplier_exponent_perchannel); + } + UNUSED_RELEASE(params); +} + +inline CachePolicy DefaultCachePolicy(bool is_constant_data) +{ + return is_constant_data ? CachePolicy::kCacheIfLargeSpeedup : CachePolicy::kNeverCache; +} + +} // namespace ruy +} // namespace nnfw + +#endif // __NNFW_RUY_TYPES_H__ diff --git a/compute/ruy/include/ruy/Utils.h b/compute/ruy/include/ruy/Utils.h new file mode 100644 index 0000000..50205ab --- /dev/null +++ b/compute/ruy/include/ruy/Utils.h @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_RUY_UTILS_H__ +#define __NNFW_RUY_UTILS_H__ + +#include "Types.h" +#include "Shape.h" + +#include + +namespace nnfw +{ +namespace ruy +{ +template +inline void ExtractPatchIntoBufferColumn(const Shape &input_shape, int w, int h, int b, int kheight, + int kwidth, int stride_width, int stride_height, + int pad_width, int pad_height, int in_width, int in_height, + int in_depth, int single_buffer_length, int buffer_id, + const T *in_data, T *conv_buffer_data, uint8_t zero_byte) +{ + assert(input_shape.DimensionsCount() == 4); + // This chunk of code reshapes all the inputs corresponding to + // output (b, h, w) to a column vector in conv_buffer(:, buffer_id). + const int kwidth_times_indepth = kwidth * in_depth; + const int inwidth_times_indepth = in_width * in_depth; + const int ih_ungated_start = h * stride_height - pad_height; + const int ih_ungated_end = (ih_ungated_start + kheight); + const int ih_end = std::min(ih_ungated_end, in_height); + const int iw_ungated_start = w * stride_width - pad_width; + const int iw_ungated_end = (iw_ungated_start + kwidth); + const int iw_end = std::min(iw_ungated_end, in_width); + // If the patch is off the edge of the input image, skip writing those rows + // and columns from the patch into the output array. + const int h_offset = std::max(0, -ih_ungated_start); + const int w_offset = std::max(0, -iw_ungated_start); + const int ih_start = std::max(0, ih_ungated_start); + const int iw_start = std::max(0, iw_ungated_start); + const int single_row_num = std::min(kwidth - w_offset, in_width - iw_start) * in_depth; + const int output_row_offset = (buffer_id * single_buffer_length); + int out_offset = output_row_offset + (h_offset * kwidth + w_offset) * in_depth; + int in_offset = Offset(input_shape, b, ih_start, iw_start, 0); + + // Express all of the calculations as padding around the input patch. + const int top_padding = h_offset; + const int bottom_padding = (ih_ungated_end - ih_end); + const int left_padding = w_offset; + const int right_padding = (iw_ungated_end - iw_end); + assert(single_row_num == ((kwidth - (left_padding + right_padding)) * in_depth)); + + // Write out zeroes to the elements representing the top rows of the input + // patch that are off the edge of the input image. + if (top_padding > 0) + { + const int top_row_elements = (top_padding * kwidth * in_depth); + memset(conv_buffer_data + output_row_offset, zero_byte, (top_row_elements * sizeof(T))); + } + + // If the patch is on the interior of the input image horizontally, just copy + // over the rows sequentially, otherwise add zero padding at the start or end. + if ((left_padding == 0) && (right_padding == 0)) + { + for (int ih = ih_start; ih < ih_end; ++ih) + { + memcpy(conv_buffer_data + out_offset, in_data + in_offset, single_row_num * sizeof(T)); + out_offset += kwidth_times_indepth; + in_offset += inwidth_times_indepth; + } + } + else + { + for (int ih = ih_start; ih < ih_end; ++ih) + { + if (left_padding > 0) + { + const int left_start = (out_offset - (left_padding * in_depth)); + memset(conv_buffer_data + left_start, zero_byte, (left_padding * in_depth * sizeof(T))); + } + memcpy(conv_buffer_data + out_offset, in_data + in_offset, single_row_num * sizeof(T)); + if (right_padding > 0) + { + const int right_start = (out_offset + single_row_num); + memset(conv_buffer_data + right_start, zero_byte, (right_padding * in_depth * sizeof(T))); + } + out_offset += kwidth_times_indepth; + in_offset += inwidth_times_indepth; + } + } + + // If the bottom of the patch falls off the input image, pad the values + // representing those input rows with zeroes. + if (bottom_padding > 0) + { + const int bottom_row_elements = (bottom_padding * kwidth * in_depth); + const int bottom_start = + output_row_offset + ((top_padding + (ih_end - ih_start)) * kwidth * in_depth); + memset(conv_buffer_data + bottom_start, zero_byte, (bottom_row_elements * sizeof(T))); + } +} + +// Supports per-batch zero_byte for per-batch asymmetric quantized inputs. +template +void DilatedIm2col(const ConvParams ¶ms, const Shape &input_shape, const T *input_data, + const Shape &filter_shape, const Shape &output_shape, T *im2col_data, + const int32_t *zero_bytes, const int zero_bytes_len) +{ + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + assert(input_shape.DimensionsCount() == 4); + assert(filter_shape.DimensionsCount() == 4); + assert(output_shape.DimensionsCount() == 4); + + // For dilated convolution, the input pixels are not contiguous therefore we + // can't use the same optimizations as Im2Col(). Though note this code would + // work fine for the non-dilated case too (though likely a bit slower). + assert(dilation_width_factor != 1 || dilation_height_factor != 1); + assert(im2col_data); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + MatchingDim(output_shape, 3, filter_shape, 0); + + // Construct the MxN sized im2col matrix. + // The rows M, are sub-ordered B x H x W + const Shape row_shape({1, batches, output_height, output_width}); + // The columns, N, are sub-ordered Kh x Kw x Din + const Shape col_shape({1, filter_height, filter_width, input_depth}); + // Use dimensions M and N to construct dims for indexing directly into im2col + const Shape im2col_shape({1, 1, row_shape.FlatSize(), col_shape.FlatSize()}); + + // Loop through the output rows (B x H x W) + for (int batch = 0; batch < batches; ++batch) + { + const T zero_byte = + zero_bytes_len > 1 ? static_cast(zero_bytes[batch]) : static_cast(zero_bytes[0]); + for (int out_y = 0; out_y < output_height; ++out_y) + { + for (int out_x = 0; out_x < output_width; ++out_x) + { + // Each im2col row is an output pixel. Arrange the input data in this + // row in an order we can conveniently multiply with the filter data. + int row_offset = Offset(row_shape, 0, batch, out_y, out_x); + const int in_x_origin = (out_x * stride_width) - pad_width; + const int in_y_origin = (out_y * stride_height) - pad_height; + // Loop through all the pixels of the filter (Kh x Kw) + for (int filter_y = 0; filter_y < filter_height; ++filter_y) + { + const int in_y = in_y_origin + dilation_height_factor * filter_y; + if ((in_y >= 0) && (in_y < input_height)) + { + // Filter row is within the input data. + // Loop through all the filter pixels in this row. + for (int filter_x = 0; filter_x < filter_width; ++filter_x) + { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + int col_offset = Offset(col_shape, 0, filter_y, filter_x, 0); + T *dst = im2col_data + Offset(im2col_shape, 0, 0, row_offset, col_offset); + if ((in_x >= 0) && (in_x < input_width)) + { + // Filter pixel is within the input, copy the input data. + T const *src = input_data + Offset(input_shape, batch, in_y, in_x, 0); + memcpy(dst, src, input_depth * sizeof(T)); + } + else + { + // Filter pixel is outside the input, zero it out. + memset(dst, zero_byte, input_depth * sizeof(T)); + } + } + } + else + { + // Filter row is outside the input, zero out the entire filter row. + int col_offset = Offset(col_shape, 0, filter_y, 0, 0); + T *dst = im2col_data + Offset(im2col_shape, 0, 0, row_offset, col_offset); + memset(dst, zero_byte, filter_width * input_depth * sizeof(T)); + } + } + } + } + } +} + +template +void DilatedIm2col(const ConvParams ¶ms, uint8_t zero_byte, const Shape &input_shape, + const T *input_data, const Shape &filter_shape, const Shape &output_shape, + T *im2col_data) +{ + const int32_t zero_point = static_cast(zero_byte); + DilatedIm2col(params, input_shape, input_data, filter_shape, output_shape, im2col_data, + &zero_point, 1); +} + +template +void Im2col(const ConvParams ¶ms, int kheight, int kwidth, uint8_t zero_byte, + const Shape &input_shape, const T *input_data, const Shape &output_shape, + T *output_data) +{ + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + assert(input_shape.DimensionsCount() == 4); + assert(output_shape.DimensionsCount() == 4); + + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_depth = input_shape.Dims(3); + const int input_width = input_shape.Dims(2); + const int input_height = input_shape.Dims(1); + const int output_depth = output_shape.Dims(3); + const int output_width = output_shape.Dims(2); + const int output_height = output_shape.Dims(1); + + int buffer_id = 0; + // Loop over the output nodes. + for (int b = 0; b < batches; ++b) + { + for (int h = 0; h < output_height; ++h) + { + for (int w = 0; w < output_width; ++w) + { + ExtractPatchIntoBufferColumn(input_shape, w, h, b, kheight, kwidth, stride_width, + stride_height, pad_width, pad_height, input_width, + input_height, input_depth, output_depth, buffer_id, input_data, + output_data, zero_byte); + ++buffer_id; + } + } + } +} + +} // namespace ruy +} // namespace nnfw + +#endif // __NNFW_RUY_UTILS_H__ diff --git a/compute/ruy/include/ruy/neon/neon_check.h b/compute/ruy/include/ruy/neon/neon_check.h new file mode 100644 index 0000000..08394f2 --- /dev/null +++ b/compute/ruy/include/ruy/neon/neon_check.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_RUY_NEON_CHECK_H__ +#define __NNFW_RUY_NEON_CHECK_H__ + +#if defined(__ARM_NEON__) || defined(__ARM_NEON) +#define USE_NEON +#include +#endif + +// Disable X86_NEON +// #if defined __GNUC__ && defined __SSE4_1__ && !defined TF_LITE_DISABLE_X86_NEON +#if 0 +#define USE_NEON +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#pragma GCC diagnostic ignored "-Wattributes" +#pragma GCC diagnostic ignored "-Wnarrowing" +#pragma GCC diagnostic ignored "-Wsequence-point" +#include "NEON_2_SSE.h" +#pragma GCC diagnostic pop +#endif + +// NEON_OR_PORTABLE(SomeFunc, args) calls NeonSomeFunc(args) if USE_NEON is +// defined, PortableSomeFunc(args) otherwise. +#ifdef USE_NEON +// Always use Neon code +#define NEON_OR_PORTABLE(funcname, ...) Neon##funcname(__VA_ARGS__) + +#else +// No NEON available: Use Portable code +#define NEON_OR_PORTABLE(funcname, ...) Portable##funcname(__VA_ARGS__) + +#endif // defined(USE_NEON) + +#endif // __NNFW_RUY_NEON_CHECK_H__ diff --git a/compute/ruy/include/ruy/operation/Conv.h b/compute/ruy/include/ruy/operation/Conv.h new file mode 100644 index 0000000..2b9c8c3 --- /dev/null +++ b/compute/ruy/include/ruy/operation/Conv.h @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_RUY_CONV_H__ +#define __NNFW_RUY_CONV_H__ + +#include "ruy/Types.h" +#include "ruy/Shape.h" +#include "ruy/Utils.h" +#include "ruy/RuySupport.h" + +#include +#include +#include +#include + +namespace nnfw +{ +namespace ruy +{ + +class Conv +{ +public: + Conv() : _im2col_shape(4), _need_im2col(false), _prepared(false) {} + + void prepare(const Shape &input_shape, const Shape &kernel_shape, const Shape &output_shape, + uint32_t stride_width, uint32_t stride_height, uint32_t dilation_width_factor, + uint32_t dilation_height_factor) + { + if (!_prepared) + { + IsRequiredIm2col(input_shape, kernel_shape, output_shape, stride_width, stride_height, + dilation_width_factor, dilation_height_factor); + _prepared = true; + } + } + + void operator()(const ConvParams ¶ms, const Shape &input_shape, const float *input_data, + const Shape &filter_shape, const float *filter_data, const Shape &bias_shape, + const float *bias_data, const Shape &output_shape, float *output_data, + ::ruy::Context *ruy_context) + { + if (!_prepared) + { + // This means that input or output are dynamic or filter is not constant + IsRequiredIm2col(input_shape, filter_shape, output_shape, params.stride_width, + params.stride_height, params.dilation_width_factor, + params.dilation_height_factor); + _prepared = true; + } + + int im2col_size = _need_im2col ? _im2col_shape.FlatSize() : 0; + + // Use heap if size is larger than 8MB + if (im2col_size > 2 * 1024 * 1024) + { + std::unique_ptr im2col_data = std::make_unique(im2col_size); + ConvFloat(params, input_shape, input_data, filter_shape, filter_data, bias_shape, bias_data, + output_shape, output_data, _im2col_shape, im2col_data.get(), ruy_context); + } + else if (im2col_size > 0) + { + float im2col_data[im2col_size]; + ConvFloat(params, input_shape, input_data, filter_shape, filter_data, bias_shape, bias_data, + output_shape, output_data, _im2col_shape, im2col_data, ruy_context); + } + else + { + ConvFloat(params, input_shape, input_data, filter_shape, filter_data, bias_shape, bias_data, + output_shape, output_data, _im2col_shape, nullptr, ruy_context); + } + } + +private: + void ConvFloat(const ConvParams ¶ms, const Shape &input_shape, const float *input_data, + const Shape &filter_shape, const float *filter_data, const Shape &bias_shape, + const float *bias_data, const Shape &output_shape, float *output_data, + const Shape &im2col_shape, float *im2col_data, ::ruy::Context *ruy_context) + { + UNUSED_RELEASE(bias_shape); + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const float output_activation_min = params.float_activation_min; + const float output_activation_max = params.float_activation_max; + assert(input_shape.DimensionsCount() == 4); + assert(filter_shape.DimensionsCount() == 4); + assert(output_shape.DimensionsCount() == 4); + + // NB: the float 0.0f value is represented by all zero bytes. + const uint8_t float_zero_byte = 0x00; + const float *gemm_input_data = nullptr; + const Shape *gemm_input_shape = nullptr; + const int filter_width = filter_shape.Dims(2); + const int filter_height = filter_shape.Dims(1); + const bool need_dilated_im2col = dilation_width_factor != 1 || dilation_height_factor != 1; + const bool need_im2col = + stride_width != 1 || stride_height != 1 || filter_width != 1 || filter_height != 1; + if (need_dilated_im2col) + { + DilatedIm2col(params, float_zero_byte, input_shape, input_data, filter_shape, output_shape, + im2col_data); + gemm_input_data = im2col_data; + gemm_input_shape = &im2col_shape; + } + else if (need_im2col) + { + assert(im2col_data); + Im2col(params, filter_height, filter_width, float_zero_byte, input_shape, input_data, + im2col_shape, im2col_data); + gemm_input_data = im2col_data; + gemm_input_shape = &im2col_shape; + } + else + { + // TODO(aselle): We need to make sure to not send im2col if it is not + // needed. + assert(!im2col_data); + gemm_input_data = input_data; + gemm_input_shape = &input_shape; + } + + const int gemm_input_dims = gemm_input_shape->DimensionsCount(); + int m = FlatSizeSkipDim(*gemm_input_shape, gemm_input_dims - 1); + int n = output_shape.Dims(3); + int k = gemm_input_shape->Dims(gemm_input_dims - 1); + + // When an optimized CBLAS implementation is not available, fall back + // to using cpu_backend_gemm. + MatrixParams lhs_params; + lhs_params.order = Order::kRowMajor; + lhs_params.rows = n; + lhs_params.cols = k; + MatrixParams rhs_params; + rhs_params.order = Order::kColMajor; + rhs_params.rows = k; + rhs_params.cols = m; + MatrixParams dst_params; + dst_params.order = Order::kColMajor; + dst_params.rows = n; + dst_params.cols = m; + GemmParams gemm_params; + gemm_params.bias = bias_data; + gemm_params.clamp_min = output_activation_min; + gemm_params.clamp_max = output_activation_max; + + // Below code is from tflite::cpu_backend_gemm::detail::GemmImplUsingRuy + ::ruy::Matrix ruy_lhs; + ::ruy::Matrix ruy_rhs; + ::ruy::Matrix ruy_dst; + // Note that cache is always enabled for input and weight tensors + ruy_support::MakeRuyMatrix(lhs_params, filter_data, &ruy_lhs, true); + ruy_support::MakeRuyMatrix(rhs_params, gemm_input_data, &ruy_rhs, true); + ruy_support::MakeRuyMatrix(dst_params, output_data, &ruy_dst); + + ::ruy::BasicSpec ruy_mul_params; + ruy_support::MakeRuyMulParams(gemm_params, &ruy_mul_params); + + ::ruy::Mul(ruy_lhs, ruy_rhs, ruy_mul_params, ruy_context, &ruy_dst); + } + + void IsRequiredIm2col(const Shape &input_shape, const Shape &kernel_shape, + const Shape &output_shape, uint32_t stride_width, uint32_t stride_height, + uint32_t dilation_width_factor, uint32_t dilation_height_factor) + { + const bool need_dilated_im2col = dilation_width_factor != 1 || dilation_height_factor != 1; + const bool need_non_dilated_im2col = stride_width != 1 || stride_height != 1 || + kernel_shape.Dims(1) != 1 || kernel_shape.Dims(2) != 1; + + _need_im2col = need_dilated_im2col || need_non_dilated_im2col; + + if (_need_im2col) + { + _im2col_shape.SetDim(0, output_shape.Dims(0)); + _im2col_shape.SetDim(1, output_shape.Dims(1)); + _im2col_shape.SetDim(2, output_shape.Dims(2)); + _im2col_shape.SetDim(3, input_shape.Dims(3) * kernel_shape.Dims(1) * kernel_shape.Dims(2)); + } + } + +private: + Shape _im2col_shape; + bool _need_im2col; + bool _prepared; +}; +} // namespace ruy +} // namespace nnfw + +#endif // __NNFW_RUY_CONV_H_ diff --git a/compute/ruy/include/ruy/operation/FullyConnected.h b/compute/ruy/include/ruy/operation/FullyConnected.h new file mode 100644 index 0000000..59facdb --- /dev/null +++ b/compute/ruy/include/ruy/operation/FullyConnected.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_RUY_FULLY_CONNECTED_H__ +#define __NNFW_RUY_FULLY_CONNECTED_H__ + +#include "ruy/Shape.h" +#include "ruy/Types.h" +#include "ruy/Utils.h" +#include "ruy/RuySupport.h" + +#include +#include + +namespace nnfw +{ +namespace ruy +{ + +inline void FullyConnected(const FullyConnectedParams ¶ms, const Shape &input_shape, + const float *input_data, const Shape &weights_shape, + const float *weights_data, const Shape &, + const float *optional_bias_data, const Shape &output_shape, + float *output_data, ::ruy::Context *ruy_context) +{ + const int dims_count = weights_shape.DimensionsCount(); + const int input_rows = weights_shape.Dims(dims_count - 1); + MatrixParams rhs_params; + rhs_params.order = Order::kColMajor; + rhs_params.rows = input_rows; + rhs_params.cols = input_shape.FlatSize() / input_rows; + rhs_params.cache_policy = DefaultCachePolicy(params.rhs_cacheable); + assert(input_shape.FlatSize() == (rhs_params.rows * rhs_params.cols)); + MatrixParams lhs_params; + lhs_params.order = Order::kRowMajor; + lhs_params.cols = weights_shape.Dims(dims_count - 1); + lhs_params.rows = FlatSizeSkipDim(weights_shape, dims_count - 1); + lhs_params.cache_policy = DefaultCachePolicy(params.lhs_cacheable); + MatrixParams dst_params; + dst_params.order = Order::kColMajor; + dst_params.rows = output_shape.Dims(output_shape.DimensionsCount() - 1); + dst_params.cols = FlatSizeSkipDim(output_shape, output_shape.DimensionsCount() - 1); + GemmParams gemm_params; + gemm_params.bias = optional_bias_data; + gemm_params.clamp_min = params.float_activation_min; + gemm_params.clamp_max = params.float_activation_max; + + // Below code was copied from tflite::cpu_backend_gemm::detail::GemmImplUsingRuy + ::ruy::Matrix ruy_lhs; + ::ruy::Matrix ruy_rhs; + ::ruy::Matrix ruy_dst; + // Note that cache is always enabled for input and weight tensors + ruy_support::MakeRuyMatrix(lhs_params, weights_data, &ruy_lhs, true); + ruy_support::MakeRuyMatrix(rhs_params, input_data, &ruy_rhs, true); + ruy_support::MakeRuyMatrix(dst_params, output_data, &ruy_dst); + + ::ruy::BasicSpec ruy_mul_params; + ruy_support::MakeRuyMulParams(gemm_params, &ruy_mul_params); + + ::ruy::Mul(ruy_lhs, ruy_rhs, ruy_mul_params, ruy_context, &ruy_dst); +} + +} // namespace ruy +} // namespace nnfw + +#endif // __NNFW_RUY_FULLY_CONNECTED_H__ diff --git a/compute/test/cker/Range.cc b/compute/test/cker/Range.cc index 55f4fcf..e5fe480 100644 --- a/compute/test/cker/Range.cc +++ b/compute/test/cker/Range.cc @@ -48,9 +48,7 @@ TEST(CKer_Operation, Range) const float start = 3; const float limit = 1; const float delta = -0.5; - std::vector expected = { - 3, 2.5, 2, 1.5, - }; + std::vector expected = {3, 2.5, 2, 1.5}; std::vector actual(expected.size()); nnfw::cker::Range(&start, &limit, &delta, actual.data()); diff --git a/docs/conf.py b/docs/conf.py index 1185bcf..68b7d06 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -21,7 +21,7 @@ copyright = '2020, Samsung Research & contributors' author = 'Samsung Research & contributors' # The full version, including alpha/beta/rc tags -release = '1.11.1' +release = '1.12.0' # -- General configuration --------------------------------------------------- diff --git a/docs/howto/how-to-add-a-new-operation.md b/docs/howto/how-to-add-a-new-operation.md index 8ea7014..241ba6c 100644 --- a/docs/howto/how-to-add-a-new-operation.md +++ b/docs/howto/how-to-add-a-new-operation.md @@ -6,4 +6,4 @@ ## Runtime -- [How to introduce a new operatoin into runtime](how-to-introduce-a-new-operation-into-runtime.md) +- [How to introduce a new operation into runtime](how-to-introduce-a-new-operation-into-runtime.md) diff --git a/docs/howto/how-to-introduce-a-new-operation-into-runtime.md b/docs/howto/how-to-introduce-a-new-operation-into-runtime.md index f8fc020..9ab4987 100644 --- a/docs/howto/how-to-introduce-a-new-operation-into-runtime.md +++ b/docs/howto/how-to-introduce-a-new-operation-into-runtime.md @@ -24,7 +24,6 @@ onert support the operation. - [acl_cl](#acl_cl-1) - [acl_neon](#acl_neon-1) - [cpu](#cpu-1) - - [TensorRegister (in some cases)](#tensorregister-in-some-cases) - [ConstantInitializer (in some cases)](#constantinitializer-in-some-cases) - [cpu](#cpu-2) - [Samples (to be updated)](#samples-to-be-updated) @@ -420,51 +419,28 @@ void visit(const ir::operation::Select &) override; ```cpp void KernelGenerator::visit(const ir::operation::Select &node) { - const auto output_index{node.getOutputs().at(ir::operation::Select::Output::OUTPUT)}; - const auto cond_index{node.getInputs().at(ir::operation::Select::Input::COND)}; - const auto input1_index{node.getInputs().at(ir::operation::Select::Input::INPUT1)}; - const auto input2_index{node.getInputs().at(ir::operation::Select::Input::INPUT2)}; - - const auto output_backend_descr = ::onert::backend::cpu::kernel::getTensorDescriptor( - _ctx.at(output_index), _current_op_seq_layout); - const auto cond_backend_descr = ::onert::backend::cpu::kernel::getTensorDescriptor( - _ctx.at(cond_index), _current_op_seq_layout); - const auto input1_backend_descr = ::onert::backend::cpu::kernel::getTensorDescriptor( - _ctx.at(input1_index), _current_op_seq_layout); - const auto input2_backend_descr = ::onert::backend::cpu::kernel::getTensorDescriptor( - _ctx.at(input2_index), _current_op_seq_layout); + const auto output_index{node.getOutputs().at(0)}; + const auto condition_index{node.getInputs().at(ir::operation::Select::Input::CONDITION)}; + const auto true_index{node.getInputs().at(ir::operation::Select::Input::INPUT_TRUE)}; + const auto false_index{node.getInputs().at(ir::operation::Select::Input::INPUT_FALSE)}; - auto output_alloc = _tensor_builder->at(output_index).get(); - auto cond_alloc = _tensor_builder->at(cond_index).get(); - auto input1_alloc = _tensor_builder->at(input1_index).get(); - auto input2_alloc = _tensor_builder->at(input2_index).get(); + auto output_tensor = _tensor_reg->getPortableTensor(output_index); + auto condition_tensor = _tensor_reg->getPortableTensor(condition_index); + auto true_tensor = _tensor_reg->getPortableTensor(true_index); + auto false_tensor = _tensor_reg->getPortableTensor(false_index); - auto fn = std::make_unique<::onert::backend::cpu::kernel::SelectLayer>(); + auto fn = std::make_unique(); - fn->configure(cond_alloc->buffer(), cond_backend_descr, input1_alloc->buffer(), - input1_backend_descr, input2_alloc->buffer(), input2_backend_descr, - output_alloc->buffer(), output_backend_descr); + fn->configure(condition_tensor, true_tensor, false_tensor, output_tensor); - _execution_builder->append(std::move(fn)); + _return_fn = std::move(fn); } ``` -### TensorRegister (in some cases) - -This component registers tensors. Most tensors will be automatically registered internally. There -are some exceptions, however, where additional implementations are required. It is the case when a -tensor is treated unusually in its backend. - -The kernel of some operation has weights in `HWIO` as layout(data format) in case of that input's -layout is `NHWC`. And, for `NCHW`, weights is `OIHW`. But TFLite model has weigths, `OHWI` for -`NHWC` and `OIHW` for `NCHW`. Therefore, to register the appropriate tensor on the backend, you have -to implement it additionally. - ### ConstantInitializer (in some cases) This component registers function initializing constant tensors and initialize constant tensor -layer. This is similar to TensorRegister. Most tensors will be automatically registered internally. -And there are some exceptions. +layer. Most tensors will be automatically registered internally. And there are some exceptions. #### cpu diff --git a/docs/howto/how-to-use-specific-backend.md b/docs/howto/how-to-use-specific-backend.md new file mode 100644 index 0000000..32e1b83 --- /dev/null +++ b/docs/howto/how-to-use-specific-backend.md @@ -0,0 +1,40 @@ +# How to Use Specific Backend during Inference + +ONE runtime has many ways to use specific backend during inference + +## Using NNFW API + +### [nnfw_set_available_backends](https://github.com/Samsung/ONE/blob/c46ddc04abdb58323fbd38389e6927f003bfaea1/runtime/onert/api/include/nnfw.h#L458) +- Multiple backends can be set and they must be separated by a semicolon (ex: "acl_cl;cpu"). +- For each backend string, `libbackend_{backend}.so` will be dynamically loaded during nnfw_prepare. +- Among the multiple backends, the 1st element is used as the default backend. + +### [nnfw_set_op_backend](https://github.com/Samsung/ONE/blob/c46ddc04abdb58323fbd38389e6927f003bfaea1/runtime/onert/api/include/nnfw.h#L476) +- The backend for op has higher priority than available backends specified by nnfw_set_available_backends. + +## Using Environment Variable + +### 1. BACKENDS +- Same as `nnfw_set_available_backends` +- Example +```bash +BACKENDS=cpu ./Product/out/bin/nnpackage_run ... +``` + +### 2. OP_BACKEND_[OP_TYPE] +- Same as `nnfw_set_op_backend` +- Set backend for specific operator type +- Example + - Execute `Conv2D` operator on ruy backend and others on cpu backend +```bash +OP_BACKEND_Conv2D=ruy BACKENDS="cpu;ruy" ./Product/out/bin/nnpackage_run ... +``` + +### 3. OP_BACKEND_MAP +- Set backend for specific operator by its index +- Format : `=;=...` +- Example + - Execute `operator 10` on `acl_cl` backend and others on `acl_neon` backend +```bash +OP_BACKEND_MAP="10=acl_cl" BACKENDS="acl_neon;acl_cl" ./Product/out/bin/nnpackage_run ... +``` diff --git a/docs/howto/index.rst b/docs/howto/index.rst index c84902a..faeedbf 100644 --- a/docs/howto/index.rst +++ b/docs/howto/index.rst @@ -10,19 +10,22 @@ How To :maxdepth: 2 :caption: Contents: - ./how-to-add-a-new-operation.md ./how-to-build-compiler.md ./how-to-build-package.md ./how-to-build-runtime.md ./how-to-build-runtime-tizen-gbs-rpi4.md ./how-to-build-runtime-using-prebuilt-docker-image.md - ./how-to-cross-build-runtime-for-arm.md ./how-to-cross-build-runtime-for-aarch64.md ./how-to-cross-build-runtime-for-android.md - ./how-to-contribute.md - ./how-to-make-an-application-with-runtime.md - ./how-to-remote-debugging-with-visual-studio-code.md + ./how-to-cross-build-runtime-for-arm.md ./how-to-run-package.md + ./how-to-make-an-application-with-runtime.md ./how-to-use-api.md - ./how-to-use-nnfw-api.md ./how-to-use-nnapi-binding.md + ./how-to-use-nnfw-api.md + ./how-to-use-specific-backend.md + ./how-to-contribute.md + ./how-to-remote-debugging-with-visual-studio-code.md + ./how-to-add-a-new-operation.md + ./how-to-introduce-a-new-operation-into-compiler.md + ./how-to-introduce-a-new-operation-into-runtime.md diff --git a/docs/release/1.10/index.rst b/docs/release/1.10/index.rst new file mode 100644 index 0000000..bc415fb --- /dev/null +++ b/docs/release/1.10/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.0 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.10.0.md diff --git a/docs/release/1.11/index.rst b/docs/release/1.11/index.rst new file mode 100644 index 0000000..2e4544a --- /dev/null +++ b/docs/release/1.11/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.0 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.11.0.md diff --git a/docs/release/1.11/release-note-1.11.1.md b/docs/release/1.11/release-note-1.11.1.md deleted file mode 100644 index 9efedf6..0000000 --- a/docs/release/1.11/release-note-1.11.1.md +++ /dev/null @@ -1,7 +0,0 @@ -# Release Note 1.11.1 - -## ONE Runtime - -### Hot Fixes - -- Fix segfault due to the wrong BCQGather DynamicShapeInferer's behavior diff --git a/docs/release/1.12/index.rst b/docs/release/1.12/index.rst new file mode 100644 index 0000000..68b4c73 --- /dev/null +++ b/docs/release/1.12/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.0 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.12.0.md diff --git a/docs/release/1.12/release-note-1.12.0.md b/docs/release/1.12/release-note-1.12.0.md new file mode 100644 index 0000000..1f13bc4 --- /dev/null +++ b/docs/release/1.12/release-note-1.12.0.md @@ -0,0 +1,28 @@ +# Release Note 1.12.0 + +## ONE Compiler + +### Compiler Frontend + +- Add optimization pass: ReplaceMulAddWithDepthwiseConvPass, SubstitutePackToReshape, RemoveRedundantTranspose, ShuffleWeightTo16x1Float32Pass +- Add quantization for InstanceNorm. +- Fix bug of `one-import-bcq` command for `--v1`, `--v2` arguments. +- Fix FuseBCQPass to work with inter-subgraphs in the model file and minor BCQ related optimizations. + +## ONE Runtime + +### Runtime backend operation supports more operations and types + +- CPU backend + - Concat: int8 + - DepthToSpace: float, uint8, int8 + - LeakyRelu: float +- ACL-CL backend + - ArgMin: float, uint8, int8 +- ACL-NEON backend + - ArgMax: int8 + - ArgMin: float, uint8, int8 + +### nnpackage defines configuration file + +- Allow users to set configuration variable via conf file. For more information, See [nnpackage spec](../../../nnpackage/spec) diff --git a/docs/release/1.5/index.rst b/docs/release/1.5/index.rst new file mode 100644 index 0000000..0764bf2 --- /dev/null +++ b/docs/release/1.5/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.0 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.5.0.md diff --git a/docs/release/1.6/index.rst b/docs/release/1.6/index.rst new file mode 100644 index 0000000..79389cf --- /dev/null +++ b/docs/release/1.6/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.0 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.6.0.md diff --git a/docs/release/1.7/index.rst b/docs/release/1.7/index.rst new file mode 100644 index 0000000..65a839f --- /dev/null +++ b/docs/release/1.7/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.0 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.7.0.md diff --git a/docs/release/1.7/release-note-1.7.0.md b/docs/release/1.7/release-note-1.7.0.md new file mode 100644 index 0000000..c1a4f50 --- /dev/null +++ b/docs/release/1.7/release-note-1.7.0.md @@ -0,0 +1,46 @@ +## Feature Highlights + +- **ONE** Compiler + - Compiler supports more operations + - New command line interface for user interface consistancy +- **ONE** Runtime + - Runtime CPU backend supports more operations + - Runtime CPU backend supports more quant8 operations + - API changes + - New optimization + +## ONE Compiler + +### Compiler supports more operations + +- MatrixDiag, MatrixSetDiag, ReverseSequence, ReverseV2, SegmentSum, SelectV2, SparseToDense, Where + +### New command line interface for user interface consistancy + +- one-import: imports conventional model files to circle + - one-import-tf: imports TensorFlow model to circle + - one-import-tflite: imports TensorFlow lite model to circle +- one-optimize: circle optimize command +- one-quantize: circle quantize command + - supports float32 to uint8, layer wise (for Conv series) +- one-pack: package command +- one-prepare-venv: prepares python virtual environment for importing TensorFlow model +- one-codegen: backend(if available) code generator + +## ONE Runtime + +### Runtime CPU backend supports more operations + +- LogSoftmax, SpaceToBatchND + +### Runtime CPU backend supports more quant8 operations + +- Logistic, Mul, Tanh, SpaceToBatchND, Transpose, Sub, Max, Min, Less, Greater, GreaterEqual, LessEqual, Equal, NotEqual + +### API changes + +- Introduce basic asynchronous execution API + +### New optimization + +- Remove dynamic tensor overhead from static models diff --git a/docs/release/1.8/index.rst b/docs/release/1.8/index.rst new file mode 100644 index 0000000..4dc1d5b --- /dev/null +++ b/docs/release/1.8/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.0 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.8.0.md diff --git a/docs/release/1.9/index.rst b/docs/release/1.9/index.rst new file mode 100644 index 0000000..d77012c --- /dev/null +++ b/docs/release/1.9/index.rst @@ -0,0 +1,14 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.0 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.9.0.md + ./release-note-1.9.1.md diff --git a/docs/release/index.rst b/docs/release/index.rst index bb542bc..1a5a780 100644 --- a/docs/release/index.rst +++ b/docs/release/index.rst @@ -15,3 +15,11 @@ Release ./1.2/index ./1.3/index ./1.4/index + ./1.5/index + ./1.6/index + ./1.7/index + ./1.8/index + ./1.9/index + ./1.10/index + ./1.11/index + ./1.12/index diff --git a/docs/runtime/index.rst b/docs/runtime/index.rst index d44f822..e80dfc8 100644 --- a/docs/runtime/index.rst +++ b/docs/runtime/index.rst @@ -12,8 +12,9 @@ Runtime ./api.md ./core.md - ./compute.md + ./controlflow-operations.md ./executors.md - ./backend-api.md ./heterogeneous-execution.md - ./controlflow-operations.md + ./backend-api.md + ./compute.md + ./supported-operations-backend.md diff --git a/docs/runtime/supported-operations-backend.md b/docs/runtime/supported-operations-backend.md index bcc6355..04ece97 100644 --- a/docs/runtime/supported-operations-backend.md +++ b/docs/runtime/supported-operations-backend.md @@ -1,6 +1,6 @@ # Supported Operations and backend -As of 2020-11-10 +As of 2020-12-07 ### Raw-data format (float32, int32, boolean, etc) @@ -10,7 +10,7 @@ Abs | O | O | O Add | O | O | O AddN | O | | ArgMax | O | O | O -ArgMin | O | | +ArgMin | O | O | O AvgPool2D | O | O | O BatchMatmul | O | | BatchToSpaceND | O | O | O @@ -19,7 +19,7 @@ Concat | O | O | O Conv2D | O | O | O Cos | O | | Custom | O | | -DepthToSpace | | O | O +DepthToSpace | O | O | O DepthwiseConv2D | O | O | O Div | O | O | O EmbeddingLookup | | O | O @@ -37,7 +37,7 @@ If | O | | InstanceNormalize | | O | O L2Normalization | O | O | O L2Pool | | O | O -LeakyRelu | | O | O +LeakyRelu | O | O | O Less | O | O | O LessEqual | O | O | O LocalResponseNormalize | | O | O @@ -89,6 +89,7 @@ SpaceToDepth | O | O | O Split | O | O | O SplitV | O | | Sqrt | O | O | O +Square | O | | | SquaredDifference | O | O | O Squeeze | O | O | O StridedSlice | O | O | O @@ -110,14 +111,14 @@ Operation | CPU | ACL-CL | ACL-NEON -- | -- | -- | -- Add | O | O | O ArgMax | O | O | O -ArgMin | O | | +ArgMin | O | O | O AvgPool2D | O | O | O BatchToSpaceND | O | O | O Cast | O | O | Concat | O | O | O Conv2D | O | O | O Custom | O | | -DepthToSpace | | O | O +DepthToSpace | O | O | O DepthwiseConv2D | O | O | O Dequantize | O | O | O EmbeddingLookup | | O | O @@ -170,6 +171,12 @@ Unpack(Unstack) | | O | O ### Quantization format (int8) +Operation | CPU | ACL-CL | ACL-NEON +-- | -- | -- | -- +ArgMax | O | O | O +ArgMin | O | O | O +Concat | O | | +DepthToSpace | O | | Dequantize | O | | Rank | O | | Shape | O | | diff --git a/infra/cmake/packages/Fp16SourceConfig.cmake b/infra/cmake/packages/Fp16SourceConfig.cmake new file mode 100644 index 0000000..3623fd2 --- /dev/null +++ b/infra/cmake/packages/Fp16SourceConfig.cmake @@ -0,0 +1,21 @@ +function(_Fp16Source_import) + if(NOT ${DOWNLOAD_FP16}) + set(Fp16Source_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_FP16}) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + # fp16 commit in xnnpack 8b283aa30a31 + envoption(FP16_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/FP16/archive/3c54eacb74f6f5e39077300c5564156c424d77ba.tar.gz) + ExternalSource_Download(FP16 + DIRNAME FP16 + URL ${FP16_URL}) + + set(Fp16Source_DIR ${FP16_SOURCE_DIR} PARENT_SCOPE) + set(Fp16Source_FOUND TRUE PARENT_SCOPE) +endfunction(_Fp16Source_import) + +_Fp16Source_import() diff --git a/infra/cmake/packages/FxdivSourceConfig.cmake b/infra/cmake/packages/FxdivSourceConfig.cmake new file mode 100644 index 0000000..4427bf2 --- /dev/null +++ b/infra/cmake/packages/FxdivSourceConfig.cmake @@ -0,0 +1,21 @@ +function(_FxdivSource_import) + if(NOT ${DOWNLOAD_FXDIV}) + set(FxdivSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_FXDIV}) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + # fxdiv commit in xnnpack 8b283aa30a31 + envoption(FXDIV_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/FXdiv/archive/f8c5354679ec2597792bc70a9e06eff50c508b9a.tar.gz) + ExternalSource_Download(FXDIV + DIRNAME FXDIV + URL ${FXDIV_URL}) + + set(FxdivSource_DIR ${FXDIV_SOURCE_DIR} PARENT_SCOPE) + set(FxdivSource_FOUND TRUE PARENT_SCOPE) +endfunction(_FxdivSource_import) + +_FxdivSource_import() diff --git a/infra/cmake/packages/PsimdSourceConfig.cmake b/infra/cmake/packages/PsimdSourceConfig.cmake new file mode 100644 index 0000000..1da5cdc --- /dev/null +++ b/infra/cmake/packages/PsimdSourceConfig.cmake @@ -0,0 +1,21 @@ +function(_PsimdSource_import) + if(NOT ${DOWNLOAD_PSIMD}) + set(PsimdSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_PSIMD}) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + # psimd commit in xnnpack 8b283aa30a31 + envoption(PSIMD_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/psimd/archive/072586a71b55b7f8c584153d223e95687148a900.tar.gz) + ExternalSource_Download(PSIMD + DIRNAME PSIMD + URL ${PSIMD_URL}) + + set(PsimdSource_DIR ${PSIMD_SOURCE_DIR} PARENT_SCOPE) + set(PsimdSource_FOUND TRUE PARENT_SCOPE) +endfunction(_PsimdSource_import) + +_PsimdSource_import() diff --git a/infra/cmake/packages/PthreadpoolSourceConfig.cmake b/infra/cmake/packages/PthreadpoolSourceConfig.cmake new file mode 100644 index 0000000..4e1910a --- /dev/null +++ b/infra/cmake/packages/PthreadpoolSourceConfig.cmake @@ -0,0 +1,21 @@ +function(_PthreadpoolSource_import) + if(NOT ${DOWNLOAD_PTHREADPOOL}) + set(PthreadpoolSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_PTHREADPOOL}) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + # pthreadpool commit in xnnpack 8b283aa30a31 + envoption(PTHREADPOOL_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/pthreadpool/archive/029c88620802e1361ccf41d1970bd5b07fd6b7bb.tar.gz) + ExternalSource_Download(PTHREADPOOL + DIRNAME PTHREADPOOL + URL ${PTHREADPOOL_URL}) + + set(PthreadpoolSource_DIR ${PTHREADPOOL_SOURCE_DIR} PARENT_SCOPE) + set(PthreadpoolSource_FOUND TRUE PARENT_SCOPE) +endfunction(_PthreadpoolSource_import) + +_PthreadpoolSource_import() diff --git a/infra/cmake/packages/XnnpackSourceConfig.cmake b/infra/cmake/packages/XnnpackSourceConfig.cmake new file mode 100644 index 0000000..36a9204 --- /dev/null +++ b/infra/cmake/packages/XnnpackSourceConfig.cmake @@ -0,0 +1,21 @@ +function(_XnnpackSource_import) + if(NOT ${DOWNLOAD_XNNPACK}) + set(XnnpackSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_XNNPACK}) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + # xnnpack commit in tflite v2.3 + envoption(XNNPACK_URL ${EXTERNAL_DOWNLOAD_SERVER}/google/XNNPACK/archive/8b283aa30a3186c6e640aed520543e9c067132d.tar.gz) + ExternalSource_Download(XNNPACK + DIRNAME XNNPACK + URL ${XNNPACK_URL}) + + set(XnnpackSource_DIR ${XNNPACK_SOURCE_DIR} PARENT_SCOPE) + set(XnnpackSource_FOUND TRUE PARENT_SCOPE) +endfunction(_XnnpackSource_import) + +_XnnpackSource_import() diff --git a/infra/command/format b/infra/command/format index 7f37e06..c57e6dc 100644 --- a/infra/command/format +++ b/infra/command/format @@ -132,8 +132,6 @@ function check_cpp_files() { fi CLANG_FORMAT_CANDIDATES+=("clang-format-3.9") - CLANG_FORMAT_CANDIDATES+=("clang-format") - for CLANG_FORMAT_CANDIDATE in ${CLANG_FORMAT_CANDIDATES[@]}; do if command_exists ${CLANG_FORMAT_CANDIDATE} ; then CLANG_FORMAT="${CLANG_FORMAT_CANDIDATE}" @@ -142,14 +140,29 @@ function check_cpp_files() { done if [[ -z ${CLANG_FORMAT} ]]; then - echo "[ERROR] clang-format is unavailable" + echo "[ERROR] clang-format-3.9 is unavailable" echo - echo "Please install clang-format before running format check" + echo " Please install clang-format-3.9 before running format check" exit 1 fi + # Migration to clang-format-8 + # TODO Remove this after migration to clang-format-8 + CLANG_FORMAT_8="clang-format-8" + if ! command_exists $CLANG_FORMAT_8_CANDIDATE; then + echo "[ERROR] clang-format-8 is unavailable" + echo + echo " Please install clang-format-8 before running format check" + echo " (or use latest docker image if you are using docker for format check)" + exit 1 + fi + for DIR_CLANG_FORMAT_8 in $(git ls-files -co --exclude-standard '*/.clang-format'); do + DIRECTORIES_USE_CLANG_FORMAT_8+=($(dirname "${DIR_CLANG_FORMAT_8}")) + done + # Check c++ files FILES_TO_CHECK_CPP=() + FILES_TO_CHECK_CPP_BY_CLANG_FORMAT_8=() for f in ${FILES_TO_CHECK[@]}; do # Manually ignore style checking if [[ ${f} == +(*/NeuralNetworks.h|*/NeuralNetworksExtensions.h) ]]; then @@ -158,13 +171,28 @@ function check_cpp_files() { # File extension to check if [[ ${f} == +(*.h|*.hpp|*.cpp|*.cc|*.c|*.cl) ]]; then - FILES_TO_CHECK_CPP+=("${f}") + + # Check clang-format-8 target files first + # TODO Remove this after migration to clang-format-8 + FOUND_CLANG_8=0 + for USE_CLANG_FORMAT_8 in ${DIRECTORIES_USE_CLANG_FORMAT_8[@]}; do + if [[ $f = $USE_CLANG_FORMAT_8* ]]; then + FILES_TO_CHECK_CPP_BY_CLANG_FORMAT_8+=("$f") + FOUND_CLANG_8=1 + break + fi + done + + if [[ $FOUND_CLANG_8 -ne 1 ]]; then + FILES_TO_CHECK_CPP+=("${f}") + fi fi done # Skip by '.FORMATDENY' file for s in ${DIRECTORIES_NOT_TO_BE_TESTED[@]}; do FILES_TO_CHECK_CPP=(${FILES_TO_CHECK_CPP[*]/$s*/}) + FILES_TO_CHECK_CPP_BY_CLANG_FORMAT_8=(${FILES_TO_CHECK_CPP_BY_CLANG_FORMAT_8[*]/$s*/}) done if [[ ${#FILES_TO_CHECK_CPP} -ne 0 ]]; then @@ -174,6 +202,16 @@ function check_cpp_files() { INVALID_EXIT=${EXIT_CODE} fi fi + + # Check by clang-format-8 + # TODO Remove this after migration to clang-format-8 + if [[ ${#FILES_TO_CHECK_CPP_BY_CLANG_FORMAT_8} -ne 0 ]]; then + ${CLANG_FORMAT_8} -i ${FILES_TO_CHECK_CPP_BY_CLANG_FORMAT_8[@]} + EXIT_CODE=$? + if [[ ${EXIT_CODE} -ne 0 ]]; then + INVALID_EXIT=${EXIT_CODE} + fi + fi } function check_python_files() { diff --git a/infra/docker/bionic/Dockerfile b/infra/docker/bionic/Dockerfile index 6a5f64a..15a91d7 100644 --- a/infra/docker/bionic/Dockerfile +++ b/infra/docker/bionic/Dockerfile @@ -30,7 +30,9 @@ RUN apt-get update && apt-get -qqy install libboost-all-dev libgflags-dev libgoo RUN apt-get update && apt-get -qqy install libprotobuf-dev protobuf-compiler # Additonal tools -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -qqy install doxygen graphviz wget zip unzip clang-format-3.9 python3 python3-pip python3-venv hdf5-tools pylint +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive \ + apt-get -qqy install doxygen graphviz wget zip unzip clang-format-3.9 clang-format-8 python3 python3-pip python3-venv hdf5-tools pylint curl RUN pip3 install --upgrade pip RUN pip3 install yapf==0.22.0 numpy @@ -49,9 +51,15 @@ RUN update-alternatives --install /usr/bin/aarch64-linux-gnu-gcc aarch64-linux-g --slave /usr/bin/aarch64-linux-gnu-g++ aarch64-linux-gnu-g++ /usr/bin/aarch64-linux-gnu-g++-8 \ --slave /usr/bin/aarch64-linux-gnu-gcov aarch64-linux-gnu-gcov /usr/bin/aarch64-linux-gnu-gcov-8 -# Install lcov 1.13-4 for gcc-8 support (installed lcov 1.13-3 can't support gcc-8) -RUN wget http://launchpadlibrarian.net/370213541/lcov_1.13-4_all.deb -RUN dpkg -i lcov_1.13-4_all.deb +# Install lcov 1.14-2 for gcc-8 support +# Default version lcov 1.13-3 can't support gcc-8 +# lcov 1.13-4 with gcc-8 have bug: reports no coverage for class declaration +WORKDIR /root/lcov +RUN wget http://archive.ubuntu.com/ubuntu/pool/universe/l/lcov/lcov_1.14-2_all.deb +RUN apt-get update && apt-get -qqy install libperlio-gzip-perl libjson-perl +RUN dpkg -i lcov_1.14-2_all.deb +WORKDIR /root +RUN rm -rf /root/lcov # Build and install google test static libraries WORKDIR /root/gtest diff --git a/infra/docker/focal/Dockerfile b/infra/docker/focal/Dockerfile index 7f5a1b9..cccf304 100644 --- a/infra/docker/focal/Dockerfile +++ b/infra/docker/focal/Dockerfile @@ -29,7 +29,9 @@ RUN apt-get update && apt-get -qqy install libboost-all-dev libgflags-dev libgoo RUN apt-get update && apt-get -qqy install libprotobuf-dev protobuf-compiler # Additonal tools (except clang-format-3.9) -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -qqy install doxygen graphviz wget zip unzip python3 python3-pip python3-venv hdf5-tools pylint +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive \ + apt-get -qqy install doxygen graphviz wget zip unzip clang-format-8 python3 python3-pip python3-venv hdf5-tools pylint curl RUN pip3 install --upgrade pip RUN pip3 install yapf==0.22.0 numpy diff --git a/infra/docker/xenial/Dockerfile b/infra/docker/xenial/Dockerfile index 052cc4f..ae3c464 100644 --- a/infra/docker/xenial/Dockerfile +++ b/infra/docker/xenial/Dockerfile @@ -19,7 +19,8 @@ RUN apt-get update && apt-get -qqy install libboost-all-dev libgflags-dev libgoo RUN apt-get update && apt-get -qqy install libprotobuf-dev protobuf-compiler # Additonal tools -RUN apt-get update && apt-get -qqy install doxygen graphviz wget unzip clang-format-3.9 python3 python3-pip python3-venv hdf5-tools pylint +RUN apt-get update && \ + apt-get -qqy install doxygen graphviz wget unzip clang-format-3.9 clang-format-8 python3 python3-pip python3-venv hdf5-tools pylint curl RUN pip3 install --upgrade pip RUN pip3 install yapf==0.22.0 numpy diff --git a/infra/nnfw/cmake/CfgOptionFlags.cmake b/infra/nnfw/cmake/CfgOptionFlags.cmake index 450aa21..f6ad0ca 100644 --- a/infra/nnfw/cmake/CfgOptionFlags.cmake +++ b/infra/nnfw/cmake/CfgOptionFlags.cmake @@ -15,12 +15,7 @@ option(ENABLE_COVERAGE "Build for coverage test" OFF) option(BUILD_EXT_MULTITHREAD "Build external build using multi thread" ON) option(BUILD_ONERT "Build onert" ON) option(BUILD_LOGGING "Build logging runtime" ON) -CMAKE_DEPENDENT_OPTION(BUILD_RUNTIME_NNAPI_TEST "Build Runtime NN API Generated Test" - # Set BUILD_RUNTIME_NNAPI_TEST as ON - # if CMAKE_COMPILER_IS_GNUCC AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.2 - ON "CMAKE_COMPILER_IS_GNUCC;NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.2" - # Otherwise set BUILD_RUNTIME_NNAPI_TEST as OFF - OFF) +option(BUILD_RUNTIME_NNAPI_TEST "Build Runtime NN API Generated Test" ON) option(BUILD_RUNTIME_NNFW_API_TEST "Build Runtime NNFW API Tests" ON) option(BUILD_TFLITE_RUN "Build tflite-run" ON) option(BUILD_TFLITE_VANILLA_RUN "Build tflite-vanilla-run" OFF) @@ -53,7 +48,6 @@ option(BUILD_MLAPSE "Build mlapse benchmark toolkit" OFF) # option(BUILD_KBENCHMARK "Build kernel benchmark tool" OFF) option(BUILD_OPENCL_TOOL "Build OpenCL tool" OFF) -option(BUILD_NNAPI_QUICKCHECK "Build NN API Quickcheck tools" OFF) option(BUILD_TFLITE_ACCURACY "Build tflite accuracy tool" OFF) # # Default external libraries source download and build configuration @@ -78,6 +72,17 @@ option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" ON) option(BUILD_RUY "Build ruy library from the downloaded source" ON) option(BUILD_CPUINFO "Build cpuinfo library from the downloaded source" ON) option(PROFILE_RUY "Enable ruy library profiling" OFF) +option(DOWNLOAD_XNNPACK "Download xnnpack source" ON) +option(BUILD_XNNPACK "Build xnnpack library from the downloaded source" ON) +option(DOWNLOAD_PTHREADPOOL "Download pthreadpool source" ON) +option(BUILD_PTHREADPOOL "Build pthreadpool library from the source" ON) +option(DOWNLOAD_PSIMD "Download psimd source" ON) +option(BUILD_PSIMD "Build psimd library from the source" ON) +option(DOWNLOAD_FP16 "Download fp16 source" ON) +option(BUILD_FP16 "Build fp16 library from the source" ON) +option(DOWNLOAD_FXDIV "Download fxdiv source" ON) +option(BUILD_FXDIV "Build fxdiv library from the source" ON) + # ## Default sample build configuration diff --git a/infra/nnfw/cmake/options/options_aarch64-android.cmake b/infra/nnfw/cmake/options/options_aarch64-android.cmake index d8eceef..9332f52 100644 --- a/infra/nnfw/cmake/options/options_aarch64-android.cmake +++ b/infra/nnfw/cmake/options/options_aarch64-android.cmake @@ -3,15 +3,10 @@ # NOTE BUILD_ANDROID_TFLITE(JNI lib) is disabled due to BuiltinOpResolver issue. # tensorflow-lite does not build BuiltinOpResolver but JNI lib need it # Related Issue : #1403 -option(BUILD_ANDROID_TFLITE "Enable android support for TensorFlow Lite" ON) +option(BUILD_ANDROID_TFLITE "Enable android support for TensorFlow Lite" OFF) option(BUILD_ANDROID_BENCHMARK_APP "Enable Android Benchmark App" ON) option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) # Need boost library option(DOWNLOAD_BOOST "Download boost source" ON) option(BUILD_BOOST "Build boost source" ON) -option(BUILD_RUNTIME_NNAPI_TEST "Build Runtime NN API Generated Test" OFF) -option(BUILD_NNAPI_TEST "Build nnapi_test" OFF) -option(BUILD_NNPACKAGE_RUN "Build nnpackge_run" ON) -option(BUILD_TFLITE_RUN "Build tflite-run" ON) -option(BUILD_TFLITE_LOADER_TEST_TOOL "Build tflite loader testing tool" OFF) option(BUILD_LOGGING "Build logging runtime" OFF) diff --git a/infra/nnfw/cmake/options/options_x86_64-darwin.cmake b/infra/nnfw/cmake/options/options_x86_64-darwin.cmake index 97642e6..135cfbf 100644 --- a/infra/nnfw/cmake/options/options_x86_64-darwin.cmake +++ b/infra/nnfw/cmake/options/options_x86_64-darwin.cmake @@ -3,3 +3,4 @@ # option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" OFF) option(DOWNLOAD_ARMCOMPUTE "Download ARM Compute source" OFF) +option(BUILD_XNNPACK "Build XNNPACK" OFF) diff --git a/infra/nnfw/cmake/options/options_x86_64-linux.cmake b/infra/nnfw/cmake/options/options_x86_64-linux.cmake index 97642e6..135cfbf 100644 --- a/infra/nnfw/cmake/options/options_x86_64-linux.cmake +++ b/infra/nnfw/cmake/options/options_x86_64-linux.cmake @@ -3,3 +3,4 @@ # option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" OFF) option(DOWNLOAD_ARMCOMPUTE "Download ARM Compute source" OFF) +option(BUILD_XNNPACK "Build XNNPACK" OFF) diff --git a/infra/nnfw/cmake/options/options_x86_64-tizen.cmake b/infra/nnfw/cmake/options/options_x86_64-tizen.cmake index bf8b280..1e83e4e 100644 --- a/infra/nnfw/cmake/options/options_x86_64-tizen.cmake +++ b/infra/nnfw/cmake/options/options_x86_64-tizen.cmake @@ -8,3 +8,5 @@ option(DOWNLOAD_ARMCOMPUTE "Download ARM Compute source" OFF) option(BUILD_LOGGING "Build logging runtime" OFF) option(GENERATE_RUNTIME_NNAPI_TESTS "Generate NNAPI operation gtest" OFF) option(ENVVAR_ONERT_CONFIG "Use environment variable for onert configuration" OFF) + +option(BUILD_XNNPACK "Build XNNPACK" OFF) diff --git a/infra/nnfw/cmake/packages/CpuInfoConfig.cmake b/infra/nnfw/cmake/packages/CpuInfoConfig.cmake index 408cf85..99ee795 100644 --- a/infra/nnfw/cmake/packages/CpuInfoConfig.cmake +++ b/infra/nnfw/cmake/packages/CpuInfoConfig.cmake @@ -20,6 +20,8 @@ function(_CpuInfo_Build) set(CPUINFO_BUILD_MOCK_TESTS OFF CACHE BOOL "Build cpuinfo micro-benchmarks") add_extdirectory("${CpuInfoSource_DIR}" cpuinfo EXCLUDE_FROM_ALL) set_target_properties(cpuinfo PROPERTIES POSITION_INDEPENDENT_CODE ON) + # Suppress warnings generated by clog + set_target_properties(clog PROPERTIES COMPILE_FLAGS "-Wno-unused-result") set(CpuInfoSource_DIR ${CpuInfoSource_DIR} PARENT_SCOPE) set(CpuInfo_FOUND TRUE PARENT_SCOPE) endfunction(_CpuInfo_Build) diff --git a/infra/nnfw/cmake/packages/Fp16Config.cmake b/infra/nnfw/cmake/packages/Fp16Config.cmake new file mode 100644 index 0000000..6c31613 --- /dev/null +++ b/infra/nnfw/cmake/packages/Fp16Config.cmake @@ -0,0 +1,30 @@ +function(_Fp16_Build) + nnas_find_package(Fp16Source QUIET) + + # NOTE This line prevents multiple definitions of target + if(TARGET fp16) + set(Fp16Source_DIR ${Fp16Source_DIR} PARENT_SCOPE) + set(Fp16_FOUND TRUE PARENT_SCOPE) + return() + endif(TARGET fp16) + + if(NOT Fp16Source_FOUND) + message(STATUS "FP16: Source not found") + set(Fp16_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT Fp16Source_FOUND) + + set(FP16_BUILD_TESTS OFF CACHE BOOL "Build FP16 unit tests") + set(FP16_BUILD_BENCHMARKS OFF CACHE BOOL "Build FP16 micro-benchmarks") + nnas_find_package(PsimdSource) + set(PSIMD_SOURCE_DIR ${PsimdSource_DIR} CACHE STRING "String to disable download PSIMD on fp16") + add_extdirectory("${Fp16Source_DIR}" FP16 EXCLUDE_FROM_ALL) + set(Fp16Source_DIR ${Fp16Source_DIR} PARENT_SCOPE) + set(Fp16_FOUND TRUE PARENT_SCOPE) +endfunction(_Fp16_Build) + +if(BUILD_FP16) + _Fp16_Build() +else() + set(Fp16_FOUND FALSE) +endif() diff --git a/infra/nnfw/cmake/packages/FxdivConfig.cmake b/infra/nnfw/cmake/packages/FxdivConfig.cmake new file mode 100644 index 0000000..6f268ae --- /dev/null +++ b/infra/nnfw/cmake/packages/FxdivConfig.cmake @@ -0,0 +1,29 @@ +function(_Fxdiv_Build) + nnas_find_package(FxdivSource QUIET) + + # NOTE This line prevents multiple definitions of target + if(TARGET fxdiv) + set(FxdivSource_DIR ${FxdivSource_DIR} PARENT_SCOPE) + set(Fxdiv_FOUND TRUE PARENT_SCOPE) + return() + endif(TARGET fxdiv) + + if(NOT FxdivSource_FOUND) + message(STATUS "FXDIV: Source not found") + set(Fxdiv_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT FxdivSource_FOUND) + + set(FXDIV_BUILD_TESTS OFF CACHE BOOL "Build FXdiv unit tests") + set(FXDIV_BUILD_BENCHMARKS OFF CACHE BOOL "Build FXdiv micro-benchmarks") + + add_extdirectory("${FxdivSource_DIR}" FXDIV EXCLUDE_FROM_ALL) + set(FxdivSource_DIR ${FxdivSource_DIR} PARENT_SCOPE) + set(Fxdiv_FOUND TRUE PARENT_SCOPE) +endfunction(_Fxdiv_Build) + +if(BUILD_FXDIV) + _Fxdiv_Build() +else() + set(Fxdiv_FOUND FALSE) +endif() diff --git a/infra/nnfw/cmake/packages/PsimdConfig.cmake b/infra/nnfw/cmake/packages/PsimdConfig.cmake new file mode 100644 index 0000000..a3587b6 --- /dev/null +++ b/infra/nnfw/cmake/packages/PsimdConfig.cmake @@ -0,0 +1,26 @@ +function(_Psimd_Build) + nnas_find_package(PsimdSource QUIET) + + # NOTE This line prevents multiple definitions of target + if(TARGET psimd) + set(PsimdSource_DIR ${PsimdSource_DIR} PARENT_SCOPE) + set(Psimd_FOUND TRUE PARENT_SCOPE) + return() + endif(TARGET psimd) + + if(NOT PsimdSource_FOUND) + message(STATUS "PSIMD: Source not found") + set(Psimd_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT PsimdSource_FOUND) + + add_extdirectory("${PsimdSource_DIR}" PSIMD EXCLUDE_FROM_ALL) + set(PsimdSource_DIR ${PsimdSource_DIR} PARENT_SCOPE) + set(Psimd_FOUND TRUE PARENT_SCOPE) +endfunction(_Psimd_Build) + +if(BUILD_PSIMD) + _Psimd_Build() +else() + set(Psimd_FOUND FALSE) +endif() diff --git a/infra/nnfw/cmake/packages/PthreadpoolConfig.cmake b/infra/nnfw/cmake/packages/PthreadpoolConfig.cmake new file mode 100644 index 0000000..6283826 --- /dev/null +++ b/infra/nnfw/cmake/packages/PthreadpoolConfig.cmake @@ -0,0 +1,35 @@ +function(_Pthreadpool_Build) + nnas_find_package(PthreadpoolSource QUIET) + + # NOTE This line prevents multiple definitions of target + if(TARGET pthreadpool) + set(PthreadpoolSource_DIR ${PthreadpoolSource_DIR} PARENT_SCOPE) + set(Pthreadpool_FOUND TRUE PARENT_SCOPE) + return() + endif(TARGET pthreadpool) + + if(NOT PthreadpoolSource_FOUND) + message(STATUS "PTHREADPOOL: Source not found") + set(Pthreadpool_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT PthreadpoolSource_FOUND) + + SET(PTHREADPOOL_BUILD_TESTS OFF CACHE BOOL "Build pthreadpool unit tests") + SET(PTHREADPOOL_BUILD_BENCHMARKS OFF CACHE BOOL "Build pthreadpool micro-benchmarks") + + nnas_find_package(FxdivSource) + set(FXDIV_SOURCE_DIR ${FxdivSource_DIR} CACHE STRING "String to disable download FXDIV") + + add_extdirectory("${PthreadpoolSource_DIR}" PTHREADPOOL EXCLUDE_FROM_ALL) + set_target_properties(pthreadpool PROPERTIES POSITION_INDEPENDENT_CODE ON) + # Suppress warnings generated by pthreadpool + set_target_properties(pthreadpool PROPERTIES COMPILE_FLAGS "-Wno-deprecated-declarations") + set(PthreadpoolSource_DIR ${PthreadpoolSource_DIR} PARENT_SCOPE) + set(Pthreadpool_FOUND TRUE PARENT_SCOPE) +endfunction(_Pthreadpool_Build) + +if(BUILD_PTHREADPOOL) + _Pthreadpool_Build() +else() + set(Pthreadpool_FOUND FALSE) +endif() diff --git a/infra/nnfw/cmake/packages/XnnpackConfig.cmake b/infra/nnfw/cmake/packages/XnnpackConfig.cmake new file mode 100644 index 0000000..191a28f --- /dev/null +++ b/infra/nnfw/cmake/packages/XnnpackConfig.cmake @@ -0,0 +1,38 @@ +function(_Xnnpack_Build) + nnas_find_package(XnnpackSource QUIET) + nnfw_find_package(Fxdiv QUIET) + nnfw_find_package(CpuInfo QUIET) + nnfw_find_package(Pthreadpool QUIET) + nnfw_find_package(Psimd QUIET) + nnfw_find_package(Fp16 QUIET) + + # NOTE This line prevents multiple definitions of cpuinfo target + if(TARGET XNNPACK) + set(XnnpackSource_DIR ${XnnpackSource_DIR} PARENT_SCOPE) + set(Xnnpack_FOUND TRUE PARENT_SCOPE) + return() + endif(TARGET XNNPACK) + + if(NOT XnnpackSource_FOUND) + message(STATUS "XNNPACK: Source not found") + set(Xnnpack_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT XnnpackSource_FOUND) + + set(XNNPACK_BUILD_TESTS OFF CACHE BOOL "Build XNNPACK unit tests") + set(XNNPACK_BUILD_BENCHMARKS OFF CACHE BOOL "Build XNNPACK benchmarks") + set(XNNPACK_USE_SYSTEM_LIBS ON CACHE BOOL "Use system-provided dependency libraries") + + add_extdirectory("${XnnpackSource_DIR}" XNNPACK EXCLUDE_FROM_ALL) + set_target_properties(XNNPACK PROPERTIES POSITION_INDEPENDENT_CODE ON) + # Suppress warnings generated by xnnpack + set_target_properties(XNNPACK PROPERTIES COMPILE_FLAGS "-Wno-deprecated-declarations") + set(XnnpackSource_DIR ${XnnpackSource_DIR} PARENT_SCOPE) + set(Xnnpack_FOUND TRUE PARENT_SCOPE) +endfunction(_Xnnpack_Build) + +if(BUILD_XNNPACK) + _Xnnpack_Build() +else(BUILD_XNNPACK) + set(Xnnpack_FOUND FALSE) +endif(BUILD_XNNPACK) diff --git a/infra/nnfw/command/build b/infra/nnfw/command/build index b0301d2..4a3601e 100644 --- a/infra/nnfw/command/build +++ b/infra/nnfw/command/build @@ -8,4 +8,4 @@ if [[ ! -d "${BUILD_PATH}" ]]; then fi cd ${BUILD_PATH} -make "$@" +cmake --build . -- "$@" diff --git a/infra/scripts/build_android_runtime_release.sh b/infra/scripts/build_android_runtime_release.sh index fe933c6..c9a3b1b 100755 --- a/infra/scripts/build_android_runtime_release.sh +++ b/infra/scripts/build_android_runtime_release.sh @@ -18,4 +18,5 @@ fi export TARGET_OS=android export CROSS_BUILD=1 -make -f Makefile.template +export BUILD_TYPE=release +make -f Makefile.template install diff --git a/infra/scripts/docker_build_cross_aarch64_runtime.sh b/infra/scripts/docker_build_cross_aarch64_runtime.sh index 011d14c..607526b 100755 --- a/infra/scripts/docker_build_cross_aarch64_runtime.sh +++ b/infra/scripts/docker_build_cross_aarch64_runtime.sh @@ -22,6 +22,8 @@ else fi # docker image name +# - for xenial, use DOCKER_IMAGE_NAME="nnfw/one-devtools:xenial" +# - for bionic, use DOCKER_IMAGE_NAME="nnfw/one-devtools:bionic" if [[ -z $DOCKER_IMAGE_NAME ]]; then echo "It will use default docker image name" fi diff --git a/infra/scripts/docker_build_cross_arm_runtime.sh b/infra/scripts/docker_build_cross_arm_runtime.sh index 551fb57..07b5ca4 100755 --- a/infra/scripts/docker_build_cross_arm_runtime.sh +++ b/infra/scripts/docker_build_cross_arm_runtime.sh @@ -22,6 +22,8 @@ else fi # docker image name +# - for xenial, use DOCKER_IMAGE_NAME="nnfw/one-devtools:xenial" +# - for bionic, use DOCKER_IMAGE_NAME="nnfw/one-devtools:bionic" if [[ -z $DOCKER_IMAGE_NAME ]]; then echo "It will use default docker image name" fi diff --git a/infra/scripts/docker_build_cross_arm_runtime_release.sh b/infra/scripts/docker_build_cross_arm_runtime_release.sh index 876f318..8d04438 100755 --- a/infra/scripts/docker_build_cross_arm_runtime_release.sh +++ b/infra/scripts/docker_build_cross_arm_runtime_release.sh @@ -22,6 +22,8 @@ else fi # docker image name +# - for xenial, use DOCKER_IMAGE_NAME="nnfw/one-devtools:xenial" +# - for bionic, use DOCKER_IMAGE_NAME="nnfw/one-devtools:bionic" if [[ -z $DOCKER_IMAGE_NAME ]]; then echo "It will use default docker image name" fi diff --git a/infra/scripts/docker_build_cross_coverage.sh b/infra/scripts/docker_build_cross_coverage.sh index f42251b..e03ea75 100755 --- a/infra/scripts/docker_build_cross_coverage.sh +++ b/infra/scripts/docker_build_cross_coverage.sh @@ -22,6 +22,8 @@ else fi # docker image name +# - for xenial, use DOCKER_IMAGE_NAME="nnfw/one-devtools:xenial" +# - for bionic, use DOCKER_IMAGE_NAME="nnfw/one-devtools:bionic" if [[ -z $DOCKER_IMAGE_NAME ]]; then echo "It will use default docker image name" fi diff --git a/infra/scripts/docker_build_nncc.sh b/infra/scripts/docker_build_nncc.sh index 5fd49a4..e65feb5 100755 --- a/infra/scripts/docker_build_nncc.sh +++ b/infra/scripts/docker_build_nncc.sh @@ -35,6 +35,8 @@ if [ -d $ONNXRUNTIME_PREFIX ]; then fi # docker image name +# - for xenial, use DOCKER_IMAGE_NAME="nnfw/one-devtools:xenial" +# - for bionic, use DOCKER_IMAGE_NAME="nnfw/one-devtools:bionic" if [[ -z $DOCKER_IMAGE_NAME ]]; then echo "It will use default docker image name" fi diff --git a/infra/scripts/docker_build_test_x64.sh b/infra/scripts/docker_build_test_x64.sh index 16fcf3f..0d2395b 100755 --- a/infra/scripts/docker_build_test_x64.sh +++ b/infra/scripts/docker_build_test_x64.sh @@ -14,6 +14,8 @@ else fi # docker image name +# - for xenial, use DOCKER_IMAGE_NAME="nnfw/one-devtools:xenial" +# - for bionic, use DOCKER_IMAGE_NAME="nnfw/one-devtools:bionic" if [[ -z $DOCKER_IMAGE_NAME ]]; then echo "It will use default docker image name" fi diff --git a/infra/scripts/docker_build_tizen_cross.sh b/infra/scripts/docker_build_tizen_cross.sh index ee0f183..9a8378f 100755 --- a/infra/scripts/docker_build_tizen_cross.sh +++ b/infra/scripts/docker_build_tizen_cross.sh @@ -22,6 +22,8 @@ else fi # docker image name +# - for xenial, use DOCKER_IMAGE_NAME="nnfw/one-devtools:xenial" +# - for bionic, use DOCKER_IMAGE_NAME="nnfw/one-devtools:bionic" if [[ -z $DOCKER_IMAGE_NAME ]]; then echo "It will use default docker image name" fi diff --git a/infra/scripts/docker_collect_nnpkg_resources.sh b/infra/scripts/docker_collect_nnpkg_resources.sh index 55adaa1..ef6212a 100755 --- a/infra/scripts/docker_collect_nnpkg_resources.sh +++ b/infra/scripts/docker_collect_nnpkg_resources.sh @@ -40,6 +40,8 @@ if [ -d $ONNXRUNTIME_PREFIX ]; then fi # docker image name +# - for xenial, use DOCKER_IMAGE_NAME="nnfw/one-devtools:xenial" +# - for bionic, use DOCKER_IMAGE_NAME="nnfw/one-devtools:bionic" if [[ -z $DOCKER_IMAGE_NAME ]]; then echo "It will use default docker image name" fi diff --git a/infra/scripts/docker_coverage_report.sh b/infra/scripts/docker_coverage_report.sh index 677462d..f0de1de 100755 --- a/infra/scripts/docker_coverage_report.sh +++ b/infra/scripts/docker_coverage_report.sh @@ -8,6 +8,8 @@ CURRENT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_PATH="$CURRENT_PATH/../../" # docker image name +# - for xenial, use DOCKER_IMAGE_NAME="nnfw/one-devtools:xenial" +# - for bionic, use DOCKER_IMAGE_NAME="nnfw/one-devtools:bionic" if [[ -z $DOCKER_IMAGE_NAME ]]; then echo "It will use default docker image name" fi diff --git a/infra/scripts/test_ubuntu_runtime_mixed.sh b/infra/scripts/test_ubuntu_runtime_mixed.sh index 40f59eb..6eab90c 100755 --- a/infra/scripts/test_ubuntu_runtime_mixed.sh +++ b/infra/scripts/test_ubuntu_runtime_mixed.sh @@ -58,5 +58,6 @@ export OP_BACKEND_Conv2D="cpu" export OP_BACKEND_MaxPool2D="acl_cl" export OP_BACKEND_AvgPool2D="acl_neon" export ACL_LAYOUT="NCHW" +export RUY_THREADS=4 NNAPIGTest "acl_cl;acl_neon;cpu" "Product/out/unittest/nnapi_gtest.skip.${TEST_ARCH}-${TEST_OS}.union" "report/mixed" TFLiteModelVerification "acl_cl;acl_neon;cpu" "${TESTLIST_PREFIX}.intersect.txt" "report/mixed" diff --git a/nnpackage/examples/one_op_in_tflite/metadata/MANIFEST b/nnpackage/examples/one_op_in_tflite/metadata/MANIFEST index 1d96cce..3ed12f9 100644 --- a/nnpackage/examples/one_op_in_tflite/metadata/MANIFEST +++ b/nnpackage/examples/one_op_in_tflite/metadata/MANIFEST @@ -1,7 +1,8 @@ { "major-version" : "1", - "minor-version" : "0", + "minor-version" : "1", "patch-version" : "0", + "configs" : [ "config.cfg" ], "models" : [ "add.tflite" ], "model-types" : [ "tflite" ] } diff --git a/nnpackage/examples/one_op_in_tflite/metadata/config.cfg b/nnpackage/examples/one_op_in_tflite/metadata/config.cfg new file mode 100644 index 0000000..776fa70 --- /dev/null +++ b/nnpackage/examples/one_op_in_tflite/metadata/config.cfg @@ -0,0 +1 @@ +BACKENDS="cpu" diff --git a/nnpackage/spec/10_packaging_and_manifest.md b/nnpackage/spec/10_packaging_and_manifest.md index d4e6ec8..4dc3de8 100644 --- a/nnpackage/spec/10_packaging_and_manifest.md +++ b/nnpackage/spec/10_packaging_and_manifest.md @@ -18,11 +18,13 @@ For `model` and `custom_op`, see [20_model_and_operators.md](20_model_and_operat nnpackage ├── custom_op ├── metadata -│   └── MANIFEST +│   ├── MANIFEST +│   └── config.cfg └── mymodel.model ``` - `mymodel.model` is a model file that has computation graph and weights. +- `config.cfg` is a configuration file that has parameters to configure onert. - `metadata` is a directory that contains all metadata including `MANIFEST`. - `MANIFEST` is a collection of attributes about this package. - `custom_op` is a directory that contains implementation objects. @@ -61,6 +63,11 @@ For detail, see [semantic versioning 2.0.0](https://semver.org/) `patch-version` is the patch version of `nnpackage`. +#### configs + +`configs` is an array of configuration file names placed in `metadata` folder. This can be empty or +attribute itself can be omitted. As of now we only support only one item. + #### models `models` is an array of path to model files, which is relative path from top level directory of this package. @@ -84,9 +91,25 @@ Here is an example of `MANIFEST`. ``` { "major-version" : "1", - "minor-version" : "0", + "minor-version" : "1", "patch-version" : "0", + "configs" : [ "model.cfg" ], "models" : [ "mymodel.model", "yourmodel.model" ], "model-types" : [ "tflite", "circle" ] } ``` + +## 5. Configuration file + +Configuration file is a human readable plain text file having one `key=value` in each line. +- `#` is used as comment and will be ignored afterwards. +- all leading and trailing white spaces will be ignored in both `key` and `value`. + +For example +``` +BACKENDS=cpu +# leading/trailing space is ignored + EXCUTOR=Linear # some comment +``` + +Refer `runtime/onert/core/include/util/Config.lst` file for more information of `key`. diff --git a/packaging/FP16.tar.gz b/packaging/FP16.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ebd27643568c3c6499e1bf246b86a6515605ddee GIT binary patch literal 71362 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�V~Jdz#H>ZXRl{6+-lu6#y?dJ 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

bxK_V{ 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ӻzk=59UW^DteZZLcbz_pazSiLtDe8u-<)(*Uuv=s<1pEf2RtS z6P)&ML0bNnu%F3cK;BMhP1SQ8PA|z&(0C|UKlaTKX8sK+YolydN%6t6y5T!zC<`~4 zV6aN-5-Ep)`m_kP7? z%ifsiE0(aUIs?!^8ISvN{-vM@@^63{G{rwnX`HMTmZk90Zy#awxjhD-a7s_l`~PZd z=oyWjqtq=C;TyhT{F1GYo2xHC6=Bdk3l_scY5*kOvXAc41{)Abp>3ypqa3SrmA|jn zr83f`Tz23eS+Cw-Lu#76KWuJSS3m?AvR(#z;Z6#~q@a_(t@jTe9PS($-I>6XGwVX6G=tm?h;; z^pSNrIw(B6zEPZJ3@2g>P`i zcU{+~vxGy>Z%?$1k5}1GEh!1T;2rDaxB^0Gr09+-hy#V)~7gu`K)&=JK7E6`lnxcLmH~>E|r>G7Y`Aa z#BS&E#Z0fq#ARCk!NBC1Ca0tJ&L8?_ybz)uFZ;2Hp&mrd|6k*JuE!TYl3)mK;-V{X zqix~6s<_~~<2MZeQMHOQMPAS9Cox{v$YSINZy&l#kH>arXrpaKn+>f;V_AvE+g)l= zD!4Et=l(mmW2ck~K7=*R2ox^tCPe|Lp$37Jr4G8Wdf>X!3lz>`fus|hW zg@KAOx#ot7vAni`8aWzGm-NU$lrxZa9yg)p!(z0TE@8&7RfC(*m~>d5({g3p;ci=i z6WsQ~pmZ6b!g^%WZA-bZXxNkQDj!1;dOS-k7wTj7}XKuFiA z9}K3l$VsMFZ8}s?{0GM51N4c(pkH0J$luqJu8Bw|(&Iaxmq$oak4z=EHD^BelhD}< zue^k=WBO^|XRAGIn~_SBsbAZP@*KiAkw;TX6@Of&=%fqtFAmh{YBq$`#Z%YSI$Dq= zBjXRU6VM)aA%jKWQymQwN2#VvPzSB46ihaQZGGfsnT(m4B$c%5$)G4?xLSxF083Kr z*A`qBs*X5kN^elpa#E`CEYJ$5<-e&3Crf3pjUmdDr?IY(r@29&eQ&cve8?7fpqC%5 zqMFqDKCV|&qrGIKBxKu+L$b---4)|Q^J`5HYH^9YB7Jj{s+yMSXms`8cIc8`ap=;a z6k1Yyt(X?sLUXY8cLc6lnIs6D6flK9zZ1a}lIX{6u*>?`AIB?7`<8r(3FJfWFJHf( z%QFSF3}3su5C0qYgRmcrMx5Vv)pHnsR*P^ z(wvC=`a}m}@5yurVvCF$!oB@i^4~;79lckadsO}<7c!v}4j8Hmcy~%L(stB)m%JDaJuH$|Qj*y9uap3$oGaI|mF*AUnO2tO3B96IKH>f|sQjIk@|4|KwA;T-G1xd}d?1&Y@ksLE${%VrX2)#WsVRWdOuaop| z#E&Aziqr^E_me-mpFmr@P=1T*7xgm%H7}oO?bHb?*uXFHkhExvIdiaBw}w z6b%8VM;*tQFeEXm|8ufbqL%Yhd>w1I42>tOO;_6))8|Baa4G&uGUl+QwecwA=f2Bd z-Xt1NV(y)OS%2a|4$o$x5Dkh@*ns_5Y@Crd#xQOi@5zMRSKPz*{g6i)*Wlns5s|N3 zDv3EHgXsJl(ZaIryBETIumwU|!pHg8j`ub?%7wB-$sF-rJM{)EAt7zWVViIj)qkOo zp4m47)vh98$r^;gh^oJ(o)MDk_~MFDO$$q61;c|-vRUqEhrx|UF-k&NI5A9RmFG`g zvBaV18d7pZ_%#7ks{p?ZKKbr)wM4nq$$eoTzPhNJ*l>dqEO7F2TB(pxBKah6qM~Ha z!|e^YNn4AkX!tBOmK=YZG~WZw)7j!X9i=lYYT;xDQ|0_^XWDHQpFrG0yN|5 z1w6FiPB%P}?i>*&zlVQaXbo>aw#;ty;Wn}cn`am0-mf$-9-YwyHAw`-&9lfYlZ3>} z>FlJM_7^p$;b0D&Ts93L?K+YJFo5cf-)8c*bcT+8QWs>iuRXJ`VQK*dlUWY?YZIC!k}&vYO?_ea#?n}L#JU_BlQH_9TlB`+L(-&QR`ea znTYY|O?RA25=T?&H$&O+#6SuhK5>QZh@eHCtAWzn0l*1_;#LK<;zX3vbYEPpTr!HX zW>qECX=0KTwACK@k2SN+Fxpfv++vNd%0Vy7^N`(YyXS=L#qEWg{cwZ=7QX5qSac#a zYE))eLvmB$-uQLsQg$l@?Nk%>`LYc0N*)O`XF&2yU>6!QKv~fsS)8%nw?Uqgc`_f#;Z4!% z-Yh4zHJ|*a&}9A$zG8u=w(O+%4^YItIl4lZb(BAbPvtg?iG@1iQUR zj$r>i7S?GJ18_XbD;aW+QfgeY@B2iwl?j_nx(OL8w=MvyJqnRsmRomwf1I6;QirS$ z0bWbC9ytwwzIxw4RLkh%j$1#(Wx4Cf?qy_lQMc4SqJEV7Tve6s6V>IrTGkB`^@|mz z1xPW<9uUu|A&JPjB!V5-Jo7384mAH14!}@Wck#Lapkoc%fQZr`zIg4lVx8$Xp^&91 zC^o0=b7D&Gze4nUiIbj~4KMN%&xSmYT`oh-jAJN$yt8WSi`}FofoCuz!Kw;waQz@O zh5ctZF)hpzY?!*=xF_N1vfpF*ID>Zec4nZWy~89hj}#-7#nFiKdJT|kJlw>mEYFHc zFd1$97(7coj>O|IsZR{L(_STT$iiI!m*lxpL(|%iV<;Z9n z&B#y%pvvz^6RbCcRV?WuMqTdntLR|85 zl_}TUFh^kGh0m!Qs*l61%{thUmR}uuTGh7{F~0~;>6@TLl5oJ)WVFuS5{F!`@)_+4 zz~fDEVK%r2_wDcYB|-ld1S3ECBlvtT&s8+c7F|;gM5zb$1!3ta>w1+ zvu%?E&!IKNSX#vHVAA3XiEj2ZsoFaqFL~p%iSZwNf&e@@qo=%acq$w`=34egHLBDQ z&|`0MnmP~yl@VPwc(*qhdla0Eg?7JJdKCO4H%x*a4#Yn}2~tdvaJ;VT%c72u19DzV zYbBRu5J^|Z4n(FotWx&WHw9OEhVdl`~0h_s41BG=S_+Ca-Vg_iw2r( zC_jwc;(LY4=s?eTpz!!-Q;CYyjwR)dCYFCN`PcL?hQ&rosi5DBHbQI%tr8%ky@f=!0mQ=SP>-CTvfbc`!>1w>PRG|So-J?_2{i+o>~;Ur9v-b|e=1tF_R zK8q4*6?<*yHm_U*Z>WlTe~6@;qBW{fFl9&AhV#?}D*{h)?G_sW`j@IG0yO0xh~z$S z)R+YkN_YiCflD$5*Um)cu)l_po#N}*yR~SZ(`xHX2bm?7bWd7tFmoo!rsOCbeAMDn zH>Ld4r_9*x!>Pa;UZh<8Kddo-5(`fO{5a(8Xk%fr z%#to-$;;A|3JIynmulrAKg^kUDsbJ~QZ=9HP%`vtc(O}B+EK8_T8R_W^!XMcubr}qD4-KhNhU?N>T`N}p${68n`FJj~+y)a4u^z<`QcyEC=uIDCjYWT$Y(2v7wb&l$J&}ChQ~!Y)&YQon z0U2v)4l#K2IYnKM?DhWn+en1|?$g{CH2ay>w0GvVXJ!CTBsnTY@Z_tyc!_Tl{F0z6 zEw93f)HsV>v4A&%FV*ubXz-7F*-mN|>>b$?LYt5UBcJ*KPoxJ&GgxqwU;^nhBHx649N$>B zO)geccS!&1Luwv&0~@7K`SorR^QN$|>kYPbn`;V_9=iIj&{f6q=gSZ(>Cc8no+9qZ zHcTBOI$1yAe+(>~EUgz9GauvjLbDOgpUS{{nY~H3@{7&83C>R8;`1K8W`8HF_0I|- zoQExSVVc7l!wm(#(7ZRVm;SR8@Oqv;r4FxUlQa64)wdTN?(Z^} zpoFTH79rMfejS;AYjUUihb>Eg+b;}!XIdQdsl&O6ZPL9?kARo}=f@66Ui6(9Z2L2- zUnlY0M7FIQ^Z0g`y+CiUwyKBwDH8MbUrmmB@osCS$jQQ->j%omHzzQpVFVJVXJj4Ej>tze&~00t-u$Ryp9aPgSESE zwjaOI%g8>$M>1L3<$Ml$(P54dW@+4FZhw3&6+TvmzJpqEk?K5!6#Q0z<}#8lyTdba@gsaZxqeVXMA zgTN)$-1&D$aWev;#?J|HQvw*a-jPt$L6?~PAa@Ft7Wtr%UqX4i8{FB*&egdww zlvL@c>^XB+U|`gB>HG8(dCBy!+VCQwSMYpZSuMxsD656((oHlP){Shz|Ml@8uDbuSw_-JR5_2COa8fQ$;}?fxBZq?`h=XG8(-jmnQ@ z>m3~s(3~a$7k~N0nN*qBTZYZf6pMbuze*=K#R}O;&x64gKIjrKZPDgTYPSgOA+4~; zV+T?-{cQ~SO@(8iiUSEFgV&V9taoU?WcD)E1Wwc*Q1EuW(+V8gIxNJiPsicIGMk}8 z1#yH=lc?(cAtw{lOG!k`u7M*^{Nrp@BnBDhxULUfGp}(%zP%nyYvcYqWN5y<&Dyxf zF|Wx}UhkeFCQo5JT*K(jzg*Z7w}Z%i#%&IOs;e9*A2uczHDZbnecmS&ce z7r5Ens_r+0VCFEF0&D+E;!$3!t|q{Az8U#FEi-8ff`St85u;3kR~r69Or&r1E&4f7 z4|gRAb5-K;aES|T{njItP-d10yl9Ir$y3vU3u+j)+&-XbV->1_({#IisBA`QxOFJ_ zflE9psn&IOd{v8vA7Jm{4}CX?zBaX)^69n#NL5rFzq%LfZPowetmBhlq4fI;=sy{4h7n+H-lMNgh9b=Y}L86j{ zT+#6^!&Ahp)p} zm2{%+D}D*NyvFlo;kSJC8oPK(fV1<*^Hbu!Y?#K%DC(ouv#e0X&Ys5+NK=BUP=L6o zL`{k@DSR@XL7c*;P%cm7Jv31Z&f7wVZXTDaGL zVXln|`8(OdD<3=u)@9xVeH^qgBhP92>enGkf1tccn1wMQGZqDfcwSeCvpqRRdb@wf zOSNIzKS2xbZKSB_!~QESMkj#G-(7lt0yZ8`z-{!Rpms>~ILz~4l+z9rVp)W5Mqo=&j)E4E!G7UB;ZD#wl-yX?B#(+2FNXddTe*?@>nQAOU+1> zw|(UV9A6dO9x`g9M1)XMm%Iwq5LkUAxx{^|E{WgJm}Lipy~`8n7*8#$tLCi4#L)$Z zeR1ImpNXinngajW!m=}vVt@;k16E591H%E}J^{S{eCA}dTKoq0KM5C5PlBH6EE>Ia z1_PM(OiwBHxXLvYrz#Fa*8VQ;>?BfdVtlcgx=lI@WtRz+7+tM`A1^z~sqk>G@T-pu zk$IxA@S3hHpQXAiz)zj=Lo-1ym&wl83N3-(AF`f#(?DhU zj~tf(*lwY@%~QWU4?+J>n%avnL{3k&3e@41b`E#sVTr8yRje?_O}uv>AG^5Ae0ipc zIaMKTSEOYp;cp>-)sNTkGA|a`94$xhOa4LHgYdJh=Qre^_LrK98VT@FuSol+1Cx5& zq@O$mbJC^vz_+FS_5~^nHJ+%$IoQi*nmL_^3nsyL&G?a~c|<92GF93ZQQp_75e~)E zq=)a^EAGVi$Xs@4;b>>73gf^I0>Kr7yyMp99Y+eb8KSX#1fgRwEXZ@1w~cVD5V`w2 zEKng515sYn9paHJRiMC+qWZwXz>w@&AyuWoz+WN&l+fZ75(KfY9C$5}tcYt6?hoLb zBinf;ae*(#nH>i&ywaE<^z7Rq=o@eA$2J=ik32oiwg2#+P*R7D1{XN}Nz0Q}Pe(tOGkgpwv{O4{eK)t-%hhyR+qPyQ@ zhji;Y`~sNq7+%pUY~8kyq(#X_;zB`cKVo1}Mm{|tSYfvXs;oAu9^_#C!B2$nkm~K} ze@!{O_J{lL2R z^!#6Pl$ck!?Z_{9pI275+Y1~-(yqb z{1Z>`^Zck@m*qeHKsQIkLoc2Sfx5_}{8rLcU#}^M70#0%%zT>hasjpTznn||1uQb7>COM9_!?eW3F4BX^yVM-wz~4 z2gFs7owg_mc2xgV71NF zQD+EnPQoMoK$^}F;02*yAo#39;paB-9pt~D;~3T2PB_3YA5w&ns?=-^xY4(IAy^VE zG(zFYJJ`a^l&mnA%46lv&0PHV<4HD;ji}iOK#2w%VH*JoKKq3tu8~0~>=E7tmRryo zm%XdaN&16as|Ad6aIcL&krJ#`2;CnzY8(_+w; z(YIrjwZ9)@Gj3BvVr_PN$}&4z!%lFCNPW04?_p{UZ>SnM80Iywu^i4 z0h!@kaFgJMpBI>`^TFSDzy0>kF3JMO;PwEK-H@a zZboE7esv3t$XBZ+gG*_QdWRJ=N6Fw}OIc$8AF{9bh?|gjS71A0Y_&(|Pog9UO2gAA zW@J}Rc9=3@F3~FEvPsclZiiG|;=-Cg;Vxmp)#9zfrz*^LEUYcj+_Q!mS-zPSP^0rA zDUgq#gZUA~U6Q2vO0!en%3?mCpqP7vVm6Hfft! z!@98J#rbphdB7X$@b)U=22d?gq+E92V;O!+SpX%(3%!#iIe;73l?JUS+>ietT~aSmh?s)gJst{T@SA-$eyF870Yi&WEkvxmeTJ%(TB z?^CkQ-VaxDvqA4xOqu+GajXiwjzIzTJp4O(SoH+k;BXiw;}m40H}J!!)-7duxL0ay zM?1G`Q-nqJX#oa_OyX0sITQqu-)lG)r1wEajvg;ME)w~YWY-zp!n^#Hs><-f^~9Sx zF0;b$sjlGk(PZSK#AHpxpRQ5LOW)YP%Xxwcw^`8#z5e#?0?>kSko?

2JVkX&MPU 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 G!TuLeA^|=C literal 0 HcmV?d00001 diff --git a/packaging/XNNPACK.tar.gz b/packaging/XNNPACK.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d770c2ce9f45968c9d6134d2a4d2955eaddf515a GIT binary patch literal 2241657 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 z%0A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�a!|8+{p`&`{E>5YDQd`q-?W+DG? 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

^skB?Plxj>_ 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%0D^I-Tx!U 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%0DOF7JPGu)tX~ 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 P{*X=aH+4ZXV86BKr*Q<~fGa+ktM$N_tOivVEd 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%0DRV{s=XtUmBe0h;0Aysp|e41zwh& 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ⅅ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 z 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%0Dfl};D5CY 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�P?D!Mjo)Kh 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ȶ*C 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
d8l1@p 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┇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�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

y-D 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