• Linux系统中使用GCC CPU参数优化代码编译


    Linux系统中使用GCC CPU参数优化代码编译

    使用特定的GCC参数可以使编译出的程序执行效率有较大提升。具体如下:

    1、优化原理:
    在编译程序时,借助参数传递的方法,使用与系统CPU相匹配的gcc参数,编译出的程序就是为系统CPU而进行特定优化过的,因而执行速度和效率都会是最好。

    2、注意事项
    (1) 经过大量测试发现,在RedHat, CentOS系统中通常只能通过参数传递的方法进行编译优化,当然,如果愿意并且能够修改程序的MakeFile也可以达到这一效果,只不过比较复杂,工 作量较大。其他在网上广为流传的方法(例如:直接通过.bashrc, /etc/profile声明参数系统变量、写入/etc/make.conf等)经过测试均没有效果。

    (2) 对于Gentoo Linux或FreeBSD可以通过修改/etc/make.conf添加参数的方法来实现,而不必使用参数传递法。

    3、优化步骤:
    (1)确定系统CPU类型:
    # cat /proc/cpuinfo | grep "model name"
    执行后会看到系统中CPU的具体型号,记下CPU型号。

    (2)使用参数传递方法进行编译:(以Pentium4 CPU为例)
    此处以编译Apache为例说明如何使用参数传递:
    # tar xzvf httpd-2.0.55.tar.gz
    # cd httpd-2.0.55
    CHOST="i686-pc-linux-gnu" \
    CFLAGS="-O3 \
    -msse2 \
    -mmmx \
    -mfpmath=sse \
    -mcpu=pentium4 \
    -march=pentium4 \
    -pipe \
    -fomit-frame-pointer" \
    CXXFLAGS="-O3 \
    -msse2 \
    -mmmx \
    -mfpmath=sse \
    -funroll-loops \
    -mcpu=pentium4 \
    -march=pentium4 \
    -pipe \
    -fomit-frame-pointer" \
    ./configure ......
    # make
    # make install

    这样就通过函数传递方法实现了编译优化。下面对其中的一些参数进行具体说明:

    -O3:相对于-O、-O1、-O2,-O3开启了所有GCC支持的优化特性;
    -msse2:开启CPU所支持的sse2指令集;
    -mmmx:参考-msse2
    -mfpmath=sse:为指定指令集生成浮点运算特性(优化浮点运算功能);
    -mcpu:指定CPU型号;
    -march:指定CPU型号,基本同-mcpu,GCC根据-march设定的CPU型号决定在生成代码时可以使用哪些种类的指令。(注意!-march参数在某些CPU型号中不可用!)
    -pipe:使用管道(pipe)方法替代临时文件方法在编译的不同阶段之间进行通讯。

    附:常见CPU优化参数
    386:
    CHOST="i386-pc-linux-gnu"
    CFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer"
    486:
    CHOST="i486-pc-linux-gnu"
    CFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"
    Pentium (Intel):
    CHOST="i586-pc-linux-gnu"
    CFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"
    Pentium MMX (Intel):
    CHOST="i586-pc-linux-gnu"
    CFLAGS="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer"
    Pentium PRO (Intel):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentiumpro -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentiumpro -O3 -pipe -fomit-frame-pointer"
    Pentium II (Intel):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
    Celeron (Intel):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
    Pentium III (Intel):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"
    Celeron2 (Intel):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"
    Celeron (Willamette-Intel):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
    Pentium 4 (Intel):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
    K6 (AMD):
    CHOST="i586-pc-linux-gnu"
    CFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"
    K6-2 (AMD):
    CHOST="i586-pc-linux-gnu"
    CFLAGS="-march=k6-2 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=k6-2 -O3 -pipe -fomit-frame-pointer"
    K6-3 (AMD):
    CHOST="i586-pc-linux-gnu"
    CFLAGS="-march=k6-3 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=k6-3 -O3 -pipe -fomit-frame-pointer"
    Athlon (AMD):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer"
    Athlon-tbird, aka K7 (AMD):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=athlon-tbird -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon-tbird -O3 -pipe -fomit-frame-pointer"
    Athlon-tbird XP (AMD):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
    Athlon 4(AMD):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=athlon-4 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon-4 -O3 -pipe -fomit-frame-pointer"
    Athlon XP (AMD):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
    Athlon MP (AMD):
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=athlon-mp -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon-mp -O3 -pipe -fomit-frame-pointer"
    603 (PowerPC):
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
    CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
    603e (PowerPC):
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
    CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
    604 (PowerPC):
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
    CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
    604e (PowerPC):
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
    CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
    750 aka as G3 (PowerPC):
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-mcpu=750 -O3 -pipe -fomit-frame-pointer -fsigned-char"
    CXXFLAGS="-mcpu=750 -O3 -pipe -fomit-frame-pointer -fsigned-char"
    7400, aka G4 (PowerPC):
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-mcpu=7400 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec"
    CXXFLAGS="-mcpu=7400 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec"
    7450, aka G4 second generation (PowerPC):
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-mcpu=7450 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec"
    CXXFLAGS="-mcpu=7450 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec"
    PowerPC (If you don't know which one):
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
    CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
    Sparc:
    CHOST="sparc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-O3 -pipe -fomit-frame-pointer"
    Sparc 64:
    CHOST="sparc64-unknown-linux-gnu"
    CFLAGS="-O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-O3 -pipe -fomit-frame-pointer"
  • 相关阅读:
    Navicat Premium 12 破解汉化64位 windows版本
    Tkinter入门简明教程
    python tkinter-消息框、对话框、文件对话框
    python中ui自动化selenium方法封装分享
    Windows利用EasyWebSvr起web服务
    Windows安装mysql服务端
    北京个人所得税纳税记录打印
    Java并发之ReentrantReadWriteLock源码解析(二)
    Java并发之ReentrantReadWriteLock源码解析(一)
    Java并发之Semaphore源码解析(二)
  • 原文地址:https://www.cnblogs.com/aquester/p/9891911.html
Copyright © 2020-2023  润新知