1.
概述与测试目标
目标:评估光算云i简介(台湾机房)实例的CPU浮点性能(尤其是FP32/FP64)。小分段:1) 明确测试维度:单线程峰值、多线程/全核、NUMA影响;2) 选用工具:OpenBLAS + HPL(LINPACK)为主,补充micro-bench与系统监控;3) 准备数据:记录CPU型号、频率、内存拓扑、虚拟化类型。
2.
准备环境(系统与依赖)
步骤详解:1) 登录并更新:sudo apt update && sudo apt -y upgrade;2) 安装编译工具与MPI:sudo apt -y install build-essential git wget gcc gfortran libopenmpi-dev openmpi-bin numactl;3) 检查CPU特性:lscpu && cat /proc/cpuinfo,记下Stepping、AVX/AVX2/AVX512标志;4) 禁止省电模式(测试期间):sudo cpupower frequency-set -g performance(若可用)。
3.
编译并安装OpenBLAS(优化BLAS实现)
操作步骤:1) 获取源码:git clone https://github.com/xianyi/OpenBLAS.git && cd OpenBLAS;2) 编译:make DYNAMIC_ARCH=1 NO_AFFINITY=1 USE_OPENMP=1 -j$(nproc);3) 安装:sudo make PREFIX=/opt/openblas install;4) 环境变量:export LD_LIBRARY_PATH=/opt/openblas/lib:$LD_LIBRARY_PATH,并测试:python3 -c "import numpy; numpy.show_config()"(若使用numpy做对比)。
4.
下载并配置HPL(LINPACK)
详细步骤:1) 获取HPL:wget http://www.netlib.org/benchmark/hpl/hpl-2.3.tar.gz && tar xzf hpl-2.3.tar.gz && cd hpl-2.3;2) 编辑Makefile(选择Linux_GCC或自建Makefile),指定FFLAGS、CC、LINKER、LIBS(链接OpenBLAS库 -L/opt/openblas/lib -lopenblas -lpthread -lm);3) 生成HPL.dat:在文件中设置Problem size N、NB、P、Q等。建议开始用较小的N(如N=10000)验证,随后通过经验法调优至接近内存限制的N(N ~ sqrt(0.8 * available_bytes / 8))。
5.
运行测试:单节点与多线程配置
操作细节:1) 导出线程环境:export OMP_NUM_THREADS=<核数或1>;2) 用numactl绑定:numactl --physcpubind=+0-7 --membind=0 mpirun -np 1 ./xhpl(单进程全线程),或mpirun -np
--bind-to core ./xhpl;3) 记录日志:./xhpl > hpl_run.log 2>&1;4) 多次运行取平均,变体:测试不同OPENBLAS_NUM_THREADS或OMP_NUM_THREADS组合、不同P×Q配置。
6.
微基准与系统级监控
小步骤:1) 使用OpenBLAS自带的测试(例:在examples目录运行sgemm测试)或用简单的C程序调用cblas_dgemm做单点测量;2) 使用perf/top/vmstat/iostat监控:sudo perf stat -e cpu-cycles,stalled-cycles-frontend,stalled-cycles-backend,fp_arith_inst_retired.scalar_double -p ;3) 记录温度与频率:watch -n1 "cat /proc/cpuinfo | grep \"MHz\"; sensors";4) 注意频率降频(turbo throttling)对结果影响。
7.
计算理论峰值与结果解读
步骤说明:1) 计算理论峰值:每核峰值 = 核心频率(GHz) × 每周期浮点运算数(如AVX2 256-bit 可做4个FP64或8个FP32乘加 = 8 FLOPs/cycle)→ 全核峰值 = per-core × 核数;2) 用HPL结果(GFLOPS)/理论峰值得到效率百分比;3) 分析瓶颈:若效率低,检查内存带宽(使用stream基准)、NUMA绑定、内存页大页配置(hugepages)、编译选项或是否使用了向量指令。
8.
优化建议与常见问题处理
建议清单:1) 编译时开启DYNAMIC_ARCH与最高优化等级,使用正确的MKL/OpenBLAS绑定;2) 设置hugepages:sudo sysctl -w vm.nr_hugepages=128 && 在HPL运行前madvise/hugemem配置;3) 调整网络或I/O影响(若是分布式);4) 若云提供商使用虚拟化,注意物理CPU争用,必要时联系厂商获取裸金属或CPU亲和保证。
9.
常见问答(1)
问:我如何快速估算一个光算云i实例的理论FP64峰值? 答:先运行lscpu或cat /proc/cpuinfo得到每核频率(GHz)和核心数,查CPU手册确认每周期FP64的FLOPs(例如AVX2以FMA计4个乘加 = 8 FLOPs/cycle),然后:峰值(GFLOPS) = 频率(GHz) × FLOPs_per_cycle × 核心数。
10.
常见问答(2)
问:HPL跑不满核或结果忽高忽低怎么办? 答:检查并固定CPU频率(performance governor),用numactl绑定线程与内存,设置OPENBLAS_NUM_THREADS与OMP_NUM_THREADS一致或按物理核心调整,启用hugepages并确认没有频率或温度降频。多次运行取平均减少抖动。
11.
常见问答(3)
问:测试时如何区分FP32与FP64性能? 答:HPL默认是双精度(FP64)。要测试FP32,需使用针对单精度的基准(如sgemm微基准或将HPL源码改为单精度实现),或者使用深度学习基准(例如gemmbench或BLAS sgemm测试)来评估FP32吞吐。
来源:从性能测试角度评估台湾服务器光算云i简介提供的浮点运算能力