有些編程技術針對的是當前或者未來的超級計算機,雖然它們已經存在了很長時間,但現在很多開發人員并沒有對這些技術有一個清晰的概念和認識。
從上世紀六七十年代世界上首個超級計算機CDC6600被Seymour Cray研制出來起,超級計算機就成為了應用程序開發人員的另一目標,使開發人員不斷適應新的方法,和持續變化的硬件和軟件系統。在高性能計算領域,開發人員所需要的適應性尤為明顯,這里,開發人員通常需要對目標節點架構進行優化,以“擠出”最后一點可用的性能。
然后,20世紀90年代的“殺手微指令的襲擊”把一切都變成了一個小問題。隨著節點數量的增加,應用程序開發人員不得不考慮PVM(并行計算機),然后是MPI通訊協議,在他們的任務中,在沒有任何向量指令的情況下,將應用程序并行化到大量的節點上,這些節點包括商品的COTS (貨架產品)芯片。如下圖所示,從1995年到2010年,COTS芯片的時鐘周期減少了。應用程序開發人員不再需要關心節點架構。
隨著AVX256,AVX512,SVE和GPU的出現,在過去的5年里,矢量已經開始返回我們的視野。更近一點兒說,像英特爾的Knight ' s Landing(KNL)這樣的核心系統,以及附加的加速器,如Nvidia的GPU,都需要重新檢查應用程序,以從新的更強大的節點中獲得更好的性能。由于應用程序不可能總是由編譯器進行矢量化和/或并行化,因此應用程序開發人員必須做一些事情。
從編寫重要的內核到Nvidia GPU的CUDA等專業編程模型,到使用編譯器指令幫助編譯器將輸入的用戶級代碼轉換為處理器的低級矢量化代碼。然后還有一個問題,就是在節點/生成數千個線程上為GPU使用所有這些內核。因為在所有的節點上運行MPI是非常有效的,最初的多核系統的開發人員并不需要使用共享內存線程來并行化。然而,在Nvidia加速器上線程是絕對需要的。OpenACC和OpenMP 4.5是為GPU的線程化和矢量化解決方案開發的。
新體系結構中的另一個啟示是,內存層次結構變得越來越復雜,尤其是當應用程序具有很大的內存占用時。KNL,以及帶有GPU加速器的節點,有兩個級別的內存,這將引入新的挑戰,這些挑戰必須由開發人員員來解決。下圖顯示了KNL的內存層次結構和承載的GPU之間的差異。如果一個應用程序適合于高速存儲器,那么它將獲得優秀的內存性能。但是,如果應用程序需要更多的內存,那么必須將數據集以高效和及時的方式在兩者之間進行管理。
過去的四到五年對那些堅持提高生產力的開發人員來說是一種文化沖擊。他們現在面臨著有效利用這些新的強大節點的嚴峻挑戰。如果它們繼續使用全MPI代碼,并沒有對多層并行代碼執行必要的轉換(通過矢量化和線程化),那么它們的性能將只是節點數量和時鐘周期的一個函數。雖然節點上的核心數量正在緩慢上升,但這些核心的時鐘率正在下降,導致在沒有軟件優化的情況下,新硬件投資的回報率很低。
《混合/多核心MPP系統的編程》(Programming for Hybrid Multi / Manycore MPP Systems)一書中詳細討論了新節點的架構,以及開發人員可以使用的編程技術來提高性能。對于那些現在面臨著從節點的矢量能力來提高性能的巨大挑戰的開發人員來說,這將是非常有用的,同時也提高了GPU的核心或線程數量的增加。未來,更多的核心包含將更廣泛的向量,以及更復雜的內存層次結構。