test-suite 指南¶
快速入门¶
运行测试需要 lit 测试运行器。你可以使用 LLVM 构建中的一个
% <path to llvm build>/bin/llvm-lit --version lit 20.0.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 20.0.0dev
在 Python 虚拟环境中安装 lit 的官方 Python 发行版也可能有效。这将安装最新发布的 lit
% python3 -m venv .venv % . .venv/bin/activate % pip install lit % lit --version lit 18.1.8
请注意,最新的测试可能依赖于最新发布的 lit 中没有的功能。如有疑问,请尝试以前的方法之一。
使用以下命令检出
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
结构¶
test-suite 包含基准测试和测试程序。这些程序带有参考输出,以便可以检查其正确性。该套件附带工具,用于收集诸如基准测试运行时、编译时间和代码大小等指标。
test-suite 分为几个目录
SingleSource/
包含仅为单个源文件大小的测试程序。一个子目录可能包含多个程序。
MultiSource/
包含子目录,其中包含带有多个源文件的完整程序。大型基准测试和完整应用程序放在这里。
MicroBenchmarks/
使用 google-benchmark 库的程序。这些程序定义了多次运行的函数,直到测量结果在统计学上显着为止。
External/
包含无法与 test-suite 直接分发的代码的描述和测试数据。此目录中最突出的成员是 SPEC CPU 基准测试套件。请参阅 外部套件。
Bitcode/
这些测试主要用 LLVM bitcode 编写。
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 |
游戏/求解器 |
有效解决 Connect-4 游戏中位置的整数基准测试 |
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 |
数据结构 |
Olden 基准测试的 SGI 版本 |
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, Montecarlo, sparse matmul |
sim |
C |
动态规划 |
一种时间高效、线性空间的局部相似性算法 |
tramp3d-v4 |
C++ |
数值分析 |
基于 FreePOOMA 的模板密集型数值程序 |
Trimaran |
C |
加密 |
3des, md5, crc |
TSVC |
C |
向量化基准测试 |
向量化编译器测试套件 (TSVC) |
VersaBench |
C |
基准测试套件 |
8b10b, beamformer, bmm, dbms, ecbdes |
所有 MultiSource 应用程序都适用于性能测量,并且在设置 CMake 选项 TEST_SUITE_BENCHMARKING_ONLY
时将运行。
配置¶
test-suite 具有配置选项,用于自定义构建和运行基准测试。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
要包含的目录的分号分隔列表。这可以用于仅构建 test-suite 的部分或包含外部套件。此选项对于更深的子目录无法可靠地工作,因为它会跳过可能需要的中间
CMakeLists.txt
文件。TEST_SUITE_COLLECT_STATS
收集内部 LLVM 统计信息。在调用编译器时附加
-save-stats=obj
,并使 lit 运行器收集和合并统计信息文件。TEST_SUITE_RUN_BENCHMARKS
如果将其设置为
OFF
,则 lit 实际上不会运行测试,而只会收集构建统计信息,例如编译时间和代码大小。TEST_SUITE_USE_PERF
使用
perf
工具进行时间测量,而不是 test-suite 附带的timeit
工具。perf
通常在 linux 系统上可用。TEST_SUITE_SPEC2000_ROOT
,TEST_SUITE_SPEC2006_ROOT
,TEST_SUITE_SPEC2017_ROOT
, …指定外部基准测试套件的安装目录。你可以在
External
目录中的 README 文件(例如External/SPEC/README
)中找到有关预期版本或用法的更多信息
常用 CMake 标志¶
-GNinja
为 ninja 构建工具生成构建文件。
-Ctest-suite/cmake/caches/<cachefile.cmake>
使用 CMake 缓存。test-suite 带有几个 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
数据集。
除了 SPEC 之外,多媒体框架 ffmpeg 和 dav1d 也可以以相同的方式作为外部项目连接。通过将它们包含在 llvm-test-suite 中,可以编译更多潜在的可向量化代码
这可以通过仅触发代码生成断言来捕获编译器错误。包含它们还会添加小的代码正确性测试,将编译器生成的函数的输出与手写汇编函数进行比较。(在 x86 上,构建汇编需要安装 nasm 工具。)集成到 llvm-test-suite 中并不会运行项目的完整测试套件。这些项目还包含用于测量某些函数性能的微基准测试。有关更多详细信息,请参阅
llvm-test-suite/External
下的各个ffmpeg
和dav1d
目录中的README.md
文件。
自定义套件¶
你可以使用 test-suite 基础设施构建自定义套件。自定义套件在顶层目录中有一个 CMakeLists.txt
文件。如果放置在 test-suite 的子目录中或设置 TEST_SUITE_SUBDIRS
变量,则会自动拾取 CMakeLists.txt
% cmake -DTEST_SUITE_SUBDIRS=path/to/my/benchmark-suite ../test-suite
Profile Guided Optimization¶
Profile guided optimization 需要编译和运行两次。首先,应该在启用配置文件生成检测并设置为训练数据的情况下编译基准测试。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 运行 test-suite¶
LNT 工具可以运行 test-suite。在向 LNT 实例提交测试结果时使用此工具。有关详细信息,请参阅 https://llvm.net.cn/docs/lnt/tests.html#llvm-cmake-test-suite。
通过 Makefiles 运行 test-suite(已弃用)¶
注意:test-suite 附带一组被认为已弃用的 Makefiles。它们不支持较新的测试模式,例如 Bitcode
或 Microbenchmarks
,并且更难使用。
旧文档可在 test-suite Makefile 指南 中找到。