免费论文网 首页

浮点性能

时间:2017-05-15 07:39 来源:免费论文网

篇一:RGB转灰度算法浮点与定点性能比较

RGB转灰度算法浮点与定点性能比较

罗海风 2013.4.2

工作内容

在已有的RGB转灰度图像的函数基础上,将其中浮点运算转化为定点运算。并在VC工程和CCS软仿真工程(及ccs工程不断优化过程中出现多个版本)中运行,对比两者性能。

对比细节

1. VC工程:

2. CCS软仿真DM6446工程 (编译器未优化)

3. CCS软仿真DM6446工程 (编译器优化:-mv64+, symdebug: skeletal, -O3, -mt, -pm, opt_for_speed=5)

4. CCS软仿真DM6446工程 (编译器优化:-mv64+, symdebug: skeletal, -O3, -mt, -pm, opt_for_speed=5,c代码优化:long换成int)

5. CCS软仿真DM6446工程 (编译器优化:-mv64+, symdebug: skeletal, -O3, -mt, -pm, opt_for_speed=5,c代码优化:long换成int, 添加软件流水,设置MUST_ITERATE)

对比结果

1. VC工程中采用上述两种方式对同一图像进行灰度化,定点运算耗时为浮点运算耗时的42~43%左右;

2. CCS工程中软件仿真DM6446运行(编译器未优化),定点运算耗时为浮点运算耗时的8.2~8.3%左右;

编译器及c代码优化后,定点运算耗时为浮点运算耗时的2%左右。 3. 此对比结果受图像大小影响较小; 4. 此对比结果几乎不受定点运算Q值影响。

原浮点运算函数代码

void fnRgb2gray(unsigned char *pBufferRGB,unsigned char **pBufferGray,int iWidth, int iHeight) {

//最好是做过镜像的 int i = 0, j = 0, ivalue =0; int iWidthByteDuiqiRgb = iWidth*3; int iWidthByteDuiqiGray = iWidth; while(iWidthByteDuiqiGray%4 != 0) { }

while(iWidthByteDuiqiRgb%4 != 0) { }

iWidthByteDuiqiRgb = (iWidthByteDuiqiRgb/4+1)*4; iWidthByteDuiqiGray = (iWidthByteDuiqiGray/4+1)*4;

//*pBufferGray = new unsigned char[iWidthByteDuiqiGray*iHeight];

*pBufferGray = (unsigned char *) malloc (sizeof(unsigned char) * iWidthByteDuiqiGray*iHeight); for(i=0;i<iHeight;i++) {

for(j=0;j<iWidth;j++) {

ivalue = (int)((0.114*pBufferRGB[i*iWidthByteDuiqiRgb+j*3+0]+

0.587*pBufferRGB[i*iWidthByteDuiqiRgb+j*3+1]+0.299*pBufferRGB[i*iWidthByteDuiqiRgb+j*3+2])+0.5);}

} return;

}

if(ivalue>255) { }

(*pBufferGray)[i*iWidthByteDuiqiGray+j] = (unsigned char)ivalue;

ivalue = 255;

定点运算函数代码

对应版本:CCS软仿真DM6446工程 (编译器未优化)

对应版本:CCS软仿真DM6446工程 (编译器优化:-mv64+, symdebug: skeletal, -O3, -mt, -pm, opt_for_speed=5) #define Q 15

void fnRgb2grayFixed(unsigned char *pBufferRGB,unsigned char **pBufferGray,int iWidth, int iHeight)

}

int iWidthByteDuiqiRgb = iWidth * 3; int iWidthByteDuiqiGray = iWidth; while(iWidthByteDuiqiGray%4 != 0) { }

while(iWidthByteDuiqiRgb%4 != 0) { }

//*pBufferGray = new unsigned char[iWidthByteDuiqiGray * iHeight];

*pBufferGray = (unsigned char *) malloc (sizeof(unsigned char) * iWidthByteDuiqiGray * iHeight); for(i = 0; i < iHeight; i++) {} return;

for(j = 0; j < iWidth; j++) {}

ivalue = (int)((coef1 * pBufferRGB[i * iWidthByteDuiqiRgb + j * 3 + 0]

+ coef2 * pBufferRGB[i * iWidthByteDuiqiRgb + j * 3 + 1]

+ coef3 * pBufferRGB[i * iWidthByteDuiqiRgb + j * 3 + 2] + coef4)>>Q);

iWidthByteDuiqiRgb = (iWidthByteDuiqiRgb/4 + 1) * 4; iWidthByteDuiqiGray = (iWidthByteDuiqiGray/4 + 1) * 4; int i = 0, j = 0, ivalue = 0; long temp = pow(2,Q); long coef1 = 0.114 * pow(2,Q); long coef2 = 0.587 * pow(2,Q); long coef3 = 0.299 * pow(2,Q); long coef4 = 0.500 * pow(2,Q);

if(ivalue > 255) { }

(*pBufferGray)[i * iWidthByteDuiqiGray + j] = (unsigned char)ivalue;

ivalue = 255;

定点运算函数代码

对应版本:CCS软仿真DM6446工程 (编译器优化:-mv64+, symdebug: skeletal, -O3, -mt, -pm, opt_for_speed=5,c代码优化:long换成int) #define Q 15

void fnRgb2grayFixed(unsigned char *pBufferRGB,unsigned char **pBufferGray,int iWidth, int iHeight) {

}

int temp = pow(2,Q);

const int coef1 = 0.114 * pow(2,Q); const int coef2 = 0.587 * pow(2,Q); const int coef3 = 0.299 * pow(2,Q); const int coef4 = 0.500 * pow(2,Q); int iWidthByteDuiqiRgb = iWidth * 3; int iWidthByteDuiqiGray = iWidth; while(iWidthByteDuiqiGray%4 != 0) { }

while(iWidthByteDuiqiRgb%4 != 0) { }

//*pBufferGray = new unsigned char[iWidthByteDuiqiGray * iHeight];

*pBufferGray = (unsigned char *) malloc (sizeof(unsigned char) * iWidthByteDuiqiGray * iHeight); for(i = 0; i < iHeight; i++) {} return;

for(j = 0; j < iWidth; j++) {}

ivalue = (int)((coef1 * pBufferRGB[i * iWidthByteDuiqiRgb + j * 3 + 0]+ coef2 * pBufferRGB[i * iWidthByteDuiqiRgb + j * 3 + 1]

+ coef3 * pBufferRGB[i * iWidthByteDuiqiRgb + j * 3 + 2] + coef4)>>Q);

iWidthByteDuiqiRgb = (iWidthByteDuiqiRgb/4 + 1) * 4; iWidthByteDuiqiGray = (iWidthByteDuiqiGray/4 + 1) * 4;

if(ivalue > 255) { }

ivalue = 255;

(*pBufferGray)[i * iWidthByteDuiqiGray + j] = (unsigned char)ivalue;

定点运算函数代码

对应版本:CCS软仿真DM6446工程 (编译器优化:-mv64+, symdebug: skeletal, -O3, -mt, -pm, opt_for_speed=5,c代码优化:long换成int, 添加软件流水,设置MUST_ITERATE) #define Q 15

void fnRgb2grayFixed(unsigned char *pBufferRGB,unsigned char **pBufferGray,int iWidth, int iHeight) {

int i = 0, j = 0, ivalue = 0; int temp = pow(2,Q);

const int coef1 = 0.114 * pow(2,Q);

const int coef3 = 0.299 * pow(2,Q); const int coef4 = 0.500 * pow(2,Q); int iWidthByteDuiqiRgb = iWidth * 3; int iWidthByteDuiqiGray = iWidth; while(iWidthByteDuiqiGray%4 != 0) { }

while(iWidthByteDuiqiRgb%4 != 0) { }

//*pBufferGray = new unsigned char[iWidthByteDuiqiGray * iHeight];

*pBufferGray = (unsigned char *) malloc (sizeof(unsigned char) * iWidthByteDuiqiGray * iHeight); #pragma MUST_ITERATE (2500, 1000000);

iWidthByteDuiqiRgb = (iWidthByteDuiqiRgb/4 + 1) * 4; iWidthByteDuiqiGray = (iWidthByteDuiqiGray/4 + 1) * 4;

}

for(i = 0; i < iHeight; i++) { } return;

for(j = 0; j < iWidth; j++) { }

ivalue = coef1 * pBufferRGB[i * iWidthByteDuiqiRgb + j * 3 + 0]; ivalue += coef2 * pBufferRGB[i * iWidthByteDuiqiRgb + j * 3 + 1]; ivalue += coef3 * pBufferRGB[i * iWidthByteDuiqiRgb + j * 3 + 2]; ivalue += coef4; ivalue = ivalue >>Q; if(ivalue > 255) { }

ivalue = 255;

(*pBufferGray)[i * iWidthByteDuiqiGray + j] = (unsigned char) ivalue;

定点运算函数代码

对应版本:CCS软仿真DM6446工程 (编译器优化:-mv64+, symdebug: skeletal, -O3, -mt, -pm, opt_for_speed=5,c代码优化:long换成int, 添加软件流水,设置MUST_ITERATE,部分运算更换为内联函数) #define Q 12

void fnRgb2grayFixed(unsigned char *pBufferRGB,unsigned char **pBufferGray,int iWidth, int iHeight) {

int i = 0, j = 0, ivalue = 0, ivalue1 = 0, ivalue2 = 0; int temp = pow(2,Q);

const int coef1 = 0.114 * pow(2,Q);

篇二:定点DSP和浮点DSP的区别与比较

定点与浮点运算 DSP 的比较

DSP数字信号处理器是一种特别适合于进行数字信号处理的微处理器,主要用于实时快速地实现各种数字信号处理算法。定点运算 DSP 在应用中已取得了极大的成功,而且仍然是 DSP 应用的主体。然而,随着对 DSP 处理速度与精度、存储器容量、编程的灵活性和方便性要求的不断提高、自 80 年代中后期以来,各 DSP 生产厂家陆续推出了各自的 32bit浮点运算 DSP。

和定点运算 DSP 相比,浮点运算 DSP 具有许多优越性: 浮点运算 DSP 比定点运算 DSP 的动态范围要大很多。

定点 DSP 的字长每增加 1bit,动态范围扩大 6dB。16bit 字长的动态范围为 96dB。程序员必须时刻关注溢出的发生。例如,在作图像处理时,图像作旋转、移动等,就很容易产生溢出。这时,要么不断地移位定标,要么作截尾。前者要耗费大量的程序空间和执行时间,后者则很快带来图像质量的劣化。总之,是使整个系统的性能下降。在处理低信噪比信号的场合,例如进行语音识别、雷达和声纳信号处理时,也会发生类似的问题。

32bit 浮点运算 DSP 的动态范围可以作到 1536dB,这不仅大大扩大了动态范围,提高了运算精度,还大大节省了运算时间和存储空间,因为大大减少了定标,移位和溢出检查。 由于浮点 DSP 的浮点运算用硬件来实现,可以在单周期内完成,因而其处理速度大大高于定点 DSP。这一优点在实现高精度复杂算法时尤为突出,为复杂算法的实时处理提供了保证。

32bit 浮点 DSP 的总线宽度较定点 DSP 宽得多,因而寻址空间也要大得多。这一方面为大型复杂算法提供了可能、因为省的 DSP 目标子程序已使用到几十MB 存储器或更多;另一方面也为高级语言编译器、DSP 操作系统等高级工具软件的应用提供了条件。

DSP 的进一步发展,必然是多处理器的应用。新型的浮点 DSP 已开始在通信口的设置和强化、资源共享等方面有所响应。

TMS320C6000家族为高性能DSP,包括:

TMS320C62X定点DSP系列、TMS320C64X定点DSP系列、TMS320C67X定点DSP系列。

TMS320C62X系列

工作频率:150-300MHz,运行速度:1200-2400MIPS,内部2个乘法器、6个算术逻辑单元,超长指令字(VLIW)结构,大容量的片内存储器和大范围的寻址能力,4个DMA接口,2个多通道缓存串口,2个32位片内外设。

TMS320C64X系列

工作频率:400-600MHz,运行速度:3200-4800MIPS,具有特殊功能的指令集。

TMS320C67X系列,为高性能浮点DSP

工作频率:100-225MHz,运行速度:600-1350MIPS,具有4个浮点/定点算术逻辑单元,2个定点算术逻辑单元,2个浮点/定点乘法器。

篇三:科学计算当中的高精度浮点运算

科学计算当中的高精度浮点运算

David H. Bailey 2005年1月25日

摘要:

目前,IEEE的64位浮点运算在大多数科学应用当中足够精确。然而,对于快速增长的重要科学计算应用中,需要更高水平的数值精度:其中的一些应用需要大约两倍于现在的水平;其他的需要四倍;而还有一些人为了获得有意义的数值结果需要数百或更多位数。新的高精度的软件包,包括用来减少转换工作的高级语言翻译模块为这样的计算提供了便利的。在不同领域里包括量子理论,气候建模与数学实验,这些活动已经产生了一些有趣的新的科学成果,其中一些将在本文中所描述。这些进展表明,在未来,用于科学计算的数值精度同程序设计的算法和数据结构一样重要。

关键词:高精度算法,数学实验,气候模拟,量子理论,计算化学,计算物理 说明:

这项工作由计算技术研究,离散数学数学,信息,美国计算科学和能源部支持,合同号:DE-AC03-76SF00098

1、序言

几乎所有的现代计算机系统,从个人计算机到最大的超级计算机,实现了64位浮点运算标准,提供53个尾数位,或大约16位十进制精度。对于大多数科学应用来说,这是绰绰有余的,以及一些应用程序,如常规试验数据的处理,即使是32位的标准往往也恩能提供足够的精度。

然而,对于一个迅速扩大的应用机构,64位的算术将不再是足够的。这些范围从一些有趣的新的数学计算到在高性能并行超级计算机上进行的大型物理模拟。在这些应用中,部分包括敏感的计算数值的常规代码,使用常规算法产生结果的准确性有问题。这些不准确地结果可能反过来导致其他错误,如在一个条件分支上错误的路径。

一些困难,这种类型的可能是通过改变基本的算法或改变某些操作的顺序

从而被修改,其中一些操作可移执行。但在其他情况下,这种修正是有效的,其中一些问题,是正常水平的两倍,大约32-digit精度是足够的。在其他情况下,四倍的正常水平是必要的,或大约六十四位数的精度。在其他一些情况下,包括从物理和数学的应用,更高水平的精度是必要的,从数百到数千位。

重要的是要记住这里非常少数的目前参与技术计算的科学家和工程师谁是有严格的数值分析背景中。更重要的是,这种稀缺的数值技术有可能恶化,如果没有改善的话,在未来,部分原因是由于缺乏对数值计算有兴趣的学生和年轻的研究人员 [ 22]。因此,虽然有些人可能认为,敏感的数值计算可以通过使用不同的算法或编码技术,而在实践中这种变化是非常容易出错而且人力成本非常昂贵。换句话说,使用高精度算法克服这些困难,通常将更容易,更便宜和更可靠,即使其他的补救措施在理论上是可行的。

本文将着重于高精度的浮点数而不是整数运算。然而,应该注意的是,高精度(即多字)整数运算在所有的舞台上本身就是一个非常有趣的,有众多的应用在纯数学和应用数学。例如,当登录到一个安全网站购买书或电脑配件,浏览器软件进行高精度的整数计算交流信用卡号码和其他安全信息。与此密切相关的技术是在大整数分解算法进行的研究,其中最近我们已经取得了几个显著的进展。一个很好的参考这是最近出版的兰德尔和波默朗斯的一本书[ 17 ]。在crandall-pomerance书中描述的mathe-matica的算法的实现可从

/software.htm找到。

2、高精度软件

进行高精度浮点运算的软件包在早期的计算当中就已经实现。例如,李察布兰特写的一个软件包20世纪70年代以来就开始被使用[ 14]。然而,许多这些软件包需要重写。很难作出这样的改变,以及难以调试产生的代码,这阻止了只有少数科学家能够利用这种软件。在过去几年中,高精度的软件包已产生,包括高级语言的接口,使这种转换相对不那么困难。这些软件包通常利用自定义的数据类型,运算符重载的特点,现在在语言如C++和Fortran-90上也可以,转换很方便。

更先进的高精度计算在商业软件mathematica和 Maple中是可以的。这些产品以非常自然的方式将任意精度算术,在纯数学和应用数学中,延伸到了一个范围广泛的先进功能。这些软件包在一些方面中是非常有用的,但他们一般没有专业高精度的计算软件包快,同时在Fortran-90或C+编程中提到,他们没有提供一种手段,利用高精度的计算设施来转换现有的科研项目。

一些高精度的计算软件包例子,在互联网上免费提供的有下面这些(按字母顺序列出)。ARPREC, DDFUN, QD and MPFUN90在作者的网站上可以得到:http://crd.lbl.gov/~dhbailey/mpdist or from /gmp

?Predicates. 这是一个专为执行敏感数值的高精度包,经常出现在计算几何中。这个软件是由加州大学伯克利分校的乔纳森编写的,并可在一下网址获得:http://www-2.cs.cmu.edu/~quake/robust.html.

?QD.这个软件包包括例程执行“double-double”(约31位)和“quad-double”(约62位数)算法。高级语言的接口对C++和Fortran-90是可以的,支持实数,整数和复杂数据类型。QD软件包速度远远超过应用在31个或62个数字是足够的使用任意精度的软件。该软件由Xiaoye S. Li 和Yozo Hida编写。

?MPFR. 该MPFR库是C软件包用于多精度浮点舍入精确计算,并基于GMP多精度库。更多信息在一下网站了解:

http://www.mpfr.org

?MPFR++.这是一个MPFR的高级C++接口。更多信息可在一下网站获取:http://perso.ens-lyon.fr/nathalie.revol/software.html

?MPFUN90. 这在用户水平功能上相当于ARPREC,但完全是用Fortran-90编写的并且提供了一个Fortran-90语言接口。

?VPA.这个软件包提供了一个任意精度的功能和FORTRAN语言接口。该软件是由J.L. Schonfelder of N.A.和 Software of the U.K编写,在以下网站可以获得:http://pcwww.liv.ac.uk//vpa20.htm

这些软件包当中很多都包括示例应用程序。例如,ARPREC 和 MPFUN90软件包包括程序,实现“PSLQ”算法的整数关系检测(见第10和11)。该ARPREC 、 MPFUN90和QD包包括高精度项目计算积分。沿着这条线,它现在可以计算许多出现在精度要求非常高数学或物理中的积分,即使在被积函数有奇异点,如垂直衍生物或无限价值的终点的情况下。当这些高精度的集成方案,结合整数关系检测方法,它往往是可能获得的分析评价积分的,否则没有已知的解决方案[ 9,10 ]。

采用高精度软件与使用传统精度机器相比肯定增加了计算机的运行时间。例如,使用双精度计算一般比普通的64位的计算长五倍。quad-double计算中这个数字将上升到25倍,100位就算时将在50倍以上。超过100位精度,为p精度的计算代价与100位相比将大约增加到倍。之后,增加的成本大约为plogpp2(假设是使用快速繁殖,这是有可能的例如在ARPREC 和 MPFUN90中)。幸运的是,它往往是整个计算不必要采用高精度。往往是一个关键的循环,需

要高精度。我们现在将描述一些利用高精度的算法的科学应用。

3、气候建模。

众所周知,天气或气候模拟是从根本上是杂乱无序的。如果在一定的时期内当前状况有了微观改变,未来状态的模拟是完全不同的。事实上,这些计算的整体需要从这些计算中得到较准确的全球气候变化趋势。因此,参与气候建模应用计算机科学家,他们的代码使自己偏离任何“基线”计算,即使他们只改变使用的处理器数量运行代码。因此,它不仅是很难研究比较的结果,在决定是否他们已经正确的在给定系统上部署他们的代码的问题上往往是有问题的。

最近,在LBNL的两个研究人员,海伦他和克里斯丁,调查了在一个广泛使用的气候模型代码中的无重复性现象。他们发现,几乎所有的数值变化都发生在一个内积回路中的大气数据同化的一步,和一个大的共轭梯度算法的类似的操作中。HE和Ding发现一个简单的解决方案是在这些循环中采用double - double运算(使用DDFUN包以上)。这一变化,大大减少了整个应用程序中的数值变异,使电脑运行相比以前有更长的运行时间。他们的工作细节可以阅读[ 21]。

回想起来,这是不明确的,以这种方式处理这些款项是最好的方法,而在同一时间产生重复的结果,可能有其他的方式保证有意义的数值精度。这种现象值得进一步研究和完善,并正在研究当中。但同时,HE和Ding的解决方案是处理这个问题的一个简单而有效的方式。

4、超新星的模拟

最近Edward Baron, Peter Hauschildt, 和 Peter Nugent用QD包,提供了double - double(128位或31-digit)和quad-double(256位或62-digit)数据类型,解决了非局部热动平衡人口的铁和其他原子在大气层的超新星和其他天体物理对象[ 11,20 ]。例如铁在大气的外层可能存在二价铁,但在内部四价铁或五价铁占主导。引入人工限导致数值问题,因此有必要同时解决所有这些群体。由于相对人口的任何国家主导的阶段是成正比的指数的电离能,动态范围内,


浮点性能
由:免费论文网互联网用户整理提供,链接地址:
http://m.csmayi.cn/meiwen/38187.html
转载请保留,谢谢!
相关阅读
最近更新
推荐专题