线性汇编经验总结

发信人: giantice (大冰块!), 信区: DSPTech
标  题: 线性汇编经验总结
发信站: 水木社区 (Mon Sep 11 22:47:20 2006), 站内

在C64上编了一些线性汇编,总结了一些经验贴出来,多多指教。
线性汇编经验总结:
        1. 一般只是对有循环结构的代码编写汇编替代,非循环代码不需要流水,性能提高不大
        2. 为形成软件流水,循环体不要做条件判断,如果有条件判断尽量移到循环体外,或者用非跳转代码替代
(例如,在量化相同代码,用条件跳转的何不用条件跳转的性能相差5倍,再比如内存搬移大小不固定的可能产生
条件跳转,使用了固定大小的子块后,子块大小对性能影响不大,汇编代码和C代码的性能相差20倍左右)
        3. 耗时较多的指令主要是load/store/乘/点乘等指令,一般为提高效率,一个循环尽可能处理多个数据操作,如
一般C循环处理一个字节、半字、字的操作,可以一次加载一个半字、字、双字进行操作处理,由于C64有很多以字节、
半字为单位处理的指令,加上软件流水,程序的效率可以提高达到原来汇编的2倍、4倍甚至8倍。
        4. 碰到双循环,一般将较小的循环放到内循环,然后外循环处理一次处理完一个内循环的操作,大大减少跳转的次数。
        5. 实现同样操作尽量用数据相关小易于形成软件流水的指令,尽量用最少周期的指令,尽量用特殊指令(一般效率比较高)
例如:循环体实现一个操作 val = is<0? -val : val,可以用比较和跳转指令实现但破环软件流水效率低,可以通过比较
扩展求或操作得到一个-1或1的数,再用乘运算实现这个操作,虽然周期长了一些,但能形成软件流水,实际提高了效率。
        6. 线性汇编一般常见的错误:
        *       一个.sa汇编文件中的多个函数体内使用同一个标号(特别是循环标号loop/LOOP)等,编译会报rededine
的错误,由于同一个汇编文件形成同一个目标文件,不同函数体中重复/使用同一个标号肯定是不对的,要使用不同的标号区别开
        *       指令使用不当,加/减乘/除/移位等指令一定要注意操作数的类型,对于无符号/绝对值类型的操作数最好
使用无符号的操作指令
        *       操作数溢出问题
        *       ...
        7. 线性汇编调试经验:
        *       汇编程序先调试通过再进入具体工程中使用,一般是新建一个仿真工程用于编写、调试、测试汇编代码,
一方面,可以保证汇编程序准确无误;另一方面,可以方便观察汇编代码和对应C代码的性能提高情况,保证仿真测试下,
汇编代码的效率确实比C代码有所提高。
        *       汇编代码调试时先不使用任何优化选项,这样可以通过Debug单步执行所编的代码,便于检查代码的错误,
需要注意的是,即使不使用优化选项,在没有分配资源单元时,编译器仍然对寄存器的使用进行了调整(尤其是寄存器冗余
使用时),即单步调试时,寄存器的值不一定和代码里的执行得到的值相对应,但通过Watch Window观察到所有寄存器及其
值的变化。
        *       内存的观察最简便的方法就是使用memory window,还可以调整显示的数据类型,通过红色标记看到存储
的变化,如果要对比前后的数值可以将其打印到输出窗口。
        *       周期性能的测试,有没有使用优化选项其结果的正确性是一致的,汇编程序调试通过后,使用优化选项
-o2/-o3来优化代码,使用profile里面的时钟工具测试C代码和汇编代码执行的周期。
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值