大數據時代的到來以及由此帶來的處理需求,使得并行編程迫切需要向平民化發展。
我們正從互聯網時代向物聯網時代演進,其重要特點之一是大數據的出現。因此,我們需要獲得更強的計算能力,以更快捷地處理各種計算設備產生的海量數據,從中提取出商業價值。
在這樣的大背景下,并行化、分布式已成為提升計算力的重要解決方式。談大數據往往圍繞分布式計算,這里我們講一講另一個支撐技術并行化。要實現并行化從來就不是一件容易的事。在研究的過程中,我們碰到了兩堵障礙墻,一是硬件的并行性永遠跟不上客觀世界應用對計算力的需求;二是并行軟件的發展永遠趕不上硬件并行化的發展。而隨著時間的推移,應用、硬件和軟件技術發展的不均衡性也日益凸顯,“撞墻”效應愈演愈烈。
針對這樣的挑戰,我們著重在眾核體系結構和并行編程研究兩方面尋求突破,前者的目標是使硬件并行性的發展跟上現實世界并行性需求的發展,而后者的任務是讓普通程序員編寫的軟件能充分利用硬件的并行性。今天我主要想和大家分享英特爾在并行編程這一方面的探索經驗。
業界幾十年來對并行編程的探索,讓廣大程序員普遍認識到沒有一種技術能夠“一招鮮走遍天下”,從而一勞永逸地解決問題。但大數據時代的到來以及由此帶來的處理需求,使得并行編程迫切需要向平民化發展。為此,英特爾研究院提出了四個思路:一、開發多層次的、針對不同水平程序員的多樣化并行編程技術;二、提供從語言到工具的全套解決方案,涵蓋從開發到調試,再到調優的各個階段;三、允許不同層次、種類編程技術之間的可組合性;四、強調平臺伸縮性,實現編寫一次,即可在現在與未來、多核與眾核、同構與異構的不同平臺上運行。
簡單來說,這四個思路旨在讓程序員在使用英特爾的編程技術時找到親近感,讓并行編程變得更加便捷。我們發現,程序員能否很好地進行并行編程,與他們自身的認知、習慣及受到的培訓有很大的關系。很多程序員在學習編程時都是從串行編程開始的,他們無法快速地轉換到并行編程上。這些思路可以保證程序員在使用我們的技術時,會發現多多少少跟他們原來所學的相似,從而能讓他們擁有自己的選擇權。
為此,在具體的技術實現策略上,大致分三種:一、串行變并行,即程序員原來寫的串行程序不用大改,由我們的編譯器、自動工具和并行硬件把程序改為并行。二、給串行加上并行,即讓程序員考慮能不能在原有的串行語言上面加入一些并行的擴展。這樣就可以保證已經編好的大部分程序不用修改,只要將一小部分變成并行就行。三、完全并行。這也是業界的全新研究方向,讓程序員考慮徹底地使用新的并行范型和語言。
當然,在現實編程的過程中會發現更加復雜的問題。比如有些使用得很好的串行算法很難進行并行化處理。針對不同的情況,英特爾研究院和軟件部門推薦了不同的解決方案。例如數據并行非常好的,我們就用ArBB(Array Buildlng Blocks)技術來做;如果是任務并行比較好的,我們會用TBB(Threading Building Blocks)技術;描述任務之間復雜邏輯的可以用CnC(Concurrent Collections);如果有些算法真的是很難優化的,我們就直接提供庫,程序員只需要調用就可以了。當時我和同事一起設計ArBB時,就是為了解決核多、SSE/AVX編程難的問題,為程序員提供一條更加便捷的并行途徑。
今天,一個月內上傳到YouTube的視頻比美國三大電視網60年內制作的視頻還要多。未來,當我們真正進人大數據時代后產生的數據量將大大超出人們的想象力。面對未知的挑戰,我們要保持樂觀心態,一起努力實現高效并行化,共同推動互聯網向大數據和物聯網的快速、健康演進。