这几天在实验室收获良多,很迫切地想记录下来。
《感悟设计——电子设计的经验与哲理》希望专业相关的朋友们能看看这本书,我看过之后只能膜拜。差距啊…
接下来是看到现在个人总结并觉得震撼的地方。
1.能用定点运算的就绝不用浮点运算。尽管有的处理器里面带有浮点运算功能,频率也够高,所以让人觉不出什么不同,可为了提高运算速度,定点绝对比浮点来得更快。
2.能用移位的不用除法/乘法。有的处理器根本不能跑除法,所以只能用移位来近似。就算能进行除法运算也绝对比移位慢好几倍甚至好几十倍的速度。乘法也一样,而且为了让乘法器能更好的用在滤波器运算中,普通的运算还是不用它的为好。
3.查表与运算之间的选择。查表速度上比运算快,但资源较为浪费。相反,运算需要时间,内存资源则用的较少。
以上的我都还能想到,也觉得都很必要。后面的,打死我都不可能想得到……
首先比较下两段代码:
第一段,我觉得大多数人都会这么写,包括我也肯定是。这是一个将RGB的彩色数据转换成灰度值的其中一段代码。
int i;
for(i=0;i<IMGSIZE;i++)
{
int r,g,b,y;
r="D"[in.r]; g="E"[in.g]; b="F"[in.b];
y="r"+g+b;
out=y;
}
第二段。
int i;
for(i=0;i<IMGSIZE;i+=2)
{
int r,g,b,y,r1,g1,b1,y1;
r="D"[in.r]; g="E"[in.g]; b="F"[in.b];
y="r"+g+b;
out=y;
r1=D[in[i+1].r]; g1=E[in[i+1].g]; b1=F[in[i+1].b];
y1=r1+g1+b1;
out[i+1]=y1;
}
乍眼一看,会觉得第二段代码写的是不是有问题啊?为什么第一段就已经可以完成的运算非要在循环体里面写两遍?这都是因为如今的32bitCPU都至少有两个ALU,而且都是并行的。所以,为了让两个ALU都运作起来,我们将程序设计成第二段的形式。这样的速度就提高了一倍!
不得不折服……不管是做一个硬件工程师也好,软件工程师也好,都必须对硬件架构和操作系统有很好的认识,不然只会成为一个程序员而已,而且还是个不够格的菜鸟程序员。
文章评论(0条评论)
登录后参与讨论