香港新浪網 MySinaBlog
« 上一篇 | 下一篇 »
Apple Waves | 11th Nov 2009 | Apple, Mac | (592 Reads)

上篇講到OpenCL的好處,但是如果要讓Mac用戶的日常應用切實的體驗到這些優勢和影響,就需要程序員把OpenCL技術加入到他們的程序中去.而歷來, GPGPU的編程語音一直沒有在傳統的桌面程序中得到廣泛的應用.這當中有幾個原因.  

iphone apple 英語 macbook touch mac notebook earn money Google adsense 虛擬主機 筆記型電腦 課程

最初,針對GPU的編程需要用彙編語言,而彙編語言跟傳統用於桌面程序開發的語言的差別很大.在桌面程序的開發上,廣泛應用GUI, API等工具.即使後來出現的類似C語音的一些編程語言,保留了一些針對圖形的特性.但大部分的開發者對於這部分東西仍然感到很頭痛,像一門他們不太懂的外語一樣避而遠之. 


其次,即使使用GPU能在很大程度上提高速度,但依賴於GPU來進行通用計算還是一個問題,就是會讓程序本身的兼容性變得比較狹窄.很多老款的GPU,特別是筆記本上的,無法運行像CUDA這樣的語言. 


而蘋果在設計OpenCL的時候,有一個很關鍵的決定就是要讓OpenCL不僅能運行在GPU上,而且還要運行在CPU上.一個OpenCL程序可以自己探測硬件,把所有支持OpenCL的硬件CPU, GPU都羅列出來,如目前支持OpenCL的有兩個GPU,兩個CPU,然後程序可以自己給這些支持OpenCL的硬件發派任務. 

讓OpenCL的程序能同時運行在CPU或者GPU上的好處是顯而易見的.所有安裝了雪豹系統的Mac,不僅僅是最近的新款,都能運行含有OpenCL代碼的程序. 

事實上,某些算法運行在多核的CPU上要比運行在GPU上要快很多,即使是最快的GPU也是如此. 2009年的WWDC上, Electronic Art的一個工程師展示了一個遊戲中一部分OpenCL程序,該程序運行在一個四核的Mac Pro上的速度要比運行在NVIDIA GeForce GTX285要快四倍.但很多時候,用戶要求的只是系統能正常穩定的運行,在這種情況下,我們的目標仍然是好好的利用好CPU的資源. 

此外,用以前的方法來給Intel的CPU寫代碼依然是個很頭痛的事情,因為像一系列的指令集,如MMX, SSE2, SSE3還有SSE4需要去處理,他們都有略微的區別.很多程序員寫出來的代碼就像這樣: 

OpenCL天生支持這樣的代碼: 


OpenCL支持未聲明的並行運算,這可以很簡單的就發揮出多核CPU的優勢.好比以前,你需要先把你的數據作拆分,然後把它們分發給並行的硬件,但現在OpenCL中的代碼只要你把這塊數據一起給硬件,請求並行,剩下的就不用管了. 


這種方式在傳統的圖形編程中被認為是理所當然的.在圖形編程中,一些圖形的紋理或者多邊形的形成,其實是每個像素都在執行代碼.程序員要做的只是用一種內部循環的方式編寫代碼.一個支持類似並行運算,並且能同時運行在CPU和GPU上的API,就可以使得這兩者看起來似乎沒什麼區別. 


利用OpenCL技術寫的代碼是與時俱進的.就像OpenGL的代碼會變得越來越快,因為新的,更為強勁的GPU被不斷開發出來. OpenCL也一樣,只要CPU和GPU變的越來越快,用OpenCL寫的代碼也變得越來越快. OpenCL中有一個抽象的特別層讓這一切變得可能.就好比,幾年前使用MMX技術寫的代碼現在變得更快,因為CPU的速度變快了. 


隨著越來越強大的指令集和支持並行運算的硬件的到來,蘋果也在不斷的完善OpenCL,以便充分的利用這些硬件的性能.就像GPU製造商和操作系統的設計者在不斷的更新OpenGL的驅動,以便充分利用越來越強大的GPU.然而,程序的開發者寫代碼的方式卻不需要什麼改變.甚至很多程序都不需要重新編譯. 


到這裡,你可能會有疑問,那如果一個編譯過的代碼可以運行在SSE2指令集的CPU上,那它運行在SSE3的CPU呢?如果在NVIDIA的顯卡上可以,那在ATI的顯卡上又如何呢?要做到這一點,就必須把獨立於具體硬件的OpenCL代碼轉變成適合目標硬件的指令.運行在GPU上的時候,則要實時把代碼編譯為GPU能讀懂的指令;而運行在CPU上的時候,則要根據具體的代碼為並行運算創建和分送線程. 

你知道嗎?蘋果已經有兩項技術來解決這個現實中面臨的問題. 

這就是LLVM,蘋果在Leopard中使用了這項技術.而現在的OpenCL其實從LLVM發展而來的. LLVM為每個指令集寫一個代碼生成器並將其全部集中在一個代碼優化器中,這樣做有一個好處,它是獨立於硬件的.這可以免去了許多的重複工作,只要使用一個編譯器來生成一個靜態的可執行文件然後需要的時候實時編譯就可以了. 


還有一個就是Core Image.這是另外一個API,它可以實時的編譯代碼然後讓其在像GPUs或者多核的CPU這類並行的硬件上.在雪豹上,蘋果重寫了Core Image,使用了OpenCL技術,使得性能上有約25%的提升.