DSP中的C优化
C6000系列DSP的硬件资源为高性能提高了必要条件,TI公司也配合C6000推出了世界上第一个效率可达70%~80%的汇编语言级C编译器,它产生的代码平均效率是以往DSP编译器的3倍,如何理解并充分利用这些有利资源,使代码达到所期望的性能,是本章的主题。
① 第一阶段:属于纯C阶段,此时不需要了解C6000的知识,只需保证代码的正确性。
② 第二阶段:利用本章介绍的优化方法改进C代码。
③ 第三阶段:从C程序中抽出对性能影响较大的函数,编写线性汇编,再使用汇编优化器优化该段代码;或直接对该函数编写标准汇编。
以上三个阶段不是必须经过的,当在某一阶段已获得了期望的性能,就无需进入下一个阶段
3.2编译选项
C6000
C/C++编译器提供了大量的编译选项,供用户在编译时选择使用。这些选项中有一部分是事务性的,比如选择文件路径和控制输出文件格式等;有一部分直接影响或控制编译器的优化过程,进而影响代码的优化性能。
编译选项是一个字母或者两个字母,对大小写不敏感,前面有一个“-”符号,分为若干等级和种类:
1、 在优化性能很重要的场合避免使用的:
-g:允许符号调试,要求编译器编译出的“.out”文件保留符号调试的能力,可以在c语言级别进行调试和剖析,极大限制代码的优化。使用联合使用-g、-mt和-o3可以保证能够进行符号调试的情况下最大限度的优化。
-mu:禁止使用软件流水方法编译。
2、用于性能优化的:
-o: 使能软件流水和其他优化方法。
-o0/-o1(register-level
optimizations/ local optimizations):
· 流程优化
· 给变量分配寄存器
· Performs loop rotation
· 消除无用的代码,简化表达式
· 去除不必要的局部内存的分配
-o2(function-level optimizations):
· 启用软件流水
· 循环优化,如循环展开
· 去除冗余的全局表达式及内存分配
-O3(file-level optimizations) :
· 去除未调用的函数
· 简化返回值无用的函数
·
相关文档:
1.1.1 格式化输入输出函数
Turbo C2.0 标准库提供了两个控制台格式化输入、 输出函数printf( ) 和
scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。
printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入
设备(键盘)上读数据。下面详细介绍这两个函数的用法。
一、pr ......
#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma 指令对每个编译器给出了一个方法,在保持与C 和C ++语言完全兼容的情况下,给出主机或操作系统专有的特征。
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
一、#pragma message
#pragma ......
我们已经了解如何定义线程入口点函数、调用系统API创建执行指定函数的线程。本节将揭示这一切在系统内部是如何完成的。
图6-1描述了线程创建并完成初始化后的状态。调用CreateThread会使系统产生一个线程内核对象,其引用计数(Usage count)被初始化为2(创建线程的进程和线程本身都引用了该内核对象),其它属性也完成了 ......
Visual Studio包含了4个本机C/C++运行时库和2个用来管理MS.NET的C/C++运行时库。所有这些库都支持多线程编程环境:目前已经没有专门为单线程开发设计的C/C++运行时库了。表6-1对这些库进行了描述:
Libray Name
Description
LibCMt.lib
Statically linked release version of the library.
Lib ......