Halide:簡化影象程式設計

MoussaTintin發表於2012-08-06

原文來自MIT News

只要我們稍微留意一下Instagram便不難發現,影象處理軟體有著的廣闊的市場前景。Facebook正在試圖用10億元收購這家從事影象處理業務的公司。以往人們主要通過計算機來向網路上傳照片;但現在,越來越多的人卻選擇直接通過手機傳送。因此影象處理也逐漸在移動終端變得流行。同時,現在的數碼圖片普遍非常大,不借助好的軟體工具,即使是在桌上型電腦上也需要花費很長的時間業處理。工程師可以通過一定的技巧來加速影象處理演算法,但不幸的是,這些技巧會使程式碼幾乎沒有可讀性,也很難被複用。想要向影象處理程式中增加一個函式,或者將演算法移植到一個不同的平臺上,往往需要徹底地修改整個程式碼。


MIT電腦科學和人工智慧實驗室(CSAIL)的研究人員開發了一門名為“Hlaide”的新的程式語言,旨在改變影象處理程式設計的現狀。比起用傳統語言編寫的程式碼,用Halide編寫的程式不僅更容易閱讀、編寫和修改,而且,由於Halide能夠自動優化程式碼(對常規的程式語言,這個過程需要花費數小時來手工完成),因此,程式的執行速度也顯著提高。
在測試中,MIT的研究人員用Halide重寫了幾個常用的影象處理演算法(這些演算法都事先經過熟練的程式設計師優化)。Halide版本的演算法在程式碼量上大體要多出1/3,但效能卻有極大的提升,加速比能夠加速達2倍、3倍甚至6倍。在一個演算法中,Halide程式雖然比原程式長,但卻取得是了70倍的加速比。

Jonathan Ragan-Kelley(電子工程與電腦科學技術學院研究生)和Andrew Adams(CSAIL博士後)領導了Halide的開發,並且還將原始碼在網上公佈。在這個月的Siggraph(最重要的圖形會議)上,他們提交了一篇關於Halide的文章,這篇文章由他倆與MIT計算工教授Saman Amarasingh、Fredo Durand,以及他們在Adobe和史丹佛的同事共同寫的。


並行流水線

影象處理之所以需要如此大的計算量的原因之一是,它通常需要一系列離散操作。當光打到手機攝像頭的感測器上之後,手機掃描影象資料,查詢可能導致異常畫素點的資料並加以糾正。之後,將感測器資訊轉化為畫素的顏色資訊,並進行顏色校正以和比對度高速高速,以使影象更接近人眼的觀看效果。至此,手機已經進行了大量的處理工作,最後還要再對所有資料進行一次清理處理。

這麼工作也僅僅是使影象在手機螢幕上得以顯示。之後,我們還需要更多的處理步驟,以便用軟體完成諸去除紅眼、柔化陰影或增加飽和度(甚至是使影象看起來更有老式一次性照片的感覺)等操作。此外,高階的修改操作常常需要軟體能夠撤銷現有操作,恢復到上一階段的狀態。
在今天的多核心晶片上,將影象的不同區域分配到不同的計算核心上並行執行,能夠使影象處理更加高效。但是,通常各個核心在完成計算任務後,會將結果返回給主存。由於資料傳輸要比計算慢很多,所以這會抵銷並行化帶來的效能提升。

因此,軟體工程師試圖使每個核心在將它們的計算結果返回到主存前,儘可能的保持忙碌。這意味著,在最終彙總所有資料前,每個計算核心都必須在它所分得的資料上,執行影象處理流水線中的若干個步驟。高效的影象處理程式碼之所以難以編寫,原因在於我們必須跟蹤不同核心上處理的畫素點之間的所有依賴關係。計算核心數量、計算核心的處理能力、分配給每個核心的區域性記憶體大小以及核心何時將資料移出晶片外,在這些因素的選擇之間必須作出折衷,而折衷方案則會因機器而異。因此一臺裝置而言優化的程式,換在另一臺機器上可能起不到加速效果。


分而治之

使用Halide,程式設計師也還得自己考慮在特定機器上高效實現並行化的方案,但是僅就描述影象處理演算法而言,程式設計師則完全不用擔心這些。一個Halide程式有兩部分組成:一部分是演算法,另部分是“排程“(schedule)。排程指定了每個計算核心在各個處理步驟中需要處理的影象塊的大小和形狀。同時,它還指定的資料的依賴性——例如,某個核心上的某個處理步驟需要用到在另外的核心上之前步驟的計算結果。一旦排程確定,Halide將自動處理排程中描述的操作。
程式設計師如果想要將程式移植到一臺不同的機器上,他不需要改變演算法描述,只需變更排程。程式設計師如果想要向流水線中增加一個新的處理步驟,也只需要插入一個關於這個操作過程的新的描述,而無需修改已有的程式碼。(但是,流水線中的新步驟需要在排程中有一個與之對應的設定)
“當你有一個想法,想要將某個操作步驟而並行化,或者需要將某些步驟作某種修改時,如果你需要手動編碼實現,那麼你會發現,想要正確地表達自己的這個想法是件很困難的事情。”Ragan_Kelley說,“如果你有一個最的優化思路想要應用,很可能你必須花上三天時間去排程,因為你必須將原演算法的操作步驟打散。而利用Halide,你只需理性一行程式碼就能正確地表達出你的想法。”
雖然比起普通的畫像處理程式,Halide程式更易於編寫和閱讀,但是,由於對並行化的排程是自動完成的,因此,相當比大多數精心手工編寫的程式碼,它們仍然能夠經常獲得效能上的提升。更重要的是,Halide程式碼非常容易修改,它使程式設計師能夠輕鬆地通過實驗去驗證自己初步的想法能否提升效能。
“你可以隨心所欲的嘗試不同的整改,並且你總會發現一些好的東西,”Adams說,“之後,當你經過深思熟慮之後,你將會發現它們為什麼好的道理。”
“使用一個領域相關的語言——像他們現在選擇去研究開發的這門語言——能夠帶來許多激動人心的事情,但是,成功的例子屈指可數,”John Owens,加州理工大學戴維斯分校的一位電氣與計算機工程助理教授如是說,“我認為這將會是一個美妙的成功故事。它具備你期望從一個完整系統上找到的所有的部件,而且它所針對的確實一個非常重要的領域。”
“我也能預計它在未來將激發一系列的工作,這專案將具有重大的影響力”Owens補充道。

相關文章