发明名称 数组相加运算汇编库程序的地址对齐SIMD加速方法
摘要 本发明公开了一种数组相加运算汇编库程序的地址对齐SIMD加速方法,目的是提高数组相加运算汇编库程序的执行速度。技术方案是首先从目标体系结构中获取SIMD向量宽度w和数据宽度size,然后计算数组X和数组Y的地址对齐偏移量,接下来根据地址对齐偏移量来判断数组X和数组Y的地址是否已经对齐,如果已经对齐,直接对数组X和数组Y进行向量相加运算;否则,对数组X和数组Y进行向量组装与混合运算。即对数组X和数组Y前面部分进行标量运算,对中间部分利用寄存器掩码进行向量组装和向量运算,对尾部不满足向量运算要求的部分采用标量运算。采用本发明可实现汇编库程序数据地址对齐访存,加快SIMD程序运行,提升SIMD计算性能。
申请公布号 CN103077008B 申请公布日期 2014.12.03
申请号 CN201310036071.2 申请日期 2013.01.30
申请人 中国人民解放军国防科学技术大学 发明人 迟利华;刘杰;甘新标;晏益慧;徐涵;胡庆丰;龚春叶;冯华;蒋杰
分类号 G06F9/38(2006.01)I 主分类号 G06F9/38(2006.01)I
代理机构 国防科技大学专利服务中心 43202 代理人 郭敏
主权项 一种数组相加运算汇编库程序的地址对齐SIMD加速方法,其特征在于包括以下步骤:第一步:从目标体系结构信息中获取SIMD向量宽度w和数据宽度size,向量宽度w指SIMD能够同时处理的数据个数,数据宽度size指数据类型占据的字节数;第二步:计算数组X的地址对齐偏移量,具体方法如下:2.1获取X的内存首地址&amp;X;2.2执行求余操作得到地址偏移量offset<sub>X</sub>,offset<sub>X</sub>=mod(&amp;X,(size*w)),mod(m<sub>1</sub>,n<sub>1</sub>)表示m<sub>1</sub>除以n<sub>1</sub>得到的余数,“*”为乘法;2.3执行除法操作得到地址对齐偏移量shift<sub>X</sub>,shift<sub>X</sub>=div(offset<sub>X</sub>,size);div(m<sub>1</sub>,n<sub>1</sub>)表示m<sub>1</sub>除以n<sub>1</sub>得到的结果向下取整;第三步:计算数组Y的地址对齐偏移量,具体方法如下:3.1获取Y的内存首地址&amp;Y;3.2执行求余操作得到地址偏移量offset<sub>Y</sub>,offset<sub>Y</sub>=mod(&amp;Y,(size*w));3.3执行除法操作得到地址对齐偏移量shift<sub>Y</sub>,shift<sub>Y</sub>=div(offset<sub>Y</sub>,size);第四步:地址对齐判断,方法是:4.1获取数组X的大小即数组中的元素个数N,获取数组Y的大小N;4.2如果shift<sub>X</sub>=shift<sub>Y</sub>=0,说明地址已对齐可直接对X和Y进行向量运算,转第五步,否则,转第六步;第五步:对X和Y进行向量运算,具体步骤如下:5.1令变量i=0,j=0;5.2定义向量运算部分循环次数变量m=div(N,w);5.3如果j<m,执行向量运算,转5.4;否则,转5.9;5.4加载X[i],X[i+1],…,X[i+w‑1]到向量寄存器V<sub>X</sub>,加载Y[i],Y[i+1],…,Y[i+w‑1]到向量寄存器V<sub>Y</sub>;5.5执行向量运算完成数组相加存入向量寄存器V<sub>Z</sub>,即,V<sub>Z</sub>=V<sub>X</sub>+V<sub>Y</sub>;5.6将向量寄存器V<sub>Z</sub>中的结果分别赋值给Z[i],Z[i+1],…,Z[i+w‑1],如公式(1)所示;<maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><mfenced open='{' close=''><mtable><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mn>0</mn><mo>]</mo></mtd></mtr><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>+</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000572389520000021.GIF" wi="1207" he="308" /></maths>5.7更新i=i+w,j=j+1;5.8如果j<m,转5.4,否则,转5.9;5.9如果i<N,转5.10执行标量运算;否则,转第七步;5.10执行标量运算完成数组相加,即,Z[i]=X[i]+Y[i];5.11更新i=i+1;5.12如果i<N,转5.10,否则,转第七步;第六步:对X和Y进行向量组装与混合运算,具体方法如下:6.1如果shift<sub>X</sub>=shift<sub>Y</sub>,转6.2;否则,转6.216.2定义头部标量运算部分循环次数变量h=min{w‑shift<sub>X</sub>,N},其中min{x,y}表示取x,y中的最小值;6.3令k=N‑h;6.4定义向量运算部分运算循环次数变量m=div(k,w);6.5令i=0,j=0;6.6如果j<h,转6.7;否则,转6.10;6.7执行头部标量运算,即,Z[i]=X[i]+Y[i];6.8更新i=i+1,j=j+1;6.9如果j<h,转6.7,否则,转6.10;6.10令j=0;6.11如果j<m,转6.12;否则,转6.17;6.12加载X[i],X[i+1],…,X[i+w‑1]到向量寄存器V<sub>X</sub>,加载Y[i],Y[i+1],…,Y[i+w‑1]到向量寄存器V<sub>Y</sub>;6.13执行向量运算完成数组相加存入向量寄存器V<sub>Z</sub>,即,V<sub>Z</sub>=V<sub>X</sub>+V<sub>Y</sub>;6.14将向量寄存器V<sub>Z</sub>中的结果分别赋值给Z[i],Z[i+1],…,Z[i+w‑1],如公式(2)所示;<maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><mfenced open='{' close=''><mtable><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mn>0</mn><mo>]</mo></mtd></mtr><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>+</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000572389520000031.GIF" wi="1206" he="308" /></maths>6.15更新i=i+w,j=j+1;6.16如果j<m,转6.12,否则,转6.17;6.17如果i<N,转6.18;否则,转第七步;6.18执行标量运算完成数组相加,即,Z[i]=X[i]+Y[i];6.19更新i=i+1;6.20如果i<N,转6.18,否则,转第七步;6.21如果shift<sub>X</sub><shift<sub>Y</sub>,转6.22;否则,转6.48;6.22计算移位偏移量Δshift,Δshift=shift<sub>Y</sub>‑shift<sub>X</sub>;6.23定义头部标量运算部分循环次数变量h=min{w‑shift<sub>X</sub>,N};6.24令k=N‑h;6.25定义向量运算部分循环次数变量m=div(k,w);6.26令i=0,j=0;6.27如果j<h,转6.28;否则,转6.31;6.28执行头部标量运算,即,Z[i]=X[i]+Y[i];6.29更新i=i+1,j=j+1;6.30如果j<h,转6.28,否则,转6.31;6.31令j=0;6.32如果j<m,转6.33;否则,转6.44;6.33加载Y[i‑Δshift],Y[i‑Δshift+1],…,Y[i‑Δshift+w‑1]到向量寄存器V<sub>Y1</sub>;6.34加载X[i],X[i+1],…,X[i+w‑1]到向量寄存器V<sub>X</sub>;6.35加载Y[i+w‑Δshift],Y[i+w‑Δshift+1],…,Y[i+w‑Δshift+w‑1]到向量寄存器V<sub>Y2</sub>;6.36设置向量寄存器掩码有效位:某位的掩码设置为1表示可以将该向量掩码为1的分量赋值给另一向量的指定位;掩码设置为0表示该向量掩码为0的分量在向量赋值过程中无效;设置向量寄存器V<sub>Y1</sub>的掩码有效位为:<img file="FDA0000572389520000041.GIF" wi="339" he="186" />即,将向量寄存器V<sub>Y1</sub>的后w‑Δshift个分量设置为有效位赋值给另一向量的相应位,而其它位无效;6.37设置向量寄存器V<sub>Y2</sub>的掩码有效位为:<img file="FDA0000572389520000042.GIF" wi="313" he="182" />即,将向量寄存器V<sub>Y2</sub>前Δshift个分量设置为有效位赋值给另一向量的相应位,而其它位无效;6.38基于向量寄存器掩码重组生成新的向量并赋值给向量寄存器V<sub>Y</sub>,即将向量寄存器V<sub>Y1</sub>的后w‑Δshift个分量和向量寄存器V<sub>Y2</sub>的前Δshift个分量合并重组生成向量V<sub>Y</sub>,各分量对应赋值关系如公式(3)所示;<maths num="0003" id="cmaths0003"><math><![CDATA[<mrow><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>V</mi><mi>Y</mi></msub><mo>[</mo><mn>0</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>Y</mi><mn>1</mn></mrow></msub><mo>[</mo><mi>&Delta;shift</mi><mo>]</mo></mtd></mtr><mtr><mtd><msub><mi>V</mi><mi>Y</mi></msub><mo>[</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>Y</mi><mn>1</mn></mrow></msub><mo>[</mo><mi>&Delta;shift</mi><mo>+</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><msub><mi>V</mi><mi>Y</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mi>&Delta;shift</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>Y</mi><mn>1</mn></mrow></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><msub><mi>V</mi><mi>Y</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mi>&Delta;shift</mi><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>Y</mi><mn>2</mn></mrow></msub><mo>[</mo><mn>0</mn><mo>]</mo></mtd></mtr><mtr><mtd><msub><mi>V</mi><mi>Y</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mi>&Delta;shift</mi><mo>+</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>Y</mi><mn>2</mn></mrow></msub><mo>[</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><msub><mi>V</mi><mi>Y</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>Y</mi><mn>2</mn></mrow></msub><mo>[</mo><mi>&Delta;shift</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>3</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000572389520000043.GIF" wi="1253" he="612" /></maths>6.39执行向量运算完成数组相加存入向量寄存器V<sub>Z</sub>,即,V<sub>Z</sub>=V<sub>X</sub>+V<sub>Y</sub>;6.40将向量寄存器V<sub>Z</sub>中的结果分别赋值给Z[i],Z[i+1],…,Z[i+w‑1],如公式(4)所示;<maths num="0004" id="cmaths0004"><math><![CDATA[<mrow><mfenced open='{' close=''><mtable><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mn>0</mn><mo>]</mo></mtd></mtr><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>+</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>4</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000572389520000044.GIF" wi="1207" he="308" /></maths>6.41更新i=i+w,j=j+1;6.42将向量寄存器V<sub>Y2</sub>的值赋给V<sub>Y1</sub>,即V<sub>Y1</sub>=V<sub>Y2</sub>,如公式(5)所示;<maths num="0005" id="cmaths0005"><math><![CDATA[<mrow><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>V</mi><mrow><mi>Y</mi><mn>1</mn></mrow></msub><mo>[</mo><mn>0</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>Y</mi><mn>2</mn></mrow></msub><mo>[</mo><mn>0</mn><mo>]</mo></mtd></mtr><mtr><mtd><msub><mi>V</mi><mrow><mi>Y</mi><mn>1</mn></mrow></msub><mo>[</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>Y</mi><mn>2</mn></mrow></msub><mo>[</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><msub><mi>V</mi><mrow><mi>Y</mi><mn>1</mn></mrow></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>Y</mi><mn>2</mn></mrow></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>5</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000572389520000051.GIF" wi="1199" he="314" /></maths>6.43如果j<m,转6.34;否则,转6.44;6.44如果i<N,转6.45;否则,转第七步;6.45执行尾部标量运算,即,Z[i]=X[i]+Y[i];6.46更新i=i+1;6.47如果i<N,转6.45;否则,转第七步;6.48计算移位偏移量Δshift,Δshift=shift<sub>X</sub>‑shift<sub>Y</sub>;6.49定义头部标量运算部分循环次数变量h=min{w‑shift<sub>Y</sub>,N};6.50令k=N‑h;6.51定义向量运算部分循环次数变量m=div(k,w);6.52令i=0,j=0;6.53如果j<h,转6.54;否则,转6.57;6.54执行头部标量运算,即,Z[i]=X[i]+Y[i];6.55更新i=i+1,j=j+1;6.56如果j<h,转6.54,否则,转6.57;6.57令j=0;6.58如果j<m,转6.59;否则,转6.70;6.59加载X[i‑Δshift],X[i‑Δshift+1],…,X[i‑Δshift+w‑1]到向量寄存器V<sub>X1</sub>;6.60加载Y[i],Y[i+1],…,Y[i+w‑1]到向量寄存器V<sub>Y</sub>;6.61加载X[i+w‑Δshift],X[i+w‑Δshift+1],…,X[i+w‑Δshift+w‑1]到向量寄存器V<sub>X2</sub>;6.62设置向量寄存器V<sub>X1</sub>的掩码有效位为:<img file="FDA0000572389520000061.GIF" wi="338" he="193" />即,将向量寄存器V<sub>X1</sub>的后w‑Δshift个分量设置为有效位赋值给另一向量的相应位,而其它位无效;6.63设置向量寄存器V<sub>X2</sub>的掩码有效位为:<img file="FDA0000572389520000062.GIF" wi="313" he="187" />即,将向量寄存器V<sub>X2</sub>前Δshift个分量设置为有效位赋值给另一向量的相应位,而其它位无效;6.64基于向量寄存器掩码重组生成新的向量并赋值给向量寄存器V<sub>X</sub>,即将向量寄存器V<sub>X1</sub>的后w‑Δshift个分量和向量寄存器V<sub>X2</sub>的前Δshift个分量合并重组生成向量V<sub>X</sub>,各分量对应赋值关系如公式(6)所示;<maths num="0006" id="cmaths0006"><math><![CDATA[<mrow><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>V</mi><mi>X</mi></msub><mo>[</mo><mn>0</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>X</mi><mn>1</mn></mrow></msub><mo>[</mo><mi>&Delta;shift</mi><mo>]</mo></mtd></mtr><mtr><mtd><msub><mi>V</mi><mi>X</mi></msub><mo>[</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>X</mi><mn>1</mn></mrow></msub><mo>[</mo><mi>&Delta;shift</mi><mo>+</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><msub><mi>V</mi><mi>X</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mi>&Delta;shift</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>X</mi><mn>1</mn></mrow></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><msub><mi>V</mi><mi>X</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mi>&Delta;shift</mi><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>X</mi><mn>2</mn></mrow></msub><mo>[</mo><mn>0</mn><mo>]</mo></mtd></mtr><mtr><mtd><msub><mi>V</mi><mi>X</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mi>&Delta;shift</mi><mo>+</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>X</mi><mn>2</mn></mrow></msub><mo>[</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><msub><mi>V</mi><mi>X</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>X</mi><mn>2</mn></mrow></msub><mo>[</mo><mi>&Delta;shift</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>6</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000572389520000063.GIF" wi="1264" he="611" /></maths>6.65执行向量运算完成数组相加存入向量寄存器V<sub>Z</sub>,即,V<sub>Z</sub>=V<sub>X</sub>+V<sub>Y</sub>;6.66将向量寄存器V<sub>Z</sub>中的结果分别赋值给Z[i],Z[i+1],…,Z[i+w‑1],如公式(7)所示;<maths num="0007" id="cmaths0007"><math><![CDATA[<mrow><mfenced open='{' close=''><mtable><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mn>0</mn><mo>]</mo></mtd></mtr><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mi>Z</mi><mo>[</mo><mi>i</mi><mo>+</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mi>Z</mi></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>7</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000572389520000064.GIF" wi="1207" he="306" /></maths>6.67更新i=i+w,j=j+1;6.68将向量寄存器V<sub>X2</sub>的值赋给V<sub>X1</sub>,即V<sub>X1</sub>=V<sub>X2</sub>,如公式(8)所示;<maths num="0008" id="cmaths0008"><math><![CDATA[<mrow><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>V</mi><mrow><mi>X</mi><mn>1</mn></mrow></msub><mo>[</mo><mn>0</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>X</mi><mn>2</mn></mrow></msub><mo>[</mo><mn>0</mn><mo>]</mo></mtd></mtr><mtr><mtd><msub><mi>V</mi><mrow><mi>X</mi><mn>1</mn></mrow></msub><mo>[</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>X</mi><mn>2</mn></mrow></msub><mo>[</mo><mn>1</mn><mo>]</mo></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><mfenced open='' close=''><mtable><mtr><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd><mtd><mo>.</mo></mtd></mtr></mtable></mfenced></mtd></mtr><mtr><mtd><msub><mi>V</mi><mrow><mi>X</mi><mn>1</mn></mrow></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>=</mo><msub><mi>V</mi><mrow><mi>X</mi><mn>2</mn></mrow></msub><mo>[</mo><mi>w</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>8</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000572389520000065.GIF" wi="1206" he="314" /></maths>6.69如果j<m,转6.60;否则,转6.70;6.70如果i<N,执行标量运算,转6.71;否则,转第七步;6.71执行尾部标量运算,即,Z[i]=X[i]+Y[i];6.72更新i=i+1;6.73如果i<N,转6.71;否则,转第七步;第七步:结束。
地址 410073 湖南省长沙市开福区德雅路109号
您可能感兴趣的专利