|
既然是用gentoo测的就发gentoo版吧。
测试环境:
系统:gentoo amd64兼容32位库,所有包全部重新编译过,cpu类型指定为native,cpu是amd的5200+,内存大小2G频率是ddr800。
内核版本:2.6.31-gentoo-r6
GCC版本:4.3.4
问题:
编译内核的时候可以设定cpu的类型和gcc的优化级别,
关于gcc的优化级别,内核提供两个选项:-Os和-O2,
如果修改Makefile可以设定成-O1或者是-O3,
我的目的就是测测不同的优化选项有什么不同的效果,
这个测试没有使用任何的benchmark工具,只用了一个我自己写的计算程序,[color="Magenta"]所以可能没有太多的参考价值。
测试方法:
使用同样的.config来编译内核,所有需要的东西都直接进入内核,只有一个东西(关于scsi的,好像目前没有办法直接编译进内核)编译成了模块,
使用不同参数编译内核,然后运行一个我自己写的计算程序10次,对比平均运行时间,进而比较性能。
所有测试过程中没有运行X,都是在CLI下面有一个普通用户完成的内核编译,然后由root完成的内核安装以及grub设置,测试性能时由普通用户完成。
主要对比3个指标:编译时间、内核体积、性能。
编译时间由编译过程中time make得来,内核体积由du –h得来,内核性能对比使用一个计算程序的运行时间来衡量。
调整编译选项的方法:
编译内核时如果选择了optimize for size,那么就是-Os,否则就是-O2,如果修改Makefile中的下属内容可以选择其他优化级别:
222 HOSTCC = gcc
223 HOSTCXX = g++
224 HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
225 HOSTCXXFLAGS = -O2 521 ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
522 KBUILD_CFLAGS += -Os
523 else
524 KBUILD_CFLAGS += -O2
525 endif
总共三个地方要修改。
编译时间对比:
-Os:
real 7m39.520s
user 6m24.961s
sys 0m51.929s
-O1:
real 6m35.099s
user 5m46.842s
sys 0m52.854s
-O2:
real 7m40.229s
user 6m52.027s
sys 0m54.033s
-O3:
real 8m28.620s
user 7m39.438s
sys 0m55.361s
-O1时间最短,-O3时间最长,-Os和-O2差不太多。
内核体积对比:
-Os 2.6m
-O1 2.7m
-O2 2.9m
-O3 3.2m
-Os体积最小,然后是-O1、-O2、-O3。
性能对比:
测试1:
内核编译参数 | 测试程序10次的平均运行时间(越小越好)
-Os | 10.482s
-O1 | 10.809s
-O2 | 11.078s
-O3 | 10.838s
-O3貌似不怎么快啊,还是-Os比较快,可能和我的cpu有关,amd的cpu上的ccache比较小,这个时候使用-Os可能会有比较好的效果,但是也不要给所有的包用-Os,应为gentoo optimization guide上说这个选项并不适合多数包。
测试2:
刚刚用scimark测了一下,四个内核的结果对比如下:
-Os- ** **
- ** SciMark2 Numeric Benchmark, see [url]http://math.nist.gov/scimark[/url] **
- ** for details. (Results can be submitted to [email]pozo@nist.gov[/email]) **
- ** **
- Using 2.00 seconds min time per kenel.
- Composite Score: 195.92
- FFT Mflops: 156.86 (N=1024)
- SOR Mflops: 379.32 (100 x 100)
- MonteCarlo: Mflops: 64.22
- Sparse matmult Mflops: 167.18 (N=1000, nz=5000)
- LU Mflops: 212.01 (M=100, N=100)
复制代码
-O1- ** **
- ** SciMark2 Numeric Benchmark, see [url]http://math.nist.gov/scimark[/url] **
- ** for details. (Results can be submitted to [email]pozo@nist.gov[/email]) **
- ** **
- Using 2.00 seconds min time per kenel.
- Composite Score: 196.36
- FFT Mflops: 157.99 (N=1024)
- SOR Mflops: 379.32 (100 x 100)
- MonteCarlo: Mflops: 64.22
- Sparse matmult Mflops: 167.61 (N=1000, nz=5000)
- LU Mflops: 212.67 (M=100, N=100)
复制代码
-O2- ** **
- ** SciMark2 Numeric Benchmark, see [url]http://math.nist.gov/scimark[/url] **
- ** for details. (Results can be submitted to [email]pozo@nist.gov[/email]) **
- ** **
- Using 2.00 seconds min time per kenel.
- Composite Score: 195.98
- FFT Mflops: 156.86 (N=1024)
- SOR Mflops: 379.32 (100 x 100)
- MonteCarlo: Mflops: 63.61
- Sparse matmult Mflops: 166.76 (N=1000, nz=5000)
- LU Mflops: 213.33 (M=100, N=100)
复制代码
-O3- ** **
- ** SciMark2 Numeric Benchmark, see [url]http://math.nist.gov/scimark[/url] **
- ** for details. (Results can be submitted to [email]pozo@nist.gov[/email]) **
- ** **
- Using 2.00 seconds min time per kenel.
- Composite Score: 196.30
- FFT Mflops: 156.86 (N=1024)
- SOR Mflops: 380.82 (100 x 100)
- MonteCarlo: Mflops: 64.22
- Sparse matmult Mflops: 167.61 (N=1000, nz=5000)
- LU Mflops: 212.01 (M=100, N=100)
复制代码
没有太看懂数据是什么意思,但是貌似是没有太大的变化。 :yun:
参考文献:
1. http://www.gentoo.org/doc/en/gcc-optimization.xml
gentoo用户都知道,不用介绍了。
2. http://www.kroah.com/lkn/
这本书专门讲如何编译内核的,是免费的,可以直接下载打印,portage树里面也有这本书,直接安装和去下载一样,官网上提供的压缩包里面少Copyright那页,想打印的可以自己单独下载。
3. 编译内核时的帮助文档,编译内核时看不懂了就看帮助,不知道有哪些make的target就make help。
4. http://lamp.linux.gov.cn/Linux/kernel_options.html
金步国写的内核文档。
===
测完了,我还是老实点用-Os吧。 
同样的硬件条件下,
我用debian stable 5.0也跑过这个程序,大概需要12秒左右。
=== |
|