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