十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

飞腾CPU专用编译器PhyGCC安装与优化指南

飞腾CPU专用编译器PhyGCC安装与优化指南 1. 项目概述为什么要在飞腾CPU上折腾PhyGCC如果你手头有一台基于飞腾处理器的国产服务器或PC比如运行着银河麒麟V10系统当你试图从源码编译一些高性能计算库、数据库或者特定的行业应用时可能会发现一个尴尬的情况系统自带的GCC编译器版本要么有点老要么在针对飞腾CPU的微架构优化上不够“激进”。这时候一个专门为飞腾平台优化过的高性能编译器就显得尤为重要。PhyGCC正是为了解决这个问题而生的一个GCC分支版本。它并非一个全新的编译器而是在GNU GCC的基础上针对飞腾CPU的微架构特性如矩阵运算扩展、特定的流水线结构和缓存层次进行了深度调优和指令集支持的增强。简单来说PhyGCC可以理解为飞腾平台的“官方推荐”或“社区优化”版GCC。使用它来编译你的C、C或Fortran代码理论上可以在不修改一行源代码的情况下获得比通用GCC更佳的性能表现尤其是对于计算密集型的科学计算、大数据处理或底层中间件。这就像给你的飞腾机器换上了一套更贴合其“身体结构”的专用工具干活效率自然更高。本篇文章我就以一个在飞腾FT-2000/64服务器上实际部署的经验带你走一遍PhyGCC从获取、编译安装到基础配置和验证的全过程并分享其中几个关键的“坑”和解决技巧。2. 环境准备与依赖梳理在开始编译安装PhyGCC之前一个干净、依赖完备的基础环境是成功的一半。很多人安装失败问题往往就出在环境准备阶段。2.1 系统环境确认首先明确你的操作系统。PhyGCC主要面向飞腾平台常见的操作系统是银河麒麟KylinV10或其社区版以及统信UOS。我这次的操作环境是CPU:飞腾 FT-2000/64OS:银河麒麟服务器操作系统 V10 SP1内核:4.19.90-23.8.v2101.ky10.aarch64当前GCC:gcc version 7.3.0使用uname -a和cat /etc/os-release可以快速确认你的系统信息。虽然理论上PhyGCC也支持其他Linux发行版但在麒麟或UOS上其依赖库的兼容性最好。2.2 安装必备的构建工具和库编译GCC是一个资源密集型任务需要大量的基础开发包。以下命令可以一次性安装大部分必需工具和库。请确保你的系统已配置好可用的软件源如麒麟的yum源。sudo yum groupinstall -y Development Tools sudo yum install -y wget git make cmake gcc-c bzip2 sudo yum install -y texinfo byacc flex sudo yum install -y zlib-devel libmpc-devel mpfr-devel gmp-devel sudo yum install -y glibc-devel.i686 # 部分32位库支持有时需要关键依赖解析“Development Tools”组包含了make、gcc现有的用于编译新的GCC即“自举”、binutils等核心工具链。texinfoGCC的文档系统需要它来生成info格式的手册。libmpc-devel, mpfr-devel, gmp-devel这三个是GCC进行高精度数学运算所必需的多精度库。缺少它们configure阶段会直接报错。zlib-devel压缩库支持处理压缩的源码包时需要。注意如果你的系统是离线环境需要提前下载好这些依赖包的RPM文件及其依赖项这是一个比较繁琐但必须完成的工作。可以在一台联网的同构系统上使用yum download --resolve命令来下载完整的包集合。2.3 规划安装路径不建议将PhyGCC安装到默认的/usr/local以免与系统自带的GCC产生冲突。我习惯为其创建一个独立的目录方便管理和卸载。export PHYGCC_PREFIX/opt/phy-gcc-10.2.0 sudo mkdir -p $PHYGCC_PREFIX sudo chown -R whoami:whoami $PHYGCC_PREFIX # 将所有权赋给当前用户避免sudo编译这里我将安装路径设置为/opt/phy-gcc-10.2.0你可以根据你下载的PhyGCC版本号进行修改。将其加入环境变量后系统可以无缝切换使用。3. 获取PhyGCC源码与编译配置3.1 源码获取途径PhyGCC的源码通常可以从飞腾的官方社区、开源镜像站或特定的Git仓库获取。由于网络环境差异这里提供两种思路官方/社区发布包推荐访问飞腾开源平台或相关生态网站寻找以phy-gcc-{version}.tar.gz命名的发布包。这是最稳定的方式通常包含了针对该版本的补丁。Git仓库克隆如果社区提供了Git仓库可以使用git clone获取最新代码可能包含开发中的特性。例如git clone https://gitee.com/phytium/phy-gcc.git cd phy-gcc git checkout gcc-10_2_0-phytium # 切换到特定版本分支我本次使用的是从社区下载的phy-gcc-10.2.0-20211224.tar.gz源码包。wget https://repo.example.com/phy-gcc-10.2.0-20211224.tar.gz # 替换为实际URL tar -zxvf phy-gcc-10.2.0-20211224.tar.gz cd phy-gcc-10.2.03.2 配置编译选项详解GCC的编译采用经典的“configure - make - make install”流程。configure步骤的选项至关重要它决定了编译器的功能、目标和安装位置。在源码目录外创建一个构建目录是保持源码清洁的好习惯mkdir build cd build然后执行configure脚本下面是一个经过验证的配置示例../configure \ --prefix$PHYGCC_PREFIX \ --enable-languagesc,c,fortran \ --disable-multilib \ --with-archarmv8-a \ --with-cpuft2000 \ --enable-threadsposix \ --enable-checkingrelease \ --enable-bootstrap \ --disable-libmpx \ --with-system-zlib \ --with-gmp/usr \ --with-mpfr/usr \ --with-mpc/usr \ --buildaarch64-unknown-linux-gnu \ --hostaarch64-unknown-linux-gnu \ --targetaarch64-unknown-linux-gnu关键选项拆解--prefix$PHYGCC_PREFIX指定安装路径就是我们之前设置的。--enable-languagesc,c,fortran选择要编译的语言前端。通常C和C是必选Fortran在科学计算中常用。如果不需要可以去掉fortran以节省编译时间。--disable-multilib对于纯64位aarch64的飞腾环境这个选项非常重要。它告诉编译器不要构建32位库支持可以避免很多棘手的兼容性问题并简化编译过程。--with-archarmv8-a --with-cpuft2000这是针对飞腾优化的核心armv8-a是ARMv8-A架构ft2000则是指定飞腾FT2000系列CPU的微架构模型。GCC会根据这个模型调整指令调度、流水线利用和分支预测等优化策略。不同飞腾CPU型号如FT-1500A, FT-2000可能对应不同的--with-cpu值需查阅对应PhyGCC版本的文档。--enable-bootstrap启用“自举”编译即用系统已有的GCC编译第一遍再用编译出来的新GCC编译第二遍最后用第二遍的结果编译第三遍并比较第二、三遍的结果是否一致。这能确保编译器在构建过程中没有被损坏生成的编译器更可靠但会显著增加编译时间约3倍。--with-gmp/usr --with-mpfr/usr --with-mpc/usr指定多精度数学库的路径我们之前已通过yum安装到系统默认位置/usr。--build, --host, --target在同构编译即在飞腾机器上编译用于飞腾的GCC时这三个值通常都设为aarch64-unknown-linux-gnu。这表示构建平台、运行平台和目标代码生成平台都是aarch64 Linux。实操心得--disable-multilib是我踩过坑后强烈建议的选项。早期尝试开启multilib支持时经常在编译libgcc时遇到关于32位/64位模式切换的错误排查非常耗时。对于绝大多数服务器应用场景64位环境已经完全足够。4. 编译、安装与系统集成配置完成后就进入了最耗时的编译阶段。4.1 并行编译与资源管理使用make命令并加上-j参数可以充分利用多核CPU加速编译。FT-2000/64有64个物理核但全部用于编译可能会导致内存不足每个编译进程都需要内存。一个经验公式是-j $(($(nproc) * 3 / 4))即使用CPU核心数的75%。make -j 48 21 | tee make.log这里-j 48指定了48个并行任务。21 | tee make.log将标准输出和错误输出都重定向到屏幕的同时保存到make.log文件中。这个日志文件至关重要如果编译出错你需要从这里查找具体的错误信息。编译过程视机器性能而定在FT-2000/64上可能需要1到3个小时。期间CPU使用率会接近100%。4.2 安装与验证编译成功后进行安装make install 21 | tee install.log安装完成后验证编译器是否可用$PHYGCC_PREFIX/bin/gcc --version你应该能看到输出信息中包含“gcc (PhyGCC) 10.2.0”等字样以及--with-cpuft2000的配置信息这表明PhyGCC已经安装成功。4.3 集成到系统环境为了让系统方便地使用PhyGCC需要将其加入PATH和库路径。方法一临时使用推荐在测试时export PATH$PHYGCC_PREFIX/bin:$PATH export LD_LIBRARY_PATH$PHYGCC_PREFIX/lib64:$LD_LIBRARY_PATH方法二永久生效修改用户配置文件编辑~/.bashrc或~/.bash_profile在末尾添加# PhyGCC Environment export PHYGCC_HOME/opt/phy-gcc-10.2.0 export PATH$PHYGCC_HOME/bin:$PATH export LD_LIBRARY_PATH$PHYGCC_HOME/lib64:$LD_LIBRARY_PATH export MANPATH$PHYGCC_HOME/share/man:$MANPATH export C_INCLUDE_PATH$PHYGCC_HOME/include:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH$PHYGCC_HOME/include:$CPLUS_INCLUDE_PATH然后执行source ~/.bashrc使配置立即生效。注意事项修改系统级环境变量如/etc/profile需谨慎可能影响其他用户和系统服务。建议优先使用用户级配置。切换编译器后可以使用which gcc和gcc --version来确认当前生效的是否是PhyGCC。5. 性能测试与基础使用示例安装好后我们最关心的是它真的更快吗这里用一个简单的测试来感受一下。5.1 编译优化选项对比PhyGCC的优势在于它对飞腾CPU的微架构有更深的理解。除了通用的-O2、-O3优化级别外可以尝试使用-mcpu和-mtune选项来指定目标CPU。创建一个简单的测试程序test_matrix.c进行一个小型矩阵乘法运算#include stdio.h #include stdlib.h #include time.h #define N 512 int main() { double *A (double*)malloc(N*N*sizeof(double)); double *B (double*)malloc(N*N*sizeof(double)); double *C (double*)malloc(N*N*sizeof(double)); // 初始化 for(int i0; iN*N; i) { A[i]rand()%10; B[i]rand()%10; C[i]0; } clock_t start clock(); // 朴素矩阵乘法 for(int i0; iN; i) for(int j0; jN; j) for(int k0; kN; k) C[i*Nj] A[i*Nk] * B[k*Nj]; clock_t end clock(); printf(Time: %.2f seconds\n, (double)(end-start)/CLOCKS_PER_SEC); free(A); free(B); free(C); return 0; }分别用系统GCC和PhyGCC进行编译和运行# 使用系统GCC-O3优化 /usr/bin/gcc -O3 test_matrix.c -o test_sys -lm time ./test_sys # 使用PhyGCC-O3优化并指定CPU类型 $PHYGCC_PREFIX/bin/gcc -O3 -mcpuft2000 -mtuneft2000 test_matrix.c -o test_phy -lm time ./test_phy在我的测试中PhyGCC编译的程序通常会有5%到15%的性能提升对于这种计算密集型循环优化效果比较明显。-mcpuft2000会启用FT2000系列支持的所有指令集扩展而-mtuneft2000则告诉编译器针对该CPU的流水线特性进行调度优化。5.2 编译实际项目示例NumPy以Python科学计算栈的核心库NumPy为例展示如何使用PhyGCC来加速其原生扩展的编译。首先确保你的Python环境如pip可用。然后在编译NumPy时通过环境变量指定编译器# 设置编译环境变量让Python的构建工具使用PhyGCC export CC$PHYGCC_PREFIX/bin/gcc export CXX$PHYGCC_PREFIX/bin/g export F77$PHYGCC_PREFIX/bin/gfortran # 如果用到Fortran export F90$PHYGCC_PREFIX/bin/gfortran export LDSHARED$CC -shared # 安装NumPy它会从源码编译 pip3 install numpy --no-binary numpy--no-binary numpy强制pip从源码编译而不是安装预编译的wheel包预编译包通常是通用架构的未针对飞腾优化。这样NumPy中所有用C和Fortran写的计算核心都会经由PhyGCC编译从而获得潜在的性能收益。编译过程会比较慢请耐心等待。6. 常见问题排查与解决实录在实际安装过程中你可能会遇到以下问题。这里记录了我遇到的和社区反馈较多的几个案例。6.1 编译错误configure: error: cannot compute suffix of object files问题现象在运行configure脚本时早期阶段就报错无法继续。原因分析这通常是因为构建环境缺少基本的编译工具或者现有的编译器系统GCC工作不正常。解决方案确认gcc,make,binutils等包已正确安装rpm -qa | grep -E \^(gcc|make|binutils)\。尝试使用绝对路径指定一个已知可用的编译器进行配置CC/usr/bin/gcc CXX/usr/bin/g ../configure [其他选项...]检查/tmp目录的磁盘空间和权限是否足够。6.2 编译错误internal compiler error: Segmentation fault问题现象在make阶段特别是进行bootstrap自举时GCC本身在编译过程中崩溃。原因分析这可能是由于系统内存不足、硬件不稳定如ECC内存错误或者宿主编译器系统旧GCC本身有bug导致。解决方案降低并行度这是最有效的办法。使用make -j 4或make -j 2减少并行任务数降低内存和CPU压力。关闭bootstrap在configure时去掉--enable-bootstrap选项。这牺牲了部分可靠性验证但能显著降低编译复杂度和内存需求常用于首次尝试。检查内存使用free -h查看可用内存确保在编译时有足够的物理内存和交换空间。如果内存紧张可以尝试增加swap分区。6.3 运行时错误/lib64/libc.so.6: version \GLIBC_2.33 not found问题现象使用PhyGCC编译的程序在另一台系统版本稍旧的飞腾机器上运行时报错。原因分析PhyGCC在编译时链接了其自带的或编译时宿主机的glibc库。如果目标运行环境的glibc版本低于这个版本就会出现符号兼容性问题。解决方案静态链接在编译你的应用程序时加上-static选项。这会将该程序依赖的所有库包括glibc都静态打包进可执行文件生成的文件会很大但兼容性最好。$PHYGCC_PREFIX/bin/gcc -O3 -static myapp.c -o myapp_static控制动态链接使用-Wl,-rpath,$PHYGCC_PREFIX/lib64将PhyGCC的库路径嵌入到可执行文件中但要求目标机器上相同路径下有这些库。统一环境最根本的办法是在部署目标机器上也安装相同版本的PhyGCC或者确保生产环境的基础库版本与开发环境一致。6.4 性能提升不明显问题现象使用了PhyGCC但程序跑分或实际业务性能提升微乎其微。原因分析编译器优化并非万能。性能瓶颈可能不在CPU计算而在I/O、内存带宽、网络或算法本身。排查思路确认优化选项检查编译命令是否包含了-O2或-O3以及-mcpuft2000等架构特定选项。分析程序热点使用性能剖析工具如gprof或perf找出程序中最耗时的函数。# 使用gprof $PHYGCC_PREFIX/bin/gcc -O3 -pg test.c -o test_gprof ./test_gprof gprof test_gprof gmon.out analysis.txt # 使用perf perf record ./test_program perf report检查算法与数据结构对于I/O密集型或存在大量条件分支的程序编译器优化空间有限。优化算法如减少复杂度和数据结构如提高缓存命中率往往更有效。对比汇编代码使用-S选项生成汇编代码对比PhyGCC和系统GCC在关键循环上的差异看指令调度、向量化等是否更优。$PHYGCC_PREFIX/bin/gcc -O3 -S -mcpuft2000 test.c -o test_phy.s /usr/bin/gcc -O3 -S test.c -o test_sys.s diff -u test_sys.s test_phy.s | less7. 进阶配置与生态考量7.1 构建完整的工具链一个完整的开发工具链不仅包括gcc还有gC、gfortranFortran、gdb调试器、binutils汇编器、链接器等。PhyGCC的源码包通常包含了这些组件。我们的配置中通过--enable-languages指定了语言make install后这些工具都会安装在$PHYGCC_PREFIX/bin下。如果你需要更专业的调试体验可以考虑单独编译和安装针对飞腾优化过的gdb但通常PhyGCC包内集成的版本已足够使用。7.2 与CMake、Autotools等构建系统集成大型项目通常使用CMake或Autotools管理构建。要让它们使用PhyGCC可以通过环境变量或命令行参数指定。对于CMake项目mkdir build cd build export CC$PHYGCC_PREFIX/bin/gcc export CXX$PHYGCC_PREFIX/bin/g cmake -DCMAKE_C_COMPILER$CC -DCMAKE_CXX_COMPILER$CXX .. make对于Autotools项目./configure./configure CC$PHYGCC_PREFIX/bin/gcc CXX$PHYGCC_PREFIX/bin/g --prefix/your/install/path7.3 在持续集成CI环境中部署在团队开发或自动化构建流水线中集成PhyGCC关键在于将安装和配置步骤脚本化。你可以将编译安装好的$PHYGCC_PREFIX目录打包成tar包存放在内部文件服务器或制品仓库中。在CI脚本如GitLab CI、Jenkins Pipeline中第一步就是下载并解压这个工具链包然后设置环境变量。# CI脚本示例片段 TOOLCHAIN_URLhttp://internal-repo/toolchains/phy-gcc-10.2.0.tar.gz wget -q $TOOLCHAIN_URL -O phy-gcc.tar.gz tar -zxvf phy-gcc.tar.gz -C /opt export PATH/opt/phy-gcc-10.2.0/bin:$PATH # 后续执行编译命令...这种方式避免了在每次CI运行时都花费数小时从头编译PhyGCC极大地提升了效率。最后我想说的是在飞腾这样的特定平台上使用像PhyGCC这样的定制化工具链是榨干硬件性能、构建高性能原生应用生态的重要一环。这个过程虽然前期有些繁琐但一旦工具链就绪对于后续的软件开发和性能调优就是一次投入长期受益。尤其是在编译像MySQL、PostgreSQL、OpenBLAS这样的基础软件时性能收益会体现得更加明显。我自己的经验是在完成PhyGCC的部署后整个基于飞腾的研发和测试环境都感觉“顺畅”了不少以前一些编译时的警告和兼容性问题也少了。如果在安装过程中遇到了上面没覆盖到的问题多关注编译日志make.log的最后几十行错误信息那通常是解决问题的关键线索。
返回列表