前言
SPEC CPU是一套行業標准的CPU密集型基准測試套件。SPEC設計了此套件,以使用實際用戶應用程序開發的工作負載,在最廣泛的實際硬件范圍內提供計算密集型性能的比較度量。這些基准作為源代碼提供,要求用戶習慣使用編譯器命令以及通過控制台或命令提示窗口通過命令解釋器使用的其他命令,以便生成可執行二進制文件。
SPEC CPU2006和SPEC CPU2017說明
SPEC CPU2006是2006年6月推出的基准測試套件,它有幾種不同的方法來衡量計算機性能。一種方法是測量計算機完成單個任務的速度。這是速度測量。另一種方法是測量計算機在一定時間內可以完成多少個任務。這稱為吞吐量,容量或速率測量。
SPEC CPU2006包含12個Integer Benchmarks,和17個Floating Point Benchmarks
詳細說明參考:SPEC CPU2006 Documentation
SPEC CPU2017是2017年6月發布的,基准測試包包含43個基准,分為四個套件:
SPECrate 2017 Integer SPECspeed 2017 Integer
SPECrate 2017 Floating Point SPECspeed 2017 Floating Point
SPEC CPU2017分別包含:10個Integer rate,10個Integer speed,13個Floating Point rate,10個Floating Point speed
cpu2017目錄結構:
- benchspec -> CPU -> 主要500-999,43個基准 -> 1) src:源碼文件 2)build:編譯目錄 3)run:運行目錄 4)exe:可執行文件目錄 5)data:三個數據集目錄
- benchspec -> Makefile.defaults makefile模板文件
- bin -> runcpu runcpu命令文件
- bin -> harness
- config -> Example-gcc-linux-x86.cfg 模板配置文件,例如:gcc_dir, label, optimize優化參數等
- result 存放運行日志
詳細說明參考:SPEC CPU2017 Documentation
SPEC CPU 2006使用及注意事項
- 修改config目錄下的.cfg配置文件(如果是使用的cpu2017的配置文件,需要修改intspeed為int,fpspeed為fp)。
- 在cpu2006目錄下source shrc。
- 基本使用:
// runspec測試433 benchmark,test.cfg配置文件,test數據集,運行一次
runspec -c test.cfg -a run --rebuild -i test -n 1 --noreportable 433
選項說明:
-c
等價於--config
或--conf
-a
等價於--action
(此處參數run
代表運行,常用參數還有build
等)-D
等價於--rebuild
, 表示運行時重新build目錄,如果不加此選項不會生效你修改過的test.cfg配置文件,如果已經build成功了,只需要run則可以不加此選項-i
等價於--size
表示數據集大小,數據集共有三種:test、train、ref
-n
等價於--iterations
表示每個benchmark的運行次數output_format
輸出文件的格式,選項有:txt,html,cfg,pdf,csv
注意事項:
-n
參數,默認值為3
- 不加
--noreportable
則默認為reportable,表示生成的結果時用於報告的,也就是說此時不管你設置的-n參數為多少,它都至少為你運行兩遍,如果使用--noreportable
,則-n
指定運行幾遍就運行幾遍 - 如果運行時你修改了配置文件,但你不想讓它重新編譯,可以把
--rebuild
選項換成`--nobuild
SPEC CPU2017使用及注意事項
- 配置文件區分intrate、intspeed、fprate和fpspeed
- 使用前也需要source shrc
- 基本使用:
// runcpu測試500 benchmark,test.cfg配置文件,test數據集,運行一次
runcpu -c test.cfg -a run --rebuild -i test -n 1 --noreportable 500
選項說明:
- cpu2017中移除選項
-rate
,-speed
,-parallel_setup
- 新增重要選項
--threads
,默認值為1
。如果在配置中使用了openmp選項OMP_NUM_THREADS
則會忽略該選項。 -tune tuning
,選擇tuning使用base
或是peak
,默認使用base
-C
等價於--copies
,表示rate運行多少個copies
,根據系統選擇32或是64
正確運行效果應該如下:
除了使用以上命令測試之外,通常也可以使用腳本進行批量測試,示例腳本使用說明如下:
- SPEC CPU2017 GCC測試腳本如下(SPEC CPU2006,ICC、AOCC、LLVM腳本只需簡單修改即可):
#!/bin/bash
function config()
{
source /home/zgl/cpu2017/0-setenv-gcc.sh
source /home/zgl/cpu2017/shrc
path=/home/zgl/cpu2017/test-log
filename=${1}-`date`-gcc.log
cfg='gcc.cfg --noreportable'
}
# 可增加一些方法進行每次測試前的memory、cache等清理,
# 使得到的結果更准確
function build(){
config $1
echo '****** buildstart time '`date +%Y-%m-%d-%H-%M-%S`' *****'>>${path}/${filename} cfg>&1
runcpu -c $cfg -a clean $1 >>${path}/${filename} 2>&1
runcpu -c $cfg -a clobber $1 >>${path}/${filename} 2>&1
runcpu -c $cfg -a build --rebuild $1>>${path}/${filename} 2>&1
echo '****** build-end time is '`date +%Y-%m-%d-%H-%M-%S`' ******'>>${path}/${filename} cfg>&1
}
function run(){
echo '****** run start time '`date +%Y-%m-%d-%H-%M-%S`' *****'>>${path}/${filename} cfg>&1
runcpu -c $cfg -a run --nobuild -i ref -n 1 $1 >>${path}/${filename} 2>&1
echo '****** run-end time is '`date +%Y-%m-%d-%H-%M-%S`' *****'>>${path}/${filename} cfg>&1
}
#build fprate
#run fprate
#build intrate
#run intrate
#build intspeed
#run intspeed
#build fpspeed
#run fpspeed
12345678910111213141516171819202122232425262728293031323334353637383940414243
- config文件可從Spec Results上下載模板之后進行修改:
https://www.spec.org/cpu2017/results/cfp2017.html
SPEC CPU與benchmark關系
SPEC CPU包含多個benchmark,每個benchmark有不同的應用領域,采用語言是C,C++,Fortran
,benchmark位於spec cpu目錄下的benchspec/CPU目錄,每個benchmark包含build,data,Docs,exe,run,Spec
等目錄。
Q:
- 每個 benchmark 的運行與 runcpu(或者 runspec)有什么關系?
- benchmark 的這些目錄如何生成的?以及每個目錄作用是什么?
- 對於 rate benchmark(例如:500.perlbench_r)和 speed benchmark(例如:600.perlbench_r)有什么關系?
A:
- 關於 spec 的運行機制:首先 spec 有一個
Makefile.defaults
模板文件,spec 先讀取 cfg 配置文件,根據模板文件生成對應 benchmark 的Makefile.spec
文件,再根據Makefile.spec
中的優化選項和配置信息進行編譯和運行。 - 也就是說 benchmark 的
build,exe,run
目錄是由 spec 生成,對應文件作用也就分別是存放源碼已經 build 生成的中間文件,存放了可執行文件,可執行文件運行目錄,包含輸出模板信息和輸入文件及輸入參數信息等。 - 對於
500.perlbench_r
和600.perlbench_r
這樣的 benchmark 打開他們的目錄你會發現,它們目錄的區別就是 500.perlbench_r 中多一個src
目錄,因為這樣的 benchmark,源碼是存放在這里的。兩個benchmark 的不同還在於它們的binary
文件可能不一樣,輸入參數可能不一樣,一個是測試rate
另一個測試speed
。
其實我們更應該學會這樣使用SPEC:需要運行哪個benchmark 就進入哪個 benchmark 的 build
目錄(前提是你運行過runcpu命令生成了目錄),直接修改 Makefile.spec
配置,再執行make clean
和 make -j
重新編譯生成 binary
,再把生成的binary
copy到run
目錄運行,如何運行?在run
目錄下面你會看到speccmds.cmd
文件,文件的最后給出了該benchmark的運行參數和輸入,如下所示:
然后你就可以在run
目錄執行time -p ...
,得到運行時間,具體操作如下:
cd cpu2017/benchspec/CPU/600.perlbench_r/build/build_base_gcc-m64.0000/
vi Makefile.spec # 修改配置選項
make clean # 清除中間文件
make -j 32 # 進行編譯
cp test ../../run/run_base_test_gcc-x86-m64.0000/ #拷貝可執行到run目錄
cd ../../run/run_base_test_gcc-x86-m64.0000/ #進入到run目錄
vi speccmds.cmd #查看最后的參數
time -p ./test <inp.in xx xx xx >xx >>xxx
12345678
其它:
- 區別cpu2006使用runspec,cpu2017使用runcpu。
- 運行test和train數據集只能得到
run time
,運行ref數據集時間最長,能得到run time
和對應的ratio值
。 - SPEC CPU
Results
中收集了各大平台發布的speed和rate測試的結果集和配置文件(包含base的優化選項和peak的優化選項)。 - 注意配置文件中使用的
jemalloc
庫的版本和路徑,-lmvec
選項庫的使用和-vector-library=LIBMVEC
選項的使用。 - 測base數據時不用打開
openmp
相關的選項。 - 數據測試時為避免終端打印太多運行信息,可關閉
teeout
選項,運行信息可使用腳本記錄到日志文件(運行結果信息:cfg文件,csv文件,html文件,pdf文件等會自動保存到result文件夾
)。 - 關於
jemalloc
選項的配置使用和介紹信息在jemalloc介紹和使用 。