[发明专利]数组相加运算汇编库程序的地址对齐SIMD加速方法有效
申请号: | 201310036071.2 | 申请日: | 2013-01-30 |
公开(公告)号: | CN103077008A | 公开(公告)日: | 2013-05-01 |
发明(设计)人: | 迟利华;刘杰;甘新标;晏益慧;徐涵;胡庆丰;龚春叶;冯华;蒋杰 | 申请(专利权)人: | 中国人民解放军国防科学技术大学 |
主分类号: | G06F9/38 | 分类号: | G06F9/38 |
代理公司: | 国防科技大学专利服务中心 43202 | 代理人: | 郭敏 |
地址: | 410073 湖*** | 国省代码: | 湖南;43 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | 本发明公开了一种数组相加运算汇编库程序的地址对齐SIMD加速方法,目的是提高数组相加运算汇编库程序的执行速度。技术方案是首先从目标体系结构中获取SIMD向量宽度w和数据宽度size,然后计算数组X和数组Y的地址对齐偏移量,接下来根据地址对齐偏移量来判断数组X和数组Y的地址是否已经对齐,如果已经对齐,直接对数组X和数组Y进行向量相加运算;否则,对数组X和数组Y进行向量组装与混合运算。即对数组X和数组Y前面部分进行标量运算,对中间部分利用寄存器掩码进行向量组装和向量运算,对尾部不满足向量运算要求的部分采用标量运算。采用本发明可实现汇编库程序数据地址对齐访存,加快SIMD程序运行,提升SIMD计算性能。 | ||
搜索关键词: | 数组 相加 运算 汇编 程序 地址 对齐 simd 加速 方法 | ||
【主权项】:
1.一种数组相加运算汇编库程序的地址对齐SIMD加速方法,其特征在于包括以下步骤:第一步:从目标体系结构信息中获取SIMD向量宽度w和数据宽度size,向量宽度w指SIMD能够同时处理的数据个数,数据宽度size指数据类型占据的字节数;第二步:计算数组X的地址对齐偏移量,具体方法如下:2.1获取X的内存首地址&X;2.2执行求余操作得到地址偏移量offsetX,offsetX=mod(&X,(size*w)),mod(m1,n1)表示m1除以n1得到的余数,“*”为乘法;2.3执行除法操作得到地址对齐偏移量shiftX,shiftX=div(offsetX,size);div(m1,n1)表示m1除以n1得到的结果向下取整;第三步:计算数组Y的地址对齐偏移量,具体方法如下:3.1获取Y的内存首地址&Y;3.2执行求余操作得到地址偏移量offsetY,offsetY=mod(&Y,(size*w));3.3执行除法操作得到地址对齐偏移量shiftY,shiftY=div(offsetY,size);第四步:地址对齐判断,方法是:4.1获取数组X和Y的大小即数组中的元素个数N;4.2如果shiftX=shiftY=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]到向量寄存器VX,加载Y[i],Y[i+1],…,Y[i+w-1]到向量寄存器VY;5.5执行向量运算完成数组相加存入向量寄存器VZ,即,VZ=VX+VY;5.6将向量寄存器VZ中的结果分别赋值给Z[i],Z[i+1],…,Z[i+w-1],如公式(1)所示;Z [ i ] = V Z [ 0 ] Z [ i + 1 ] = V Z [ 1 ] · · · · · · · · · Z [ i + w - 1 ] = V Z [ w - 1 ] - - - ( 1 ) ]]> 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如果shiftX=shiftY,转6.2;否则,转6.216.2定义头部标量运算部分循环次数变量h=min{w-shiftX,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]到向量寄存器VX,加载Y[i],Y[i+1],…,Y[i+w-1]到向量寄存器VY;6.13执行向量运算完成数组相加存入向量寄存器VZ,即,VZ=VX+VY;6.14将向量寄存器VZ中的结果分别赋值给Z[i],Z[i+1],…,Z[i+w-1],如公式(2)所示;Z [ i ] = V Z [ 0 ] Z [ i + 1 ] = V Z [ 1 ] · · · · · · · · · Z [ i + w - 1 ] = V Z [ w - 1 ] - - - ( 2 ) ]]> 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如果shiftX<shiftY,转6.22;否则,转6.48;6.22计算移位偏移量Δshift,Δshift=shiftY-shiftX;6.23定义头部标量运算部分循环次数变量h=min{w-shiftX,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]到向量寄存器VY1;6.34加载X[i],X[i+1],…,X[i+w-1]到向量寄存器VX;6.35加载Y[i+w-□shift],Y[i+w-□shift+1],…,Y[i+w-□shift+w-1]到向量寄存器VY2;6.36设置向量寄存器掩码有效位:某位的掩码设置为1表示可以将该向量掩码为1的分量赋值给另一向量的指定位;掩码设置为0表示该向量掩码为0的分量在向量赋值过程中无效;设置向量寄存器VY1的掩码有效位为:
即,将向量寄存器VY1的后w-Δshift个分量设置为有效位赋值给另一向量的相应位,而其它位无效;6.37设置向量寄存器VY2的掩码有效位为:
即,将向量寄存器VY2前Δshift个分量设置为有效位赋值给另一向量的相应位,而其它位无效;6.38基于向量寄存器掩码重组生成新的向量并赋值给向量寄存器VY,即将向量寄存器VY1的后w-Δshift个分量和向量寄存器VY2的前Δshift个分量合并重组生成向量VY,各分量对应赋值关系如公式(3)所示;
6.39执行向量运算完成数组相加存入向量寄存器VZ,即,VZ=VX+VY;6.40将向量寄存器VZ中的结果分别赋值给Z[i],Z[i+1],…,Z[i+w-1],如公式(4)所示;Z [ i ] = V Z [ 0 ] Z [ i + 1 ] = V Z [ 1 ] · · · · · · · · · Z [ i + w - 1 ] = V Z [ w - 1 ] - - - ( 4 ) ]]> 6.41更新i=i+w,j=j+1;6.42将向量寄存器VY2的值赋给VY1,即VY1=VY2,如公式(5)所示;V Y 1 [ 0 ] = V Y 2 [ 0 ] V Y 1 [ 1 ] = V Y 2 [ 1 ] · · · · · · · · · V Y 1 [ w - 1 ] = V Y 2 [ w - 1 ] - - - ( 5 ) ]]> 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=shiftX-shiftY;6.49定义头部标量运算部分循环次数变量h=min{w-shiftY,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]到向量寄存器VX1;6.60加载Y[i],Y[i+1],…,Y[i+w-1]到向量寄存器VY;6.61加载X[i+w-□shift],X[i+w-□shift+1],…,X[i+w-□shift+w-1]到向量寄存器VX2;6.62设置向量寄存器VX1的掩码有效位为:
即,将向量寄存器VX1的后w-Δshift个分量设置为有效位赋值给另一向量的相应位,而其它位无效;6.63设置向量寄存器VX2的掩码有效位为:
即,将向量寄存器VX2前Δshift个分量设置为有效位赋值给另一向量的相应位,而其它位无效;6.64基于向量寄存器掩码重组生成新的向量并赋值给向量寄存器VX,即将向量寄存器VX1的后w-Δshift个分量和向量寄存器VX2的前Δshift个分量合并重组生成向量VX,各分量对应赋值关系如公式(6)所示;
6.65执行向量运算完成数组相加存入向量寄存器VZ,即,VZ=VX+VY;6.66将向量寄存器VZ中的结果分别赋值给Z[i],Z[i+1],…,Z[i+w-1],如公式(7)所示;Z [ i ] = V Z [ 0 ] Z [ i + 1 ] = V Z [ 1 ] · · · · · · · · · Z [ i + w - 1 ] = V Z [ w - 1 ] - - - ( 7 ) ]]> 6.67更新i=i+w,j=j+1;6.68将向量寄存器VX2的值赋给VX1,即VX1=VX2,如公式(8)所示;V X 1 [ 0 ] = V X 2 [ 0 ] V X 1 [ 1 ] = V X 2 [ 1 ] · · · · · · · · · V X 1 [ w - 1 ] = V X 2 [ w - 1 ] - - - ( 8 ) ]]> 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;否则,转第七步;第七步:结束。
下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国人民解放军国防科学技术大学,未经中国人民解放军国防科学技术大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/patent/201310036071.2/,转载请声明来源钻瓜专利网。
- 上一篇:一种经皮植入的扩散输药器
- 下一篇:带有离轴弹簧系统的惯性传感器