使用模板函数特化提升遥感图像处理效率
环境:系统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类型图像做一次测试,再试试看。