blob: f4ecfdf609e59ed995dbe7b48a470a4c2f60d7a7 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ArmNN: QuantizedMultiplierSmallerThanOne Struct Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">ArmNN
&#160;<span id="projectnumber">NotReleased</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('structarmnn_1_1_quantized_multiplier_smaller_than_one.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="structarmnn_1_1_quantized_multiplier_smaller_than_one-members.html">List of all members</a> </div>
<div class="headertitle">
<div class="title">QuantizedMultiplierSmallerThanOne Struct Reference</div> </div>
</div><!--header-->
<div class="contents">
<p><code>#include &lt;<a class="el" href="_conv_impl_8hpp_source.html">ConvImpl.hpp</a>&gt;</code></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a1ec4f749fbbdacbe2cc7e8895d5b65ed"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarmnn_1_1_quantized_multiplier_smaller_than_one.html#a1ec4f749fbbdacbe2cc7e8895d5b65ed">QuantizedMultiplierSmallerThanOne</a> (float multiplier)</td></tr>
<tr class="separator:a1ec4f749fbbdacbe2cc7e8895d5b65ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac04834893e568dfea4642ecb575faed8"><td class="memItemLeft" align="right" valign="top">int32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structarmnn_1_1_quantized_multiplier_smaller_than_one.html#ac04834893e568dfea4642ecb575faed8">operator*</a> (int32_t rhs) const</td></tr>
<tr class="memdesc:ac04834893e568dfea4642ecb575faed8"><td class="mdescLeft">&#160;</td><td class="mdescRight">The implementation of this function is adapted from Android NN's MultiplyByQuantizedMultiplierSmallerThanOne(). <a href="#ac04834893e568dfea4642ecb575faed8">More...</a><br /></td></tr>
<tr class="separator:ac04834893e568dfea4642ecb575faed8"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Performs multiplication of an integer with a multiplier which is less than one, using quantized integer arithmetic which is consistent with AndroidNN's CPU executor. </p>
<p class="definition">Definition at line <a class="el" href="_conv_impl_8hpp_source.html#l00029">29</a> of file <a class="el" href="_conv_impl_8hpp_source.html">ConvImpl.hpp</a>.</p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a1ec4f749fbbdacbe2cc7e8895d5b65ed"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1ec4f749fbbdacbe2cc7e8895d5b65ed">&#9670;&nbsp;</a></span>QuantizedMultiplierSmallerThanOne()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structarmnn_1_1_quantized_multiplier_smaller_than_one.html">QuantizedMultiplierSmallerThanOne</a> </td>
<td>(</td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>multiplier</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Constructs a <a class="el" href="structarmnn_1_1_quantized_multiplier_smaller_than_one.html">QuantizedMultiplierSmallerThanOne</a> which will multiply by the given multiplier. This stores the appropriate integer quantities (derived from the given multiplier) for later use. The implementation of this function is adapted from Android NN's QuantizeMultiplierSmallerThanOne(). </p>
<p class="definition">Definition at line <a class="el" href="_conv_impl_8cpp_source.html#l00016">16</a> of file <a class="el" href="_conv_impl_8cpp_source.html">ConvImpl.cpp</a>.</p>
<div class="fragment"><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;{</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; BOOST_ASSERT(multiplier &gt;= 0.0f &amp;&amp; multiplier &lt; 1.0f);</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; <span class="keywordflow">if</span> (multiplier == 0.0f)</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; {</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; m_Multiplier = 0;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; m_RightShift = 0;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; }</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; {</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> q = std::frexp(multiplier, &amp;m_RightShift);</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; m_RightShift = -m_RightShift;</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; int64_t qFixed = <span class="keyword">static_cast&lt;</span>int64_t<span class="keyword">&gt;</span>(std::round(q * (1ll &lt;&lt; 31)));</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; BOOST_ASSERT(qFixed &lt;= (1ll &lt;&lt; 31));</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="keywordflow">if</span> (qFixed == (1ll &lt;&lt; 31))</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; {</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; qFixed /= 2;</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; --m_RightShift;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; }</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; BOOST_ASSERT(m_RightShift &gt;= 0);</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; BOOST_ASSERT(qFixed &lt;= std::numeric_limits&lt;int32_t&gt;::max());</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; m_Multiplier = <span class="keyword">static_cast&lt;</span>int32_t<span class="keyword">&gt;</span>(qFixed);</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; }</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;}</div></div><!-- fragment -->
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="ac04834893e568dfea4642ecb575faed8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac04834893e568dfea4642ecb575faed8">&#9670;&nbsp;</a></span>operator*()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int32_t operator* </td>
<td>(</td>
<td class="paramtype">int32_t&#160;</td>
<td class="paramname"><em>rhs</em></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
<p>The implementation of this function is adapted from Android NN's MultiplyByQuantizedMultiplierSmallerThanOne(). </p>
<p class="definition">Definition at line <a class="el" href="_conv_impl_8cpp_source.html#l00041">41</a> of file <a class="el" href="_conv_impl_8cpp_source.html">ConvImpl.cpp</a>.</p>
<div class="fragment"><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;{</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; int32_t x = SaturatingRoundingDoublingHighMul(rhs, m_Multiplier);</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keywordflow">return</span> RoundingDivideByPOT(x, m_RightShift);</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;}</div></div><!-- fragment -->
</div>
</div>
<hr/>The documentation for this struct was generated from the following files:<ul>
<li>src/backends/reference/workloads/<a class="el" href="_conv_impl_8hpp_source.html">ConvImpl.hpp</a></li>
<li>src/backends/reference/workloads/<a class="el" href="_conv_impl_8cpp_source.html">ConvImpl.cpp</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="namespacearmnn.html">armnn</a></li><li class="navelem"><a class="el" href="structarmnn_1_1_quantized_multiplier_smaller_than_one.html">QuantizedMultiplierSmallerThanOne</a></li>
<li class="footer">Generated on Fri Mar 13 2020 16:07:04 for ArmNN by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
</ul>
</div>
</body>
</html>