FT_DSP.gitlink.net/master/html/functionlib/dsplib/lstm.html

310 lines
54 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html class="writer-html5" lang="zh-CN" data-content_root="../../">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>LSTM &mdash; MindSpore Signal+ 使用手册 alpha 文档</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css?v=e59714d7" />
<link rel="stylesheet" type="text/css" href="../../_static/table.css?v=72b86d3e" />
<script src="../../_static/jquery.js?v=5d32c60e"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="../../_static/documentation_options.js?v=406e4f49"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/translations.js?v=beaddf03"></script>
<script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<script src="../../_static/table.js?v=99ed15ba"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="index" title="索引" href="../../genindex.html" />
<link rel="search" title="搜索" href="../../search.html" />
<link rel="next" title="LstmGrad" href="lstmgrad.html" />
<link rel="prev" title="Lrn" href="lrn.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home">
MindSpore Signal+ 使用手册
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="搜索文档" aria-label="搜索文档" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="导航菜单">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../quickstart/index.html">快速入门</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../appdevelop/index.html">应用开发示例</a></li>
<li class="toctree-l1"><a class="reference internal" href="../index.html">算子库支持</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../refdoc/index.html">参考资料</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="移动版导航菜单" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">MindSpore Signal+ 使用手册</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="页面导航">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../index.html">算子库支持</a></li>
<li class="breadcrumb-item"><a href="dsplib_index.html">DSP Library C API Reference</a></li>
<li class="breadcrumb-item active">LSTM</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/functionlib/dsplib/lstm.rst.txt" rel="nofollow"> 查看页面源码</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="lstm">
<h1>LSTM<a class="headerlink" href="#lstm" title="Link to this heading"></a></h1>
<p>一种常用的 循环神经网络RNN 模块,用于处理具有时序依赖特征的数据(如语音、文本、时间序列等)。每个时间步的公式化描述如下。</p>
<div class="math notranslate nohighlight">
\[\begin{split}\begin{aligned}
i_t &amp;= \sigma(W_{ii} x_t + W_{hi} h_{t-1} + b_i) &amp;&amp; \text{(输入门)} \\[6pt]
f_t &amp;= \sigma(W_{if} x_t + W_{hf} h_{t-1} + b_f) &amp;&amp; \text{(遗忘门)} \\[6pt]
g_t &amp;= \tanh(W_{ig} x_t + W_{hg} h_{t-1} + b_g) &amp;&amp; \text{(候选状态)} \\[6pt]
o_t &amp;= \sigma(W_{io} x_t + W_{ho} h_{t-1} + b_o) &amp;&amp; \text{(输出门)} \\[6pt]
c_t &amp;= f_t \odot c_{t-1} + i_t \odot g_t &amp;&amp; \text{(细胞状态更新)} \\[6pt]
h_t &amp;= o_t \odot \tanh(c_t) &amp;&amp; \text{(隐藏状态更新)}
\end{aligned}\end{split}\]</div>
<ul class="simple">
<li><p><span class="math notranslate nohighlight">\(x_t\)</span> : 当前时间步输入向量</p></li>
<li><p><span class="math notranslate nohighlight">\(h_{t-1}\)</span> : 上一时间步的隐藏状态</p></li>
<li><p><span class="math notranslate nohighlight">\(c_{t-1}\)</span> : 上一时间步的细胞状态</p></li>
<li><p><span class="math notranslate nohighlight">\(i_t, f_t, g_t, o_t\)</span> : 四个门(输入门、遗忘门、候选门、输出门)</p></li>
<li><p><span class="math notranslate nohighlight">\(W_*\)</span> : 对应的权重矩阵</p></li>
<li><p><span class="math notranslate nohighlight">\(b_*\)</span> : 偏置项</p></li>
<li><p><span class="math notranslate nohighlight">\(\sigma(\cdot)\)</span> : Sigmoid 函数</p></li>
<li><p><span class="math notranslate nohighlight">\(\odot\)</span> : 元素乘</p></li>
</ul>
<dl class="simple">
<dt>输入:</dt><dd><ul class="simple">
<li><p><strong>input</strong> - 输入序列数据,形状为 <span class="math notranslate nohighlight">\((seq\_len, batch, input\_size)\)</span>,即每个时间步的输入特征。</p></li>
<li><p><strong>weight_i</strong> - 输入到各门 <span class="math notranslate nohighlight">\((input, forget, cell, output)\)</span> 的权重矩阵,大小为 4 * hidden_size * input_size。</p></li>
<li><p><strong>weight_h</strong> - 上一隐藏状态到各门的权重矩阵,大小为 <span class="math notranslate nohighlight">\(4 * hidden\_size * hidden\_size\)</span></p></li>
<li><p><strong>input_bias</strong> - 输入部分的偏置项,对应 4 个门的偏置。</p></li>
<li><p><strong>state_bias</strong> - 隐藏状态部分的偏置项(也是 <span class="math notranslate nohighlight">\(4 * hidden\_size\)</span>),与 input_bias 一起求和形成总偏置。</p></li>
<li><p><strong>hidden_state</strong> - 当前批次初始隐藏状态输入( <span class="math notranslate nohighlight">\(h_0\)</span> ),执行后更新为最后时刻的隐藏状态输出( <span class="math notranslate nohighlight">\(h_t\)</span></p></li>
<li><p><strong>cell_state</strong> - 当前批次初始细胞状态输入( <span class="math notranslate nohighlight">\(c_0\)</span>),执行后更新为最后时刻的细胞状态输出( <span class="math notranslate nohighlight">\(c_t\)</span>)。</p></li>
<li><p><strong>buffer</strong> - 临时工作区指针数组(中间计算缓存,如门值、激活结果、临时矩阵等,用于优化性能)。</p></li>
<li><p><strong>LstmParameter</strong> - LSTM 配置参数结构体,包含输入大小、隐藏层维度、序列长度、是否双向等信息。</p></li>
<li><p><strong>core_mask</strong> - 核掩码(仅适用于共享存储版本)。</p></li>
</ul>
</dd>
</dl>
<p><strong>LstmParameter定义</strong></p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="k">typedef</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">LstmParameter</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 2</span><span class="kt">int</span><span class="w"> </span><span class="n">input_size_</span><span class="p">;</span><span class="c1">//每个时间步输入向量的维度(输入特征数)。</span>
<span class="linenos"> 3</span><span class="kt">int</span><span class="w"> </span><span class="n">hidden_size_</span><span class="p">;</span><span class="c1">//LSTM 隐藏状态的维度(每个门的内部计算大小)。</span>
<span class="linenos"> 4</span><span class="kt">int</span><span class="w"> </span><span class="n">project_size_</span><span class="p">;</span><span class="c1">//投影层输出维度(用于 LSTMP有则在输出前线性压缩隐藏状态</span>
<span class="linenos"> 5</span><span class="kt">int</span><span class="w"> </span><span class="n">output_size_</span><span class="p">;</span><span class="c1">//实际输出维度,等于 hidden_size_ 或 project_size_取决于是否使用投影层</span>
<span class="linenos"> 6</span><span class="kt">int</span><span class="w"> </span><span class="n">seq_len_</span><span class="p">;</span><span class="c1">//输入序列的时间步数(序列长度)。</span>
<span class="linenos"> 7</span><span class="kt">int</span><span class="w"> </span><span class="n">batch_</span><span class="p">;</span><span class="c1">//批次大小(一次处理的样本数量)。</span>
<span class="linenos"> 8</span><span class="c1">// other parameter</span>
<span class="linenos"> 9</span><span class="kt">int</span><span class="w"> </span><span class="n">output_step_</span><span class="p">;</span><span class="c1">//指定输出第几个时间步的结果(通常为最后一步或每步)。</span>
<span class="linenos">10</span><span class="kt">bool</span><span class="w"> </span><span class="n">bidirectional_</span><span class="p">;</span><span class="c1">//是否为双向 LSTMtrue 表示前向和后向各一层)。</span>
<span class="linenos">11</span><span class="kt">float</span><span class="w"> </span><span class="n">zoneout_cell_</span><span class="p">;</span><span class="c1">//单元状态的 Zoneout 比例(防止过拟合的正则化参数)。</span>
<span class="linenos">12</span><span class="kt">float</span><span class="w"> </span><span class="n">zoneout_hidden_</span><span class="p">;</span><span class="c1">//隐藏状态的 Zoneout 比例(防止过拟合)。</span>
<span class="linenos">13</span><span class="kt">int</span><span class="w"> </span><span class="n">input_row_align_</span><span class="p">;</span><span class="c1">//输入张量的行对齐参数(用于 DMA 或 SIMD 加速的内存对齐)。</span>
<span class="linenos">14</span><span class="kt">int</span><span class="w"> </span><span class="n">input_col_align_</span><span class="p">;</span><span class="c1">//输入张量的列对齐参数。</span>
<span class="linenos">15</span><span class="kt">int</span><span class="w"> </span><span class="n">state_row_align_</span><span class="p">;</span><span class="c1">//状态张量hidden/cell的行对齐参数。</span>
<span class="linenos">16</span><span class="kt">int</span><span class="w"> </span><span class="n">state_col_align_</span><span class="p">;</span><span class="c1">//状态张量的列对齐参数。</span>
<span class="linenos">17</span><span class="kt">int</span><span class="w"> </span><span class="n">proj_col_align_</span><span class="p">;</span><span class="c1">//投影层矩阵的列对齐参数。</span>
<span class="linenos">18</span><span class="kt">bool</span><span class="w"> </span><span class="n">has_bias_</span><span class="p">;</span><span class="c1">//是否包含偏置项true 表示使用 bias</span>
<span class="linenos">19</span><span class="p">}</span><span class="w"> </span><span class="n">LstmParameter</span><span class="p">;</span>
</pre></div>
</div>
<dl>
<dt>输出:</dt><dd><ul class="simple">
<li><p><strong>output</strong> - 计算结果地址,存放 LSTM 每个时间步输出结果的缓冲区,维度通常为 <span class="math notranslate nohighlight">\((seq\_len, batch, output\_size)\)</span></p></li>
</ul>
<dl class="simple">
<dt>支持平台:</dt><dd><p><code class="docutils literal notranslate"><span class="pre">FT78NE</span></code>
<code class="docutils literal notranslate"><span class="pre">MT7004</span></code></p>
</dd>
</dl>
<div class="admonition note">
<p class="admonition-title">备注</p>
<ul class="simple">
<li><p>FT78NE 支持fp32</p></li>
<li><p>MT7004 支持fp32、fp16</p></li>
</ul>
</div>
</dd>
</dl>
<p><strong>共享存储版本:</strong></p>
<dl class="c function">
<dt class="sig sig-object c" id="c.fp_Lstm_s">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">fp_Lstm_s</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">output</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">input</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">weight_i</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">weight_h</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">input_bias</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">state_bias</span></span>, <span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">hidden_state</span></span>, <span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">cell_state</span></span>, <span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buffer</span></span><span class="p"><span class="pre">[</span></span><span class="m"><span class="pre">9</span></span><span class="p"><span class="pre">]</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">LstmParameter</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">lstm_param</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">core_mask</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.fp_Lstm_s" title="Link to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.hp_Lstm_s">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">hp_Lstm_s</span></span></span><span class="sig-paren">(</span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">output</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">input</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">weight_i</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">weight_h</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">input_bias</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">state_bias</span></span>, <span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">hidden_state</span></span>, <span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">cell_state</span></span>, <span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buffer</span></span><span class="p"><span class="pre">[</span></span><span class="m"><span class="pre">9</span></span><span class="p"><span class="pre">]</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">LstmParameter</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">lstm_param</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">core_mask</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.hp_Lstm_s" title="Link to this definition"></a><br /></dt>
<dd></dd></dl>
<p><strong>C调用示例</strong></p>
<blockquote>
<div><div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">//FT78NE示例</span>
<span class="linenos"> 2</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
<span class="linenos"> 3</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;lstm.h&gt;</span>
<span class="linenos"> 4</span>
<span class="linenos"> 5</span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="o">*</span><span class="w"> </span><span class="n">argv</span><span class="p">[])</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 6</span><span class="w"> </span><span class="n">LstmParameter</span><span class="w"> </span><span class="o">*</span><span class="n">lstm_param</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">LstmParameter</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x90000000</span><span class="p">;</span>
<span class="linenos"> 7</span><span class="w"> </span><span class="n">lstm_param</span><span class="o">-&gt;</span><span class="n">seq_len_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">20</span><span class="p">;</span>
<span class="linenos"> 8</span><span class="w"> </span><span class="n">lstm_param</span><span class="o">-&gt;</span><span class="n">batch_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="linenos"> 9</span><span class="w"> </span><span class="n">lstm_param</span><span class="o">-&gt;</span><span class="n">input_size_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2000</span><span class="p">;</span>
<span class="linenos">10</span><span class="w"> </span><span class="n">lstm_param</span><span class="o">-&gt;</span><span class="n">hidden_size_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
<span class="linenos">11</span><span class="w"> </span><span class="n">lstm_param</span><span class="o">-&gt;</span><span class="n">bidirectional_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="linenos">12</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xA0000000</span><span class="p">;</span><span class="w"> </span><span class="c1">//input在DDR空间</span>
<span class="linenos">13</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">weight_i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xA1000000</span><span class="p">;</span>
<span class="linenos">14</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">weight_h</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xA3000000</span><span class="p">;</span>
<span class="linenos">15</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">input_bias_</span><span class="w"> </span><span class="o">=</span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="mh">0xB0900000</span><span class="p">;</span>
<span class="linenos">16</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">state_bias_</span><span class="w"> </span><span class="o">=</span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="mh">0xB0B00000</span><span class="p">;</span>
<span class="linenos">17</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">output_s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xC0000000</span><span class="p">;</span>
<span class="linenos">18</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">hidden_state_s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xC0100000</span><span class="p">;</span>
<span class="linenos">19</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">cell_state_s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xC0200000</span><span class="p">;</span>
<span class="linenos">20</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">buffer</span><span class="p">[</span><span class="mi">9</span><span class="p">];</span>
<span class="linenos">21</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">packed_input_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xB0000000</span><span class="p">;</span>
<span class="linenos">22</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">packed_input_</span><span class="p">;</span>
<span class="linenos">23</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">gate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xB0100000</span><span class="p">;</span>
<span class="linenos">24</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gate</span><span class="p">;</span>
<span class="linenos">25</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">packed_state</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xB0200000</span><span class="p">;</span>
<span class="linenos">26</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">packed_state</span><span class="p">;</span>
<span class="linenos">27</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">state_gate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xB0300000</span><span class="p">;</span>
<span class="linenos">28</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">state_gate</span><span class="p">;</span>
<span class="linenos">29</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">cell_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xB0400000</span><span class="p">;</span>
<span class="linenos">30</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cell_buffer</span><span class="p">;</span>
<span class="linenos">31</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">hidden_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xB0500000</span><span class="p">;</span>
<span class="linenos">32</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hidden_buffer</span><span class="p">;</span>
<span class="linenos">33</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">packed_output</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xB0600000</span><span class="p">;</span>
<span class="linenos">34</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">packed_output</span><span class="p">;</span>
<span class="linenos">35</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">left_matrix</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xB0700000</span><span class="p">;</span>
<span class="linenos">36</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">7</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">left_matrix</span><span class="p">;</span>
<span class="linenos">37</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">packed_ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0xB0800000</span><span class="p">;</span>
<span class="linenos">38</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">packed_ptr</span><span class="p">;</span>
<span class="linenos">39</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">core_mask</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0xff</span><span class="p">;</span>
<span class="hll"><span class="linenos">40</span><span class="w"> </span><span class="n">fp_Lstm_s</span><span class="p">(</span><span class="n">output_s</span><span class="p">,</span><span class="w"> </span><span class="n">input</span><span class="p">,</span><span class="w"> </span><span class="n">weight_i</span><span class="p">,</span><span class="w"> </span><span class="n">weight_h</span><span class="p">,</span><span class="w"> </span><span class="n">input_bias_</span><span class="p">,</span>
</span><span class="hll"><span class="linenos">41</span><span class="w"> </span><span class="n">state_bias</span><span class="p">,</span><span class="w"> </span><span class="n">hidden_state_s</span><span class="p">,</span><span class="w"> </span><span class="n">cell_state_s</span><span class="p">,</span><span class="w"> </span><span class="n">buffer</span><span class="p">,</span>
</span><span class="hll"><span class="linenos">42</span><span class="w"> </span><span class="n">lstm_param</span><span class="p">,</span><span class="w"> </span><span class="n">core_mask</span><span class="p">);</span>
</span><span class="linenos">43</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="linenos">44</span><span class="p">}</span>
</pre></div>
</div>
</div></blockquote>
<p><strong>私有存储版本:</strong></p>
<dl class="c function">
<dt class="sig sig-object c" id="c.fp_Lstm_p">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">fp_Lstm_p</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">output</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">input</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">weight_i</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">weight_h</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">input_bias</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">state_bias</span></span>, <span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">hidden_state</span></span>, <span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">cell_state</span></span>, <span class="kt"><span class="pre">float</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buffer</span></span><span class="p"><span class="pre">[</span></span><span class="m"><span class="pre">9</span></span><span class="p"><span class="pre">]</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">LstmParameter</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">lstm_param</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.fp_Lstm_p" title="Link to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.hp_Lstm_p">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">hp_Lstm_p</span></span></span><span class="sig-paren">(</span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">output</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">input</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">weight_i</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">weight_h</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">input_bias</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">state_bias</span></span>, <span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">hidden_state</span></span>, <span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">cell_state</span></span>, <span class="n"><span class="pre">half</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">buffer</span></span><span class="p"><span class="pre">[</span></span><span class="m"><span class="pre">9</span></span><span class="p"><span class="pre">]</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">LstmParameter</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">lstm_param</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.hp_Lstm_p" title="Link to this definition"></a><br /></dt>
<dd><blockquote>
<div><p><strong>C调用示例</strong></p>
</div></blockquote>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">//FT78NE示例</span>
<span class="linenos"> 2</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
<span class="linenos"> 3</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;lstm.h&gt;</span>
<span class="linenos"> 4</span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="o">*</span><span class="w"> </span><span class="n">argv</span><span class="p">[])</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 5</span><span class="w"> </span><span class="n">LstmParameter</span><span class="w"> </span><span class="o">*</span><span class="n">lstm_param</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">LstmParameter</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10000000</span><span class="p">;</span>
<span class="linenos"> 6</span><span class="w"> </span><span class="n">lstm_param</span><span class="o">-&gt;</span><span class="n">seq_len_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span>
<span class="linenos"> 7</span><span class="w"> </span><span class="n">lstm_param</span><span class="o">-&gt;</span><span class="n">batch_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="linenos"> 8</span><span class="w"> </span><span class="n">lstm_param</span><span class="o">-&gt;</span><span class="n">input_size_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span>
<span class="linenos"> 9</span><span class="w"> </span><span class="n">lstm_param</span><span class="o">-&gt;</span><span class="n">hidden_size_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
<span class="linenos">10</span><span class="w"> </span><span class="n">lstm_param</span><span class="o">-&gt;</span><span class="n">bidirectional_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="linenos">11</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10000200</span><span class="p">;</span><span class="w"> </span><span class="c1">//input在DDR空间</span>
<span class="linenos">12</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">weight_i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10000400</span><span class="p">;</span>
<span class="linenos">13</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">weight_h</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10000600</span><span class="p">;</span>
<span class="linenos">14</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">input_bias_</span><span class="w"> </span><span class="o">=</span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="mh">0x10000800</span><span class="p">;</span>
<span class="linenos">15</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">state_bias_</span><span class="w"> </span><span class="o">=</span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="mh">0x10000A00</span><span class="p">;</span>
<span class="linenos">16</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">output_s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10000C00</span><span class="p">;</span>
<span class="linenos">17</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">hidden_state_s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10000E00</span><span class="p">;</span>
<span class="linenos">18</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">cell_state_s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10001000</span><span class="p">;</span>
<span class="linenos">19</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">buffer</span><span class="p">[</span><span class="mi">9</span><span class="p">];</span>
<span class="linenos">20</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">packed_input_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10001200</span><span class="p">;</span>
<span class="linenos">21</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">packed_input_</span><span class="p">;</span>
<span class="linenos">22</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">gate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10001400</span><span class="p">;</span>
<span class="linenos">23</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gate</span><span class="p">;</span>
<span class="linenos">24</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">packed_state</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10001600</span><span class="p">;</span>
<span class="linenos">25</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">packed_state</span><span class="p">;</span>
<span class="linenos">26</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">state_gate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10001800</span><span class="p">;</span>
<span class="linenos">27</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">state_gate</span><span class="p">;</span>
<span class="linenos">28</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">cell_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10001A00</span><span class="p">;</span>
<span class="linenos">29</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cell_buffer</span><span class="p">;</span>
<span class="linenos">30</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">hidden_buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10001C00</span><span class="p">;</span>
<span class="linenos">31</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hidden_buffer</span><span class="p">;</span>
<span class="linenos">32</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">packed_output</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10001F00</span><span class="p">;</span>
<span class="linenos">33</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">packed_output</span><span class="p">;</span>
<span class="linenos">34</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">left_matrix</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10002000</span><span class="p">;</span>
<span class="linenos">35</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">7</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">left_matrix</span><span class="p">;</span>
<span class="linenos">36</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">packed_ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="mh">0x10002200</span><span class="p">;</span>
<span class="linenos">37</span><span class="w"> </span><span class="n">buffer</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">packed_ptr</span><span class="p">;</span>
<span class="hll"><span class="linenos">38</span><span class="w"> </span><span class="n">fp_Lstm_p</span><span class="p">(</span><span class="n">output_s</span><span class="p">,</span><span class="w"> </span><span class="n">input</span><span class="p">,</span><span class="w"> </span><span class="n">weight_i</span><span class="p">,</span><span class="w"> </span><span class="n">weight_h</span><span class="p">,</span><span class="w"> </span><span class="n">input_bias_</span><span class="p">,</span>
</span><span class="hll"><span class="linenos">39</span><span class="w"> </span><span class="n">state_bias</span><span class="p">,</span><span class="w"> </span><span class="n">hidden_state_s</span><span class="p">,</span><span class="w"> </span><span class="n">cell_state_s</span><span class="p">,</span><span class="w"> </span><span class="n">buffer</span><span class="p">,</span>
</span><span class="hll"><span class="linenos">40</span><span class="w"> </span><span class="n">lstm_param</span><span class="p">);</span>
</span><span class="linenos">41</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="linenos">42</span><span class="p">}</span>
</pre></div>
</div>
</dd></dl>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="页脚">
<a href="lrn.html" class="btn btn-neutral float-left" title="Lrn" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> 上一页</a>
<a href="lstmgrad.html" class="btn btn-neutral float-right" title="LstmGrad" accesskey="n" rel="next">下一页 <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; 版权所有 2025 - 2026, NUDT-674。</p>
</div>
利用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 构建,使用的
<a href="https://github.com/readthedocs/sphinx_rtd_theme">主题</a>
<a href="https://readthedocs.org">Read the Docs</a> 开发.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>