我已经养成了在我的代码中尽可能使用无符号整数的习惯,因为处理器可以对无符号类型进行2的幂整除,而对于有符号类型则做不到。速度对这个项目至关重要。该处理器的运行速度高达40MIPS。
我的处理器有一个18周期的分频,但它比单周期桶移位器需要更长的时间。那么,是否值得在这里使用无符号整数来加快速度,或者它们是否会带来其他缺点?我使用的是微芯片公司的dsPIC33F系列中的一款dsPIC33FJ128GP802。它对有符号整数和无符号整数都有单循环乘法。它也有符号和零扩展指令。
例如,当混合有符号整数和无符号整数时,它会生成以下代码。
026E4 97E80F mov.b [w15-24],w0
026E6 FB0000 se w0,w0
026E8 97E11F mov.b [w15-31],w2
026EA FB8102 ze w2,w2
026EC B98002 mul.ss w0,w2,w0
026EE 400600 add.w w0,w0,w12
026F0 FB8003 ze w3,w0
026F2 100770 subr.w w0,#16,w14我使用的是C(dsPIC的GCC)。
发布于 2010-12-02 19:07:38
我认为我们都需要更多地了解你的处理器的特性才能回答这个问题。为什么它不能对有符号整数做2的幂整除呢?据我所知,两者的操作是相同的。也就是说。
10/2 = 00001010等于00000101
-10/2 = 11110110转到11111011
也许你应该写一些简单的代码,执行一个无符号除法和一个有符号除法,并比较编译后的输出。
此外,基准测试也是一个好主意。它不需要精确。只要有一个由几千个数字组成的数组,启动一个计时器,开始将它们除以几百万次,并计算需要多长时间。如果你的处理器很快,也许会做几十亿次。例如。
int s_numbers[] = { etc. etc. };
int s_array_size = sizeof(s_numbers);
unsigned int u_numbers[] = { etc. etc.};
unsigned int u_array_size = sizeof(u_numbers);
int i;
int s_result;
unsigned int u_result;
/* Start timer. */
for(i = 0; i < 100000000; i++)
{
i_result = s_numbers[i % s_array_size] / s_numbers[(i + 1) % s_array_size];
}
/* Stop timer and print difference. */
/* Repeat for unsigned integers. */仓促写出原则,如有错误敬请谅解。
它不会给出精确的基准测试,但应该给出一个大致的想法,哪个更快。
发布于 2010-12-03 02:15:46
我对你的处理器上可用的指令集不太了解,但快速浏览一下就会发现,它包含了可以用于算术和逻辑移位的指令,这意味着移位一个有符号的值的成本与移动一个无符号的值的成本大致相同,并且每次使用移位都除以2的幂也应该是相同的成本。(我对此的了解来自于快速浏览一下针对您的处理器系列的C编译器的一些内部函数)。
也就是说,如果您使用的值将被解释为无符号,那么您也可以将其声明为无符号。在过去的几年里,我越来越多地使用stdint.h中的类型,通常我最终都会使用无符号版本,因为我的值本质上是无符号的,或者我只是将它们用作位数组。
发布于 2010-12-03 02:26:11
双向生成程序集并计算循环次数。
https://stackoverflow.com/questions/4333984
复制相似问题