一种编译器前端乘幂运算的方法技术

技术编号:13181005 阅读:67 留言:0更新日期:2016-05-11 12:58
一种编译器前端乘幂运算的方法就是利用乘幂运算进行,它是最基本的数学表达式之一,并且被大多数编译器支持,在高性能计和密码算法中应用十分频繁。

【技术实现步骤摘要】

主要涉及计算机算法领域。
技术介绍
乘幂运算是最基本的数学表达式之一,几乎所有高级语言都直接支持。同时,在实际应用尤其是高性能科学计算和密码算法中使用乘幂运算频率较高。因此,对编译器如何实现乘幂运算提出了较高的优化要求。目前,编译器对乘幂的支持与优化理论研究已经比较成熟,本专利技术主要是根据这些优化方法提出一个具体的实现算法,为研究编译器前端优化处理乘幂运算提供一个参考。这个算法是Window算法和静态最优加法链表算法的结合,最后给出算法效率分析。
技术实现思路
通过国家专利检索没有发现关于此系统方面的申请资料。此方法主要是功能是将前端的乘幂操作转换为等价乘积,该文的算法结合Window算法和静态加法链算法,既能处理任意大小的幂值,又能得到比Window算法更短的加法链。在实现中,定义的最优静态加法链表的大小为256,Win_dow大小为3:Sdefine POWI_TABLE_SIZE 256Sdefine P0ffI_ffIND0ff_SIZE 3静态最优加法链表的定义如下所示:static const unsigned char powi_table={0,1,1,2,2,3,3,4, / * 0-7 * /4,6,5,6,6,10,7,9, / * 8-15 * /8,16,9,16,10,12,11,13,/ * 16-23 * /12,17,13,18,14,24,15,26,/ * 24-31 * /16,17,17,19,18,33,19,26, / * 32-39 * /20.25.21.40.22.27.23.44,/ * 40-47 * /24.32.25.34.26.29.27.44,/ * 48-55 * /28.31.29.34.30.60.31.36,/* 56-63 * /32.64.33.34.34.46.35.37,/ * 64-71 * /36,65,37,50,38,48,39,69, / * 72-79 * /40,49,41,43,42,51,43,58, / * 80-87 * /44,64,45,47,46,59,47,76, / * 88-95 * /48,65,49,66,50,67,51,66, / * 96-103 * /52,70,53,74,54,104,55,74, / * 104-111 * /56.64.57.69.58.78.59.68,/ * 112-119 * /60.61.61.80.62.75.63.68,/ * 120—127 * /64,65,65,128,66,129,67,90, / * 128-135 * /68,73,69,131,70,94,71,88, / * 136-143 * /72.128.73.98.74.132.75.121,/ * 144—151 * /76,102,77,124,78,132,79,106, / * 152-159 * /80,97,81,160,82,99,83,134, / * 160-167 * /84,86,85,95,86,160,87,100, / * 168-175 * /88.113.89.98.90.107.91.122,/ * 176-183 * /92,111,93,102,94,126,95,150,/ * 184-191 * /96,128,97,130,98,133,99,195, / * 192-199 * /100,128,101,123,102,164,103,138,/ * 200-207 * /104,145,105,146,106,109,107,149, / * 208-215 * /108,200,109,146,110,170,111,157,/ * 216-223 * /112,128,113,130,114,182,115,132,/ * 224-231 * /116,200,117,132,118,158,119,206,/ * 232-239 * /120,240,121,162,122,147,123,152,/ * 240-247 * /124,166,125,214,126,138,127,153,/ * 248-255 * /}; 比如求 n(n〈256)的加法链,powi_tabie和 n-powi_tabie即为加法链中的两个元素,以此类推直到有一个元素为I。给出了 η! 100的最优加法链表,其余的可以在GCC网站中得到。另一个重要的数据结构是:tree vartmp; 这个数组用来放置加法链对应的幂值,是存放临时结果的。其中tree 是操作数在编译器中间层的表示,称为树节点。其初值除vartmp 外都为零,vartmp 等于X1对应的树节点。笔者在实现这个算法的时候,没有根据经典的加法链算法,首先求出加法链,然后根据加法链填充中间幂值。而是采用了递规函数来实现,十分简洁,算法的主要部分是递规函数:gfc_expand_powi算法 6:gfc_expand_powi输入:n, vartmp输出:vartmp **nwindow" (l?POWI_WINDOff_SIZE) -1 ; 可以看出,这种算法可以处理任意大小的n值。当n>255时,沿着左边两条分支得出op I和op2。其中的一个操作数为window位,可直接查表得出最优加法链;另一个采用加倍规则,以指数速度递减到小于256,然后查表得出加法链。同时,只要指数小于256,中间结果都保存下来。从最右边的分支可以看到,如果指数小于256,首先检查vartmp中有没有已经算出的结果,如果有就直接使用,避免了再去求加法链。因此,算法的效率很高。在编译器的具体实现中,还要考虑另外一种情况,即当底数X为整数,指数η为负常整数时,乘幂的结果只有三种情况:-1,0,1。如果η为负奇数,则X为I,结果为I ;χ为_1,结果为_1 ;其余结果为O。即可将乘幂操作转换为如下代码:P= (x==l?l:x==-l?-l:0); 如果n为负偶数,则X为I或-1,结果为I;其余结果为O。即可将乘幂操作转换为如下代码:P= (X == -1 11 X== I ? I:0); 算法的效率主要体现在将乘幂运算转换后乘法运算的次数,在加法链算法中也就是加法链的长度。对于二进制算法,不管采不采用加法链算法,其乘法次数与幂指数的二进制表示有关,从算法中可以看出其乘法次数为:ign」+u (η) 其中u (η)表示η的二进制表示中I的个数。Window算法,其加法链长度为:L- !_ g_g!! ! 1-g ""+ L!+ gι-g +2 !-1 L为指数η的二进制长度:ign+l, g为η的概率,!为Window的位数。该文没有对算法6的效率进行形式化的证明,但因为它采用了 Window算法和静态最优加法链算法,其效率要优于单纯的Window算法。在实际应用中,通过测试某物理模拟题,单机性能提高约3% ο【主权项】1.其主要特征是结合了 Window算法和静态加法链算法,既能处理任意大小的幂值,又能得到比Window算法更短的加法链。2.根据权利要求1本文档来自技高网...

【技术保护点】
一种编译器前端乘幂运算的方法其主要特征是结合了Window 算法和静态加法链算法,既能处理任意大小的幂值,又能得到比Window 算法更短的加法链。

【技术特征摘要】

【专利技术属性】
技术研发人员:不公告发明人
申请(专利权)人:镇江鼎拓科技信息有限公司
类型:发明
国别省市:江苏;32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1