龙芯 3A4000 的基础指令集是 MIPS,因此使用 GCC 在龙芯上编译应用程序时,默认状态下只会使用 MIPS 的指令集,而忽略龙芯的所有扩展指令。那么,编译在龙芯上运行的应用程序时,指定一些针对龙芯优化的编译参数,就应该可以带来性能上的提升。
为了了解这些针对龙芯的优化参数对应用程序的性能表现能达到什么程度,我使用不同的编译参数编译了 p7zip,然后使用 ./7za b 得到 Benchmark 成绩进行性能对照。我在每次修改编译参数之后,连续进行3次测试,把得到的成绩按从高到低排序,列入表格。
操作系统:UOS V20 专业版(1022)
编译器:gcc version 8.3.0 (Uos 8.3.0.3-3+rebuild)
CPU:loongson 3A4000 @ 1.8Ghz
内存:紫光 DDR4 2666 (实际运行于 2400) 8G * 2
p7zip:16.02
测试过程:
从 7-zip.org 下载 16.02 源码,解压后修改 makefile.machine 文件中的 OPTFLAGS=后面的编译参数,然后在文件夹中打开终端,执行下列命令:
make
cd bin
./bin/7za b
得到测试成绩后,先 make clean
之后再去修改 makefile.machine 文件中的编译参数,重复上述过程。
编译参数 | 说明 | 三次测试成绩排序 |
-O -s | 不指定任何优化选项 | 6599,6601,6629 |
-O2 | O2级优化,未使用针对龙芯优化的编译选项。从测试成绩来看,UOS软件源中的 7z 应该就是这个编译参数。 | 6939,6958,7003 |
-O2 -march=mips64r2 | O2级优化,并指定优化架构为 mips64r2,成绩与只使用 O2 时几乎一致。 | 6954,6975,7022 |
–O3 | O3级优化,未使用针对龙芯优化的编译选项。 | 7041,7065,7131 |
–O3 -march=mips64r5 | O3级优化,并指定优化架构为 mips64r5,成绩与只使用 O3 时几乎一致。 | 7029,7073,7131 |
-O2 -march=loongson3A | O2级优化,并指定优化对象为龙芯loongson3A(3A1000),测试得分高于不指定 march 的 O3。 | 7169,7196,7265 |
–O3 -march=loongson3A | O3级优化,并指定优化对象为龙芯loongson3A(3A1000),测试得分进一步提高。 | 7198,7249,7276 |
-O2 -march=gs464e | O2级优化,并指定优化对象为龙芯gs464e(3A3000),测试得分略高于同为O2优化march=loongson3A时的成绩。 | 7172,7216,7223 |
–O3 -march=gs464e | O3级优化,并指定优化对象为龙芯gs464e(3A3000),测试得分几乎没变。 | 7178,7204,7225 |
–O3 -march=gs464e-mmsa | 在前一参数基础上,加上MIPS向量指令的支持。测试成绩提高比较明显。 | 7338,7354,7379 |
–O3 -march=loongson3A -mmsa -mloongson-ext -mloongson-ext2 | 使用march=loongson3A,并继续添加龙芯的扩展指令支持参数,之所以不添加 -mloongson-ext3,是因为 ext3 会产生与 loongson3A 不相容的操作码。 | 7326,7364,7394 |
–O3 -march=gs464e -mmsa -mloongson-ext -mloongson-ext2 | 把 march=loongson3A更改为gs464e。由于 -mloongson-ext3产生的操作码与 gs464e 也不相容,这个参数无法使用。当march=gs464e 时,测试成绩明显优于 loongson3A。 | 7371,7441,7483 |
–O3 -march=gs464e -mmsa -mloongson-ext -mloongson-ext2-mloongson-mmi -mimadd -mmad -mmadd4 | 继续添加其它参数,测试成绩没有明显变化。看来这基本上是终成绩了。后面加的这些参数,可能基本上没什么用。 | 7461,7478,7487 |