From 59631a174e1b5ef23bd3a0102f60b57c99502766 Mon Sep 17 00:00:00 2001 From: Giorgio Arena Date: Wed, 2 May 2018 13:59:04 +0100 Subject: COMPMID-1104 Add fast math hint in the graph API Change-Id: I83db135fa94c6884e080f0229a9b6430d908c029 Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/129823 Tested-by: Jenkins Reviewed-by: Gian Marco Iodice Reviewed-by: Anthony Barbier --- src/graph/GraphBuilder.cpp | 10 +++++----- src/graph/backends/CL/CLFunctionsFactory.cpp | 5 +++-- src/graph/nodes/ConvolutionLayerNode.cpp | 14 ++++++++++++-- 3 files changed, 20 insertions(+), 9 deletions(-) (limited to 'src/graph') diff --git a/src/graph/GraphBuilder.cpp b/src/graph/GraphBuilder.cpp index 56b31c7844..df94d0b169 100644 --- a/src/graph/GraphBuilder.cpp +++ b/src/graph/GraphBuilder.cpp @@ -81,7 +81,7 @@ NodeID create_simple_single_input_output_node(Graph &g, NodeParams ¶ms, Node } NodeID create_grouped_convolution(Graph &g, NodeParams ¶ms, NodeIdxPair input, NodeID weights, NodeID bias, - PadStrideInfo conv_info, ConvolutionMethod method, unsigned int num_groups) + PadStrideInfo conv_info, ConvolutionMethod method, FastMathHint fast_math_hint, unsigned int num_groups) { bool has_bias = (bias != EmptyNodeID); @@ -102,7 +102,7 @@ NodeID create_grouped_convolution(Graph &g, NodeParams ¶ms, NodeIdxPair inpu std::vector convolution_outputs; for(unsigned int i = 0; i < num_groups; ++i) { - NodeID conv_nid = g.add_node(conv_info, method); + NodeID conv_nid = g.add_node(conv_info, method, fast_math_hint); g.add_connection(input_split, i, conv_nid, 0); g.add_connection(weights_split, i, conv_nid, 1); if(has_bias) @@ -205,7 +205,7 @@ NodeID GraphBuilder::add_batch_normalization_node(Graph &g, NodeParams params, N NodeID GraphBuilder::add_convolution_node(Graph &g, NodeParams params, NodeIdxPair input, Size2D kernel_spatial_extend, unsigned int depth, PadStrideInfo conv_info, - unsigned int num_groups, ConvolutionMethod method, + unsigned int num_groups, ConvolutionMethod method, FastMathHint fast_math_hint, ITensorAccessorUPtr weights_accessor, ITensorAccessorUPtr bias_accessor, const QuantizationInfo weights_quant_info, const QuantizationInfo out_quant_info) @@ -245,7 +245,7 @@ NodeID GraphBuilder::add_convolution_node(Graph &g, NodeParams params, NodeIdxPa if(num_groups == 1) { // Create convolution node and connect - NodeID conv_nid = g.add_node(conv_info, method, out_quant_info); + NodeID conv_nid = g.add_node(conv_info, method, fast_math_hint, out_quant_info); g.add_connection(input.node_id, input.index, conv_nid, 0); g.add_connection(w_nid, 0, conv_nid, 1); if(has_bias) @@ -258,7 +258,7 @@ NodeID GraphBuilder::add_convolution_node(Graph &g, NodeParams params, NodeIdxPa } else { - return create_grouped_convolution(g, params, input, w_nid, b_nid, conv_info, method, num_groups); + return create_grouped_convolution(g, params, input, w_nid, b_nid, conv_info, method, fast_math_hint, num_groups); } } diff --git a/src/graph/backends/CL/CLFunctionsFactory.cpp b/src/graph/backends/CL/CLFunctionsFactory.cpp index ece63646ea..4626cb5781 100644 --- a/src/graph/backends/CL/CLFunctionsFactory.cpp +++ b/src/graph/backends/CL/CLFunctionsFactory.cpp @@ -166,6 +166,7 @@ std::unique_ptr create_convolution_layer(ConvolutionLayerNode &node, const PadStrideInfo conv_info = node.convolution_info(); const ConvolutionMethod conv_algorithm = node.convolution_method(); + const bool fast_math = node.fast_math_hint() == FastMathHint::ENABLED; // Create and configure function (we assume that functions have been validated before creation) std::shared_ptr mm = get_memory_manager(ctx, Target::CL); @@ -175,7 +176,7 @@ std::unique_ptr create_convolution_layer(ConvolutionLayerNode &node, if(conv_algorithm == ConvolutionMethod::WINOGRAD) { std::tie(func, func_name) = create_named_memory_managed_function( - std::string("CLWinogradConvolutionLayer"), mm, input, weights, biases, output, conv_info); + std::string("CLWinogradConvolutionLayer"), mm, input, weights, biases, output, conv_info, ActivationLayerInfo(), fast_math); } else if(conv_algorithm == ConvolutionMethod::DIRECT) { @@ -190,7 +191,7 @@ std::unique_ptr create_convolution_layer(ConvolutionLayerNode &node, else { std::tie(func, func_name) = create_named_memory_managed_function(std::string("CLConvolutionLayer"), mm, - input, weights, biases, output, conv_info); + input, weights, biases, output, conv_info, WeightsInfo(), Size2D(1U, 1U), ActivationLayerInfo(), fast_math); } // Log info diff --git a/src/graph/nodes/ConvolutionLayerNode.cpp b/src/graph/nodes/ConvolutionLayerNode.cpp index eaf1f7f035..6c31a6beed 100644 --- a/src/graph/nodes/ConvolutionLayerNode.cpp +++ b/src/graph/nodes/ConvolutionLayerNode.cpp @@ -32,8 +32,8 @@ namespace arm_compute { namespace graph { -ConvolutionLayerNode::ConvolutionLayerNode(PadStrideInfo info, ConvolutionMethod method, QuantizationInfo out_quant_info) - : _info(std::move(info)), _method(method), _out_quant_info(out_quant_info) +ConvolutionLayerNode::ConvolutionLayerNode(PadStrideInfo info, ConvolutionMethod method, FastMathHint fast_math_hint, QuantizationInfo out_quant_info) + : _info(std::move(info)), _method(method), _fast_math_hint(fast_math_hint), _out_quant_info(out_quant_info) { _input_edges.resize(3, EmptyEdgeID); _outputs.resize(1, NullTensorID); @@ -49,6 +49,16 @@ ConvolutionMethod ConvolutionLayerNode::convolution_method() const return _method; } +void ConvolutionLayerNode::set_fast_math_hint(FastMathHint hint) +{ + _fast_math_hint = hint; +} + +FastMathHint ConvolutionLayerNode::fast_math_hint() const +{ + return _fast_math_hint; +} + PadStrideInfo ConvolutionLayerNode::convolution_info() const { return _info; -- cgit v1.2.1