在 什么是native compiler?什么是cross compiler? 一文中简单介绍了target的概念。就目前来讲,我们还不得不为每一个target单独编译一套SDK,暂时gcc还无法使用命令行来选择生成不同target的指令。
不过,在同样的target下,gcc提供了-march=
, -mcpu=
和-mtune=
三个选项,生成相对于该硬件平台来说较高效的代码。
-march=
用来指定目标体系结构,gcc通过该选项确定使用何种指令集,如对于ARM来说可以选择armv5te或者armv7-a等。
gcc -march=armv5te -O2 hello.c gcc -march=armv7-a -O2 hello.c
-mcpu=
用来指定目标处理器,相对于-march=
来说,它提供的信息更加具体,gcc
可以通过该选项判断使用何种指令集,它既可以代替-march=
也可以一起使用,对于ARM来说可以选择iwmmxt或者cortex-a8等等。
gcc -mcpu=iwmmxt -O2 hello.c gcc -mcpu=cortex-a8 -O2 hello.c
-mtune=
不是用来指定指令集的,而是提供给gcc
更多的信息,使其可以生成更加优化的代码,通常是用来选择流水线描述。由于即使是相同的指令集,仍然可能在微体系结构上有所不同,而流水线实现的不同,可能导致相互依赖的指令的执行时间有所不同。如果gcc
得到相应的描述信息,则可以通过指令调度等优化算法,生成更优的程序。它需要和-march=
或者-mcpu=
一起使用。
那么在什么情况下该使用这些选项呢?
如果我们无法限定程序的运行环境,那么应该尽量选择更加通用的指令集。比如Linux发布可能生成i386的指令集,这样虽然无法发挥某些用户机器的强大能力,但是能够让更多的用户直接使用。于是,某些爱折腾的同学就会选择自己编译,甚至选择那些在本地编译的发布。
如果我们明确知道生成的程序运行在哪里,那么就应该提供尽可能具体的信息。比如android手机,通常手机厂商编译android时有明确的目标平台,那么就可以通过这几个选项获得最佳的性能。