测试套件指南¶
快速入门¶
运行测试需要 lit 测试运行器。您可以使用 LLVM 构建中的一个
% <path to llvm build>/bin/llvm-lit --version lit 0.8.0dev
另一种方法是在 Python 虚拟环境中将其安装为 Python 包
% python3 -m venv .venv % . .venv/bin/activate % pip install git+https://github.com/llvm/llvm-project.git#subdirectory=llvm/utils/lit % lit --version lit 0.8.0dev
使用以下命令检出
test-suite
模块% git clone https://github.com/llvm/llvm-test-suite.git test-suite
创建一个构建目录并使用 CMake 配置套件。使用
CMAKE_C_COMPILER
选项指定要测试的编译器。使用缓存文件选择典型的构建配置% mkdir test-suite-build % cd test-suite-build % cmake -DCMAKE_C_COMPILER=<path to llvm build>/bin/clang \ -C../test-suite/cmake/caches/O3.cmake \ ../test-suite
**注意!**如果您使用的是您构建的 clang,并且想要构建和运行 MicroBenchmarks/XRay 微基准测试,则需要将 compiler-rt
添加到您的 LLVM_ENABLE_RUNTIMES
cmake 标志中。
构建基准测试
% make Scanning dependencies of target timeit-target [ 0%] Building C object tools/CMakeFiles/timeit-target.dir/timeit.c.o [ 0%] Linking C executable timeit-target ...
使用 lit 运行测试
% llvm-lit -v -j 1 -o results.json . -- Testing: 474 tests, 1 threads -- PASS: test-suite :: MultiSource/Applications/ALAC/decode/alacconvert-decode.test (1 of 474) ********** TEST 'test-suite :: MultiSource/Applications/ALAC/decode/alacconvert-decode.test' RESULTS ********** compile_time: 0.2192 exec_time: 0.0462 hash: "59620e187c6ac38b36382685ccd2b63b" size: 83348 ********** PASS: test-suite :: MultiSource/Applications/ALAC/encode/alacconvert-encode.test (2 of 474) ...
**注意!**即使在您只想获取编译时结果(代码大小、LLVM 统计信息等)的情况下,也需要使用上述 llvm-lit
命令运行测试。在这种情况下,results.json 文件将包含编译时指标。
显示和比较结果文件(可选)
# Make sure pandas and scipy are installed. Prepend `sudo` if necessary. % pip install pandas scipy # Show a single result file: % test-suite/utils/compare.py results.json # Compare two result files: % test-suite/utils/compare.py results_a.json results_b.json
结构¶
测试套件包含基准测试和测试程序。程序附带参考输出,以便可以检查其正确性。该套件附带用于收集指标的工具,例如基准测试运行时间、编译时间和代码大小。
测试套件分为几个目录
SingleSource/
包含大小仅为单个源文件的测试程序。子目录可能包含多个程序。
MultiSource/
包含包含多个源文件的整个程序的子目录。大型基准测试和整个应用程序都放在这里。
MicroBenchmarks/
使用 google-benchmark 库的程序。程序定义了运行多次的函数,直到测量结果在统计上显着。
External/
包含无法直接与测试套件一起分发的代码的描述和测试数据。该目录中最突出的成员是 SPEC CPU 基准测试套件。请参阅 外部套件。
Bitcode/
这些测试主要用 LLVM 位码编写。
CTMark/
包含指向其他基准测试的符号链接,这些基准测试形成了编译性能测量的代表性样本。
基准测试¶
每个程序都可以作为正确性测试。有些程序不适合性能测量。将 TEST_SUITE_BENCHMARKING_ONLY
CMake 选项设置为 ON
将禁用它们。
MultiSource 基准测试包含以下应用程序和基准测试
MultiSource |
语言 |
应用领域 |
备注 |
---|---|---|---|
7zip |
C/C++ |
压缩/解压缩 |
|
ASCI_Purple |
C |
SMG2000 基准测试和求解器 |
内存密集型应用程序 |
ASC_Sequoia |
C |
仿真和求解器 |
|
BitBench |
C |
uudecode/uuencode 实用程序 |
用于函数式编译器的比特流基准测试 |
Bullet |
C++ |
Bullet 2.75 物理引擎 |
|
DOE-ProxyApps-C++ |
C++ |
HPC/科学应用程序 |
小型应用程序,代表我们更大的 DOE 工作负载 |
DOE-ProxyApps-C |
C |
HPC/科学应用程序 |
“ |
Fhourstones |
C |
游戏/求解器 |
有效解决井字游戏棋局的整数基准测试 |
Fhourstones-3.1 |
C |
游戏/求解器 |
“ |
FreeBench |
C |
基准测试套件 |
光线追踪器、四连棋、神经网络、文件压缩器、快速傅里叶/余弦/正弦变换 |
llubenchmark |
C |
链接列表微基准测试 |
|
mafft |
C |
生物信息学 |
多序列比对程序 |
MallocBench |
C |
基准测试套件 |
cfrac、espresso、gawk、gs、make、p2c、perl |
McCat |
C |
基准测试套件 |
快速排序、冒泡排序、特征值 |
mediabench |
C |
基准测试套件 |
adpcm、g721、gsm、jpeg、mpeg2 |
MiBench |
C |
嵌入式基准测试套件 |
汽车、消费电子、办公、安全、电信应用程序 |
nbench |
C |
BYTE 杂志的 BYTEmark 基准测试程序 |
|
NPB-serial |
C |
并行计算 |
NPB IS 代码的串行版本 |
Olden |
C |
数据结构 |
SGI 版本的 Olden 基准测试 |
OptimizerEval |
C |
求解器 |
Preston Brigg 的优化器评估框架 |
PAQ8p |
C++ |
数据压缩 |
|
Prolangs-C++ |
C++ |
基准测试套件 |
city、employ、life、NP、ocean、primes、simul、vcirc |
Prolangs-C |
C |
基准测试套件 |
agrep、archie-client、bison、gnugo、unix-smail |
Ptrdist |
C |
指针密集型基准测试套件 |
|
Rodinia |
C |
科学应用程序 |
backprop、pathfinder、srad |
SciMark2-C |
C |
科学应用程序 |
FFT、LU、蒙特卡罗、稀疏矩阵乘法 |
sim |
C |
动态规划 |
一种时间效率高、线性空间的局部相似性算法 |
tramp3d-v4 |
C++ |
数值分析 |
基于 FreePOOMA 的模板密集型数值程序 |
Trimaran |
C |
加密 |
3des、md5、crc |
TSVC |
C |
矢量化基准测试 |
矢量化编译器测试套件 (TSVC) |
VersaBench |
C |
基准测试套件 |
8b10b、波束形成器、bmm、dbms、ecbdes |
所有 MultiSource 应用程序都适合性能测量,并且在设置 CMake 选项 TEST_SUITE_BENCHMARKING_ONLY
时将运行。
配置¶
测试套件具有配置选项来自定义构建和运行基准测试。CMake 可以打印它们的列表
% cd test-suite-build
# Print basic options:
% cmake -LH
# Print all options:
% cmake -LAH
常见配置选项¶
CMAKE_C_FLAGS
指定要传递给 C 编译器调用的额外标志。这些标志也传递给 C++ 编译器和链接器调用。请参阅 https://cmake.com.cn/cmake/help/latest/variable/CMAKE_LANG_FLAGS.html
CMAKE_C_COMPILER
选择要使用的 C 编译器可执行文件。请注意,C++ 编译器是自动推断的,即当指定
path/to/clang
时,CMake 将自动使用path/to/clang++
作为 C++ 编译器。请参阅 https://cmake.com.cn/cmake/help/latest/variable/CMAKE_LANG_COMPILER.htmlCMAKE_Fortran_COMPILER
选择要使用的 Fortran 编译器可执行文件。默认情况下未设置,除非运行 Fortran 测试套件,否则不需要。
CMAKE_BUILD_TYPE
选择构建类型,例如
OPTIMIZE
或DEBUG
,选择一组预定义的编译器标志。无论CMAKE_C_FLAGS
选项如何,这些标志都会应用,并且可以通过修改CMAKE_C_FLAGS_OPTIMIZE
等来更改。请参阅 https://cmake.com.cn/cmake/help/latest/variable/CMAKE_BUILD_TYPE.htmlTEST_SUITE_FORTRAN
激活 Fortran 测试。这是一个正在进行的工作。更多信息可以在 Flang 文档 中找到
TEST_SUITE_RUN_UNDER
使用给定的工具作为测试调用的前缀。这通常用于在模拟器工具中运行交叉编译的测试。
TEST_SUITE_BENCHMARKING_ONLY
禁用不适合性能测量的测试。禁用的测试要么运行时间非常短,要么受 I/O 性能的影响很大,因此不适合用作编译器性能测试。
TEST_SUITE_SUBDIRS
要包含的目录的用分号分隔的列表。这可以用于仅构建测试套件的部分或包含外部套件。此选项无法可靠地与更深的子目录一起使用,因为它会跳过可能需要的中间
CMakeLists.txt
文件。TEST_SUITE_COLLECT_STATS
收集内部 LLVM 统计信息。在调用编译器时附加
-save-stats=obj
并使 lit 运行器收集和合并统计信息文件。TEST_SUITE_RUN_BENCHMARKS
如果将其设置为
OFF
,则 lit 实际上不会运行测试,而只会收集构建统计信息,例如编译时间和代码大小。TEST_SUITE_USE_PERF
使用
perf
工具进行时间测量,而不是使用测试套件附带的timeit
工具。perf
通常在 Linux 系统上可用。TEST_SUITE_SPEC2000_ROOT
、TEST_SUITE_SPEC2006_ROOT
、TEST_SUITE_SPEC2017_ROOT
、…指定外部基准测试套件的安装目录。您可以在
External
目录(例如External/SPEC/README
)中的 README 文件中找到有关预期版本或用法的更多信息
常见 CMake 标志¶
-GNinja
为 ninja 构建工具生成构建文件。
-Ctest-suite/cmake/caches/<cachefile.cmake>
使用 CMake 缓存。测试套件附带几个 CMake 缓存,它们预定义了常见或棘手的构建配置。
显示和分析结果¶
compare.py
脚本显示和比较结果文件。在使用 -o filename.json
标志调用 lit 时会生成结果文件。
用法示例
基本用法
% test-suite/utils/compare.py baseline.json Warning: 'test-suite :: External/SPEC/CINT2006/403.gcc/403.gcc.test' has No metrics! Tests: 508 Metric: exec_time Program baseline INT2006/456.hmmer/456.hmmer 1222.90 INT2006/464.h264ref/464.h264ref 928.70 ... baseline count 506.000000 mean 20.563098 std 111.423325 min 0.003400 25% 0.011200 50% 0.339450 75% 4.067200 max 1222.896800
显示 compile_time 或文本段大小指标
% test-suite/utils/compare.py -m compile_time baseline.json % test-suite/utils/compare.py -m size.__text baseline.json
比较两个结果文件并过滤运行时间短的测试
% test-suite/utils/compare.py --filter-short baseline.json experiment.json ... Program baseline experiment diff SingleSour.../Benchmarks/Linpack/linpack-pc 5.16 4.30 -16.5% MultiSourc...erolling-dbl/LoopRerolling-dbl 7.01 7.86 12.2% SingleSour...UnitTests/Vectorizer/gcc-loops 3.89 3.54 -9.0% ...
通过获取每个最小运行时间来合并多个基线和实验结果文件
% test-suite/utils/compare.py base0.json base1.json base2.json vs exp0.json exp1.json exp2.json
使用 LNT 进行持续跟踪¶
LNT 是一套用于持续监控性能的客户端和服务器工具。您可以在 https://llvm.net.cn/docs/lnt 中找到更多信息。LLVM 项目的官方 LNT 实例托管在 http://lnt.llvm.org。
外部套件¶
可以通过以下两种方式启用 SPEC 等外部套件:
将它们放置(或链接)到
test-suite/test-suite-externals/xxx
目录中(例如:test-suite/test-suite-externals/speccpu2000
)使用配置选项,例如
-D TEST_SUITE_SPEC2000_ROOT=path/to/speccpu2000
您可以在相应的 README 文件中找到更多信息,例如 test-suite/External/SPEC/README
。
对于 SPEC 基准测试,您可以通过 TEST_SUITE_RUN_TYPE
配置选项在 test
、train
和 ref
输入数据集之间切换。默认情况下使用 train
数据集。
自定义套件¶
您可以使用测试套件基础设施构建自定义套件。自定义套件在其顶层目录中有一个 CMakeLists.txt
文件。如果将 CMakeLists.txt
放置到测试套件的子目录中,或者设置 TEST_SUITE_SUBDIRS
变量时,它将被自动拾取。
% cmake -DTEST_SUITE_SUBDIRS=path/to/my/benchmark-suite ../test-suite
配置文件引导优化¶
配置文件引导优化需要编译和运行两次。首先,应启用配置文件生成检测并为训练数据设置基准测试的编译。lit 运行器将使用 llvm-profdata
合并配置文件,以便它们可以被第二次编译运行使用。
示例
# Profile generation run using LLVM IR PGO:
% cmake -DTEST_SUITE_PROFILE_GENERATE=ON \
-DTEST_SUITE_USE_IR_PGO=ON \
-DTEST_SUITE_RUN_TYPE=train \
../test-suite
% make
% llvm-lit .
# Use the profile data for compilation and actual benchmark run:
% cmake -DTEST_SUITE_PROFILE_GENERATE=OFF \
-DTEST_SUITE_PROFILE_USE=ON \
-DTEST_SUITE_RUN_TYPE=ref \
.
% make
% llvm-lit -o result.json .
要使用 Clang 前端的 PGO 而不是 LLVM IR PGO,请设置 -DTEST_SUITE_USE_IR_PGO=OFF
。
TEST_SUITE_RUN_TYPE
设置仅影响 SPEC 基准测试套件。
交叉编译和外部设备¶
编译¶
CMake 允许通过工具链文件交叉编译到不同的目标。更多信息可以在这里找到
可以使用 test-suite/cmake/caches/target-target-*-iphoneos-internal.cmake
CMake 缓存文件从 macOS 交叉编译到 iOS;这需要一个内部 iOS SDK。
运行¶
在交叉编译环境中运行测试有两种方法
通过 SSH 连接到外部设备:
TEST_SUITE_REMOTE_HOST
选项应设置为 SSH 主机名。可执行文件和数据文件需要在编译后传输到设备。这通常通过rsync
make 目标完成。之后,可以在主机上使用 lit 运行器。它将在基准测试和验证命令行前面加上ssh
命令。示例
% cmake -G Ninja -D CMAKE_C_COMPILER=path/to/clang \ -C ../test-suite/cmake/caches/target-arm64-iphoneos-internal.cmake \ -D CMAKE_BUILD_TYPE=Release \ -D TEST_SUITE_REMOTE_HOST=mydevice \ ../test-suite % ninja % ninja rsync % llvm-lit -j1 -o result.json .
您可以使用
TEST_SUITE_RUN_UNDER
设置指定目标机器的模拟器。lit 运行器将在所有基准测试调用之前加上它。
通过 LNT 运行测试套件¶
LNT 工具可以运行测试套件。将测试结果提交到 LNT 实例时使用它。有关详细信息,请参见 https://llvm.net.cn/docs/lnt/tests.html#llvm-cmake-test-suite。
通过 Makefile 运行测试套件(已弃用)¶
注意:测试套件附带了一组被认为已弃用的 Makefile。它们不支持更新的测试模式,如 Bitcode
或 Microbenchmarks
,并且更难使用。
旧文档可在 test-suite Makefile 指南 中找到。