《Intel Xeon Phi協處理器高性能編程指南》第一章讀書筆記

一、什麼是Xeon Phi

Xeon(音標 /'zi:on/) Phi是由intel2012年11月12日正式推出的首款60核處理器,中文名叫至強融核。Xeon Phi是Intel爲HPC專門推出的協處理器,插在PCI-E上,進行高性能計算的。Xeon Phi並非傳統意義上的英特爾處理器(CPU),但Xeon Phi當中使用的確實是X86核心,原型爲Intel的集成衆核MIC。它更像是與CPU協同工作的GPU,其基於英特爾消費級GPU技術Larrabee,不過該項目已經於2009年被取消。但英特爾仍然需要Larrabee技術,從而在超級計算機市場與NVIDIA競爭,因爲更簡單、更專業的GPU處理器可以更有效地處理某些超級計算任務,從而提高性能並減少能耗。

Xeon Phi和Nvidia Tesla本質上都是並行計算加速器,Phi和Tesla最大的不同就是在於其內部是含有指令集的,以前在服務器集羣中編寫的程序,幾乎不用修改,或者進行小規模的修改,即可在Phi上運行。Phi的性能大概可以達到Tesla的80%—90%,而代碼量也只有Tesla的80%。 工作原理……和Tesla一樣,都是通過高度並行化提高運算密度。GPU內部含有大量的流處理器,運算密度非常高;Phi也一樣,內部幾十顆X86核心,對浮點數的運算性能非常可怕。

Intel Xeon Phi協處理器上面可以運行Linux,是一個真正意義上可以運行Linux給予x86架構的SMP(多對稱處理器,共享內存,並且只運行一個操作系統)單芯片。每張卡擁有自己的IP地址。

二、版本

第一代代號Knights Corner

KNC只能插在PCI-E插槽上當協處理器,發揮加速卡的作用。

相關參數如下:

運行Linux

使用Intel 22nm 3D三柵晶體管技術工藝製造

支持包括Intel Parallel Studio XE在內的標準工具

衆核:

——多於50核(不同產品之間不一樣)

——順序核支持64位x86指令,以及獨一無二寬度的SIMD指令

——每核有4個硬件線程,主要用於隱藏順序架構導致的延遲

——核之間通過高速雙向環形總線互聯

——每個協處理器具有cache一致性

——每核本地擁有512KB  L2緩存,並可以高速訪問其他核的L2緩存(使得整體L2緩存大於25MB)

——緩存提供高速帶寬內存的同時實現了高效的能源使用

除了64位的x86以外

——擁有獨特寬度的SIMD技術,由512位寬度向量取代較窄的MMX、Intel SSE和Intel AVX技術

——針對倒數、平方根、平方和指數運算的高性能支持

特殊功能

——封裝的內存控制器可以支持8GB GDDR5(部分可變)

——片內的PCI-E連接邏輯電路

——擁有電源管理功能

——性能監控功能,支持Intel VTune Amplifier XE一類的工具

第二代代號Knights Landing

2016年推出的KNL,可以當做獨立的處理器,不用再搭配Xeon處理器共建系統,當然也可以當做協處理器,發揮加速卡的作用。

“天河2”使用的是Xeon E5-2692+Xeon Phi

三、評估高度並行能力

使用編譯器選項 -O2 -xHost來完成自動向量化,使用編譯器選項-no-vec -no-simd關閉向量化

當使用MPI時,可以使用Intel Cluster Studio XE裏的Intel Trace Analyzer and Collector進行分析MPI通信性能,有助於使瓶頸圖形化,並理解使用計算覆蓋通信的有效性。

Xeon Phi比GPU的可編程能力強

四、常用的優化方法

內存訪問和循環移植,比如:緩存阻塞、循環展開、預取、切片分塊(tilling)、內層循環交換、對齊、親緣性(affinity)。

單元跨度向量量化效果最好(被消費的數據在內存中是連續的)。數據結構轉換可以按照單元跨度向量訪問的數量增加。

最好使用完整的(不是部分)向量。

向量化最好使用正確對齊的數據。

考慮使用大頁面(推薦廣泛使用的Linux libhugelbfs庫)。

算法選擇或更改要易於並行和向量化。

使用編譯指導指令進行預取:intrinsics函數

五、常用命令

編譯命令

icc -openmp -mmic -vec 0report = 3 -O3 test.c -o test

ifort -align array64byte -openmp -mmic -vec -report=3 -O3 test.f90 -o test

其中-align array64byte選項令全部靜態數組數據對齊到64位內存地址範圍,以確保數組能夠以最佳的方式從內存傳輸到緩存。

設置線程數 OMP_SET_NUM_THREADS(2) 

線程優先在一個核上運行 KMP_SET_DEFAULTS("KMP_AFFINITY=COMPACT")

線程均勻分佈在所有核上運行 KMP_SET_DEFAULTS("KMP_AFFINITY=SCATTER")

也可以使用export配置環境變量來指定

export OMP_NUM_THREADS = 2

export KMP_AFFINITY = compact

代碼分載offload

#pragma offload target(mic)

分載編譯時不再使用-mmic選項,因爲代碼編譯的目標是主處理器,增加的#pragma offload target(mic)指出需要分載到協處理器上的代碼了。

因爲程序只在主處理器端運行並且和協處理器控制檯沒有交互,所以需要在主機端配置正確的環境以確保程序按照預期運行。在主機命令行輸入一下命令配置:

export MIC_ENV_PREFIX = MIC

export MIC_OMP_NUM_THREADS = 120

export MIC_KMP_AFFINITY = scatter

PS:利用分載模式時,最好保留一個協處理器核心以處理運行時的控制和數據交換。

分載模式的額外開銷主要包括啓動程序以及主機和協處理器之間數據傳輸的時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章