我們知道數據移動帶來的延遲是阻礙程序性能的一個非常重要的因素。廣義上的數據移動包括幾個不同的方面。它包括不同進程間的信息傳遞(MPI),比如從一維彈簧系統談多進程並行計算中提到的分散式矩陣矢量乘法。它也包括數據從慢速存儲到高速存儲的移動,一個例子是如何從Wall/CPU time理解多線程程序的並行效率一文中關注的IO時間,具體來講是屬於發生在主存和硬碟之間的數據移動,以及從2018戈登貝爾獎談高性能計算提到的數據在不同層次緩存之間的移動。它還包括數據在異質結構中host和target機器之間的移動。
我們為什麼如此關注數據移動?因為數據移動受延遲和帶寬的限制,在高性能計算程序中往往屬於不可並行或者很難並行的部分。那麼如何來克服這一難點呢?除了採用更先進的硬體來降低數據移動的延遲和提高數據傳輸的帶寬,我們在本文中討論一個來自軟體層面的方法。
首先定義一個高性能計算程序的抽象模型。如圖1所示。我們把程序分成兩個部分。其中一個是計算部分,我們假設這一部分是可被完美並行的,即使用n個計算單元,耗時縮短為原來的1/n。另外一個是數據的輸入或者輸出部分,它抽象了上文中提到的數據移動。為了討論的方便,我們在模型中獨立地看數據的輸入和輸出,從而得到了一個簡單的生產者-消費者模型。這個模型在一定程度涵蓋了前文中提到的針對不同層次而實現的並行模型(基於MPI、多線程和異質結構的並行計算)。我們先看兩個例子。例如從2018戈登貝爾獎談高性能計算中提到的深度學習,其中訓練數據的輸入可以看作圖1中的生產者,對模型的訓練看作是消費者。再例如傳統的動力學模擬,計算部分變成了生產者,對給定時間步的數據輸出變成了消費者。