1、下載安裝Stream
tar -xvf stream.tar
參數說明:
首先看下源碼中對於編譯stream.c的參數介紹:
#ifdef _OPENMP 定義開啟多處理器運行環境,
extern int omp_get_num_threads();
#endif
#ifndef STREAM_ARRAY_SIZE 定義計算的數組大小(成員個數)
# define STREAM_ARRAY_SIZE 45000000
#endif
#ifdef NTIMES 定義值非法時,若定義計算次數,10
#if NTIMES<=1
# define NTIMES 10
#endif
#endif
#ifndef NTIMES 若定義計算次數,10
# define NTIMES 10
#endif
#ifndef OFFSET 定義數組偏移量
# define OFFSET 0
#endif
#ifndef STREAM_TYPE 定義數組為雙精度,64bit,8Bytes
#define STREAM_TYPE double
#endif
以上參數可以在執行前編譯指定具體值
1. -mtune=native -march=native \\針對CPU指令的優化,由於測試編譯機即運行機器,故采用native的優化方法
2. -O3 \\優化級別
3. -mcmodel=medium \\當單個Memory Array Size 大於2GB時需要設置此參數
4. -fopenmp \\適應多處理器環境;開啟后,程序默認線程為CPU線程數,也可以運行時也可以動態指定運行的進程數 。例如:export OMP_NUM_THREADS=12 #12為自定義的要使用的處理器數
5. -DSTREAM_ARRAY_SIZE \\計算方法參考stream.c中的說明 例如本環境中查詢cpu資料 L3緩存 8MB 其值為 8MB*4*2*1000*1000/8 = 8millions (此值為最小值,可以適當大於此值,增大array size會增加測試時間)注意 double 64bit= 8byte
6. -DNTIMES \\執行次數,並從所有結果中取最優
7. -DOFFSET=4096 \\數組的偏移,一般可以不設置
2、使用stream測試內存帶寬
單線程編譯:
gcc -O -mtune=native -march=native -mcmodel=large -DSTREAM_ARRAY_SIZE=100000000 -DNTIME=30 -DOFFSET=4096 stream.c -o stream.o
單線程測試:./stream.o
多線程編譯:
gcc -O -mtune=native -march=native -mcmodel=large -fopenmp -DSTREAM_ARRAY_SIZE=100000000 -DNTIMES=30 -DOFFSET=4096 stream.c -o stream.o
多線程測試:./stream.o
3、測試內存延遲
下載安裝英特爾MLC工具:
(在新型的Intel處理器上精確測試內存延遲是非常困難的,因為它有復雜的硬件預取器。Intel MLC在測試延遲時會自動禁用這些預取器,並且在測試完成后自動恢復預取器原狀態。預取器控制是通過修改MSR實現(Disclosure of H/W prefetcher control on some Intel processors),在Linux上需要root權限。Windows平台,提供了簽名的驅動用於訪問MSR)
下載地址:
https://software.intel.com/content/www/us/en/develop/articles/intelr-memory-latency-checker.html
tar -zxvf mlc_xxx.tgz -C mlc
進入mlc / Linux目錄下測試
命令行參數:
mlc --latency_matrix
打印本地和跨插槽內存延遲矩陣
mlc --idle_latency
打印平台的空閑內存延遲
mlc --loaded_latency
打印平台的加載內存延遲
mlc --c2c_latency
打印平台的緩存到緩存傳輸延遲
mlc -e
不要修改預取器設置
參考:
https://software.intel.com/content/www/us/en/develop/articles/intelr-memory-latency-checker.html