1. 程式人生 > 實用技巧 >SPEC CPU——簡介和使用

SPEC CPU——簡介和使用

前言

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目錄結構:

  1. benchspec -> CPU -> 主要500-999,43個基準 -> 1) src:原始碼檔案 2)build:編譯目錄 3)run:執行目錄 4)exe:可執行檔案目錄 5)data:三個資料集目錄
  2. benchspec -> Makefile.defaults makefile模板檔案
  3. bin -> runcpu runcpu命令檔案
  4. bin -> harness
  5. config -> Example-gcc-linux-x86.cfg 模板配置檔案,例如:gcc_dir, label, optimize優化引數等
  6. result 存放執行日誌

詳細說明參考:SPEC CPU2017 Documentation

SPEC CPU 2006使用及注意事項

  1. 修改config目錄下的.cfg配置檔案(如果是使用的cpu2017的配置檔案,需要修改intspeed為int,fpspeed為fp)。
  2. 在cpu2006目錄下source shrc。
  3. 基本使用:
// 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使用及注意事項

  1. 配置檔案區分intrate、intspeed、fprate和fpspeed
  2. 使用前也需要source shrc
  3. 基本使用:
// 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

正確執行效果應該如下:

除了使用以上命令測試之外,通常也可以使用指令碼進行批量測試,示例指令碼使用說明如下:

  1. 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
  1. 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:

  1. 每個 benchmark 的執行與 runcpu(或者 runspec)有什麼關係?
  2. benchmark 的這些目錄如何生成的?以及每個目錄作用是什麼?
  3. 對於 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_r600.perlbench_r 這樣的 benchmark 開啟他們的目錄你會發現,它們目錄的區別就是 500.perlbench_r 中多一個 src 目錄,因為這樣的 benchmark,原始碼是存放在這裡的。兩個benchmark 的不同還在於它們的 binary 檔案可能不一樣,輸入引數可能不一樣,一個是測試rate 另一個測試 speed

其實我們更應該學會這樣使用SPEC:需要執行哪個benchmark 就進入哪個 benchmark 的 build 目錄(前提是你執行過runcpu命令生成了目錄),直接修改 Makefile.spec 配置,再執行make cleanmake -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

其它:

  1. 區別cpu2006使用runspec,cpu2017使用runcpu。
  2. 執行test和train資料集只能得到run time,執行ref資料集時間最長,能得到run time和對應的ratio值
  3. SPEC CPU Results中收集了各大平臺釋出的speed和rate測試的結果集和配置檔案(包含base的優化選項和peak的優化選項)。
  4. 注意配置檔案中使用的jemalloc庫的版本和路徑,-lmvec選項庫的使用和-vector-library=LIBMVEC選項的使用。
  5. 測base資料時不用開啟openmp相關的選項。
  6. 資料測試時為避免終端列印太多執行資訊,可關閉teeout選項,執行資訊可使用指令碼記錄到日誌檔案(執行結果資訊:cfg檔案,csv檔案,html檔案,pdf檔案等會自動儲存到result資料夾)。
  7. 關於jemalloc選項的配置使用和介紹資訊在jemalloc介紹和使用

References: