MIC程式設計
(基礎部分,可參考上一篇《MIC簡介》)
幾個問題:
1.什麼是MIC?
協處理器、加速卡
2.什麼是MIC程式設計?
讓程式運作在MIC卡上
3.如何發揮MIC卡的優勢?
并行(在衆多核心上)
4.如何并行?
應用并行庫:OpenMP、MPI、pThread、TBB……
MIC應用模式
MIC卡可以看作協處理器,也可以看作獨立的節點
MIC有5中應用模式:
CPU原生模式
CPU為主MIC為輔模式(最常用)
CPU與MIC對等模式
MIC為主CPU為輔模式
MIC原生模式(native模式)
微異構:CPU上的某些指令放在MIC上還是有些問題的。
native模式:
什麼是native模式?
僅在MIC卡上本地運作的模式
如何使用native模式?
原始CPU程式,編譯時增加“-mmic”選項
不能含SSE、AVX等向量化指令代碼
native模式有什麼好處?
簡單,無傳輸
native模式有哪些局限?
卡上空間有限,單核計算能力有限(應該還不如CPU)
native模式适合哪種應用場景?
簡單測試、高并發的小規模程式
native模式使用方式
CPU單節點程式test_native.c
icc test_native.c -o ta.out
編譯選項增加-mmic
icc test_native.c -o ta.out -mmic
方法一:
scp将可執行程式傳到卡上
scp ta.out mic0: ~/
登入到卡上執行程式
ssh mic0
./ta.out
遠端執行
ssh -x mic0 /root/ta.out
方法二:
無需将可執行程式傳到卡上
/opt/intel/mic/bin/micnativeloadex
對等模式(必須是CPU的MPI程式)
什麼是對等模式?
通過網絡在CPU和MIC端協同計算的模式
如何使用對等模式?
原始CPU程式,編譯兩個版本,其一增加”-mmic”
不能含有SSE、AVX等向量化指令代碼
對等模式有哪些局限?
通信開銷大
對等模式适合哪種應用場景?
高并發的MPI程式,内部使用多線程并行
對等模式使用方法
CPU、MPI程式
編譯兩份代碼,使用mpiicc
mpiicc test_mpi.c -o tm.out
mpiicc test_mpi.c -o tm.out_mic -mmic
scp将mic端可執行程式傳到卡上
scp tm.out_mic mic0: ~/
mic運作庫
設定環境變量export I_MPI_MIC=enable
運作程式
mpirun -host(主機IP) host -n 1 ./tm.out : -host mic0 -n 1
offload模式
什麼是offload模式?
MIC作為協處理器,負責部分運算的模式
如何使用offload模式?
修改代碼,編寫引語,類似于OpenMP
offload模式有什麼好處?
靈活、效率高
offload模式有哪些局限?
通信開銷,需要修改代碼
offload模式适合哪種應用場景?
适合高并行加速的應用
offload基礎概念--主機和裝置
Host-Device的定義
Host端:CPU主機端
運作串行部分
負責控制等
Device端:MIC裝置端
作為CPU(host)的協處理器
有獨立的儲存設備(device memory)
同時啟動大量線程進行并行計算
CPU/MIC異構協同計算模型
Fork-join模型(一般利用此模型,計算密集型)
CPU“offload (解除安裝)”MIC函數
MIC函數内部進行并行計算
CPU擷取MIC計算後的結果(比如說規約後的)
Offload模式運作流程
程式啟動,在CPU端運作主函數------程式運作到offload語句,得知接下來的代碼段要在MIC端運作------驅動程式檢測MIC卡是否存在,如果存在則調用MIC版本代碼,否則調用CPU版本代碼------(以下假設MIC卡存在)如果本次是第一次運作MIC程式,則驅動程式啟動/喚醒MIC卡------MIC版本代碼加載到MIC卡上------MIC端記憶體開辟空間,驅動程式将從資料從CPU端記憶體中複制到MIC端記憶體中------CPU端程式暫停:MIC端程式開始運作(CPU此時停下來等着)------MIC端程式段運作完成後,将資料從MIC端記憶體複制到CPU端記憶體------MIC卡回複低功耗狀态,CPU端程式恢複運作------程式結束