嵌入式开发者社区

标题: 关于编译器优化的问题 [打印本页]

作者: 15901123858    时间: 2018-6-27 21:34
标题: 关于编译器优化的问题
最近在做基于OMAPL138的一个图像处理的项目,在ARM端和DSP端都运行一些数据,参考的是创龙基于共享内存的例程ex04_sharedregion(在LINUX完成工程的编译工作)。由于想加快数据处理速度,想使用编译器优化的方法。在ARM的makefile文件中将优化选项由O2改为O3,ARM的运行速度提升了50%,很欣慰;但是把DSP的makefile文件中优化选项由O2改为O3,DSP的运行速度完全没有变化,再由O2改为O0,DSP的运行速度立刻降低为原来的50%左右。。。。难道对于DSP来说O2就是最高的优化了吗?(DSP中会反复调用5个数求中值的函数)

作者: 15901123858    时间: 2018-6-27 21:38
#  ======== toolchain macros ========
CGTOOLS = $(CGT_C674_ELF_INSTALL_DIR)

CC = $(CGTOOLS)/bin/cl6x -c
AR = $(CGTOOLS)/bin/ar6x rq
LD = $(CGTOOLS)/bin/lnk6x --abi=eabi
ST = $(CGTOOLS)/bin/strip6x

CPPFLAGS =
CFLAGS = -qq $(CCPROFILE_$(PROFILE)) -I. $(COMPILER_OPTS)

LDFLAGS = -w -q -c -m $(@D)/obj/$(@F).map
LDLIBS = -l $(CGTOOLS)/lib/rts6740_elf.lib

CCPROFILE_debug = -D_DEBUG_=1 --symdebug:dwarf
CCPROFILE_release = -O2
COMPILER_OPTS = $(shell cat configuro/compiler.opt)

附上我DSP的makefile文件编译优化的代码段
作者: 小晓筱伟    时间: 2018-6-28 21:01
这是CCS编译器优化选项的功能:

1.       –O0

         简化控制流图

         分配变量到寄存器

         进行循环旋转(loop rotation)

         删除未使用的代码

         简化表达式和语句

         内联声明为inline的函数

2.       –O2

         执行局部复制/常量传递

         删除未使用的赋值语句

         删除局部共有表达式

3.       –O2

         进行软件流水

         进行循环优化

         删除全局共有子表达式

         删除全局未使用的赋值语句

         把循环中的对数组的引用转化为递增的指针形式

         把循环展开

4.       –O3

         删除未使用的所有的函数

         当函数的返回值没用到时,简化函数的返回形式

         内联小的函数

         重新对函数的声明进行排序。这样当优化调用代码时,被调用函数的属性是已知的

         当所有调用都传递一个相同的参数时,把这个参数直接放到函数体中去,不在通过寄存器/存储器的方式传递这

个参数。

         识别文件级别变量的特征

希望对您有帮助。


作者: 15901123858    时间: 2018-6-29 21:42
小晓筱伟 发表于 2018-6-28 21:01
这是CCS编译器优化选项的功能:

1.       –O0

好的,谢谢,可能是我的函数并不适合O3的优化。。。





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4