运用模板函数特化提升遥感图像处理效率

使用模板函数特化提升遥感图像处理效率

环境:系统win7,32位,处理器,AMD Athlon(tm) II X3 425 Processor 2.70 GHz

 

 在《一个很难调试的遥感图像处理BUG》(http://blog.csdn.net/kupe87826/article/details/8257504)文章中,我最后用下面这两句代码解决了bug问题。

    x2sum+=xBuffer[i*nw+j]*(double)xBuffer[i*nw+j];

    y2sum+=yBuffer[i*nw+j]*(double)yBuffer[i*nw+j];

     但是我开始思考浮点运算的效率问题。因为现在大多数图像都是整型的,如果浮点运算效率不高,这样估计影像整体计算效率。所以我在我通用模板的基础上,增加了模板的特化。

double cof2< unsigned short int ,unsigned short int>(int bandx,int bandy,GDALDataset*pDataSet,void*pData)

{

 

#define NewType1 unsigned short int

#define NewType2 double

 

...

NewType2  x2sum=0,y2sum=0;

x2sum+=xBuffer[i*nw+j]*(NewType1)xBuffer[i*nw+j];

y2sum+=yBuffer[i*nw+j]*(NewType1yBuffer[i*nw+j];

...

}

 

我分为三组进行测试,

组一:NewType2为double ,NewType1为double

组二:NewType2为double,NewType1为unsigned short int

组三:NewType2为boost::uint64_t,NewType1为unsigned short int

用GetTickCount()函数进行5-6次测试,时间单位为毫秒,结果如下:


组一
17378 19453 16895 16411 16832
组二
17332 17893 19484 19516 17114 17802 16786

组三

15803 15117 15569 15133 14914 15241

 

从结果可以发现整数结果优于浮点结果,但是不是非常明显。

原因是,在很多芯片上浮点数运算要占用接近20的时钟周期, 在有些芯片上比你估计的20倍差距还要大。 浮点数运算非常低效又非常重要,所以从386时代浮点协处理器就很普及了,后来直接把这个协处理器做在cpu里面, 现在的这些cpu都是带浮点处理器的, 一次浮点运算只需要2,3个时钟周期,这已经跟整数乘法差不多了(有些阉割版本处理器这方面会差一些。(本段引用于http://zhidao.baidu.com/question/93265724.html)

 

但是不知道boost::uint64_t会不会影响效率,因为我电脑是32位的,下次有时间用GDT_Byte类型图像做一次测试,再试试看。