最近要在MIC機(jī)群上做散布式開發(fā),發(fā)現(xiàn)有兩種模式可以用:
1) offload模式:該模式和GPGPU編程思想類似,把并行度高的代碼轉(zhuǎn)移到local的MIC處理器上履行,其它代碼依然在CPU上履行。MIC只負(fù)責(zé)本地計(jì)算,散布式通訊必須在CPU上履行。
2)symmetric模式:編譯出在MIC和CPU上履行的兩份2進(jìn)制代碼。該模式邏輯上允許MIC進(jìn)行散布式通訊,雖然物理上消息還是從CPU走的。這類模式編程最大的難點(diǎn)是load balancing問題。
通過幾天探索,發(fā)現(xiàn)了offload模式下的各種限制:
1)由于內(nèi)存地址不1樣,除值類型1維數(shù)組,在offload時(shí)沒法拷貝含有援用類型數(shù)據(jù)。固然,對任何不同享內(nèi)存的體系結(jié)構(gòu)而言,這點(diǎn)其實(shí)不意外。
2)沒法使用復(fù)雜的數(shù)據(jù)類型,例如iostream和smart pointer。基本上還是老老實(shí)實(shí)用C寫比較好。
3)沒法支持virtual function,由于offload區(qū)域內(nèi)沒法構(gòu)造virtual table。這樣1來,就不要想著面向?qū)ο罄锏睦^承和多態(tài)了。
4)除非有target特殊標(biāo)記,CPU代碼中的全局變量也使用不了。
5)不支持MPI代碼,由于offload本身只能支持本地計(jì)算,不支持散布式通訊。
6)如果offload區(qū)域內(nèi)會(huì)拋異常,必須在offload區(qū)域內(nèi)catch解決,不能期望異常會(huì)跑到CPU代碼里。
另外,如果只斟酌1臺(tái)機(jī)器上的兩個(gè)co-processor之間的通訊,即intra-node communication,也能夠用1個(gè)叫SCIF的協(xié)議。用法比MPI底層,類似于socket編程。由于不合適我的使用處景,沒有深入研究。
值得1提的是,不久的將來應(yīng)當(dāng)會(huì)出現(xiàn)不含CPU,純用MIC進(jìn)行散布式計(jì)算的機(jī)群。如果想進(jìn)行提早開發(fā),不斟酌利用CPU資源,其實(shí)用symmetric mode是1種非常好的選擇。使用symmetric模式時(shí),驚訝的發(fā)現(xiàn)原來可以只履行MIC的2進(jìn)制代碼,而且MIC節(jié)點(diǎn)的rank跟CPU1樣,完善支持散布式場景。這樣1來,除Intel編譯器不支持1些最新的C++語法外,原來散布式的CPU代碼都不用改,感覺非常棒!MIC相對CPU,最大的優(yōu)勢應(yīng)當(dāng)就是在這里了――代碼移植性比CUDA真不是好1點(diǎn)兩點(diǎn)。