導讀:本周MIT最新發布新編程語言Milk,新的程序語言在大數據方面能實現比現有語言快四倍的處理速度。
在當下的計算機芯片中,內存管理是基于計算機科學家所稱的局部性原理(principle of locality)來實現的:
如果一個程序需要某個內存位置的數據塊,它可能也需要數據塊臨近位置的數據。
但是在大數據時代,這種假設已不再成立。如今的計算機程序更多地是在大型數據集中離散地獲取一點點數據。由于從主要內存位中獲取數據已成了當下芯片的最大性能瓶頸,所以不得不更加頻繁地獲取數據,這也明顯拖慢了程序運行的速度。
本周在國際并行體系結構和編譯技術會議(International Conference on Parallel Architectures and Compilation Techniques)上,來自麻省理工學院計算機科學與人工智能實驗室(CSAIL)的研究人員發布了一種新的編程語言——Milk,它能讓應用程序開發者在處理大數據集里的離散數據點問題中更有效率地管理內存。
通過測試幾種通用的算法,使用新語言Milk編寫的程序實現了比現有編程語言快4倍的速度。但是研究者相信通過更進一步的研究可以實現更好地結果。
電氣工程和計算機科學教授Saman Amarasinghe 說,當下大數據集給已有的內存管理技術帶來問題的原因不僅在于因為它們的規模巨大,更多的是因為它們是稀疏的(sparse)。也就是說,問題解決方案的規模并不一定是與問題的規模成正比增加。
“在社交環境中,我們通常傾向于注重更小的問題。” Amarasinghe說“如果你只關注在這種建筑[CSAIL]內的人的話,你能發現我們都是朋友的。但是如果你以地球的層面來看待的話,朋友的數量并不會增加。整個地球有幾十億人口,但是我也僅僅只有幾百個朋友。這就是一個很明顯的稀疏性問題。”
同樣Amarasinghe提到,一個在線書店可能為其1000名顧客提供最流行的20本書籍的書單。但是但其顧客數增加到100萬時,它并不會相應地提供最流行的20000本書籍的書單。
局部思考(Thinking locally)
當下的計算機芯片并沒有專門針對稀疏數據進行優化,而且可以說是完全相反。因為從芯片的主要內存位讀取數據是緩慢的,當下的芯片中每個內核或者每個處理器都有自己的“緩存”,一個相關的小型、本地、高速的內存位。芯片中的內核會一次讀取一個完整的數據塊,而不是在主內存中每次提取一個單獨的數據。而讀取的數據塊是通過局部性原理來進行選擇的。
通過圖像處理的例子可以很容易看清局部性原理的本質:
如果一個程序的目的是將視覺過濾器應用到圖像中,且它每次只作用在圖像的一個數據塊上。那么每次芯片內核請求一個區塊數據時,它應該收到自身緩存能接受的所有臨近區塊數據。因此它可以一個一個區塊處理,且不再獲取更多的數據。
但是如果該算法的興趣是在線書店200萬數據庫中的20本書的話,該方式將不再適用。如果它請求與某一本書相鄰的數據,很有可能其相鄰的100種書的數據都是沒有關聯的。
從主內存中每次只讀取一個數據是非常低效的,這篇論文的第一作者Vladimir Kiriansky 提到
就像是每次你想要一勺食品時,你都需要打開冰箱、打開牛奶盒、倒出一勺牛奶、蓋上牛奶盒、將它放回冰箱。
他是電氣工程和計算機科學的博士生。Amarasinghe 和 Yunming Zhang 是他的論文合作者,Zhang 也是一位電氣工程和計算機科學的博士生。
批處理(Batch processing)
Milk簡單地增加了一些命令到OpenMP中。其中OpenMP 是一種能夠用在C或Fortran等語言中的擴展,可以用來更輕松地為多核處理器編寫代碼。使用Milk的話,程序員可以在任何指令附近插入幾行代碼,其可以在整個大數據集中進行迭代,尋找相對較少數量的項。Milk 的編譯器(將高級代碼轉換成低級指令的程序)可以據此找到管理內存的方法。
使用 Milk 程序時,如果一個內核發現它需要一項數據時,它并不會請求從主內存中讀取它(以及相鄰的數據)。它會將該數據的地址添加到一個本地存儲的地址列表中。當這個列表足夠長時
芯片所有內核將會池化(pool)它們的列表
將這些地址按臨近排布的形式組合到一起
重新分配給內核
這樣一來,每個內核都只請求了自己所需要的數據項,并且可以有效地進行檢索。
這樣描述的話層級較高,但實際上細節會復雜得多。事實上大部分現代計算機芯片都有多級緩存,且一級比一級大(但效率也因此更低)。Milk編譯器不僅必須跟蹤內存地址表,還要跟蹤這些地址中存儲的數據,而且它常常將這兩者在各級緩存之間進行切換。它也必須決定哪些地址應當被保留(可能需要再次訪問),哪些應當被丟棄。研究學者希望能夠進一步提升這種編排復雜數據的算法,從而進一步提升性能表現。
「當下許多重要的應用都是數據密集型的,但不幸的是,內存和CPU之間的性能差距越來越大,這意味著當前的硬件還沒有發揮出它們的全部潛力。」斯坦福大學計算機科學助理教授 Matei Zaharia 說,「Milk 通過優化常見編程架構中的內存訪問來幫助解決這一差距。這項成果結合了內存控制器設計的詳細知識和相關編譯器的知識,能為當前的硬件實現良好的優化。」