1. 程式人生 > >【平行計算-CUDA開發】OpenACC與OpenHMPP

【平行計算-CUDA開發】OpenACC與OpenHMPP

在西雅圖超級計算大會(SC11)上釋出了新的基於指令的加速器並行程式設計標準,既OpenACC這個開發標準的目的是讓更多的程式設計人員可以用到GPU計算,同時計算結果可以跨加速器使用,甚至能用在多核CPU上
出於顯而易見的原因,NVIDIA在大力推廣和支援OpenACC。但事實上PGI和Cray才是最早推動這項技術商業化的公司。PGI已經推出了一組非常類似的加速器指令,目前也成為了OpenACC標準的基礎部分之一。Cray公司正在開發自己的OpenACC編譯器,並且他的XK6客戶如橡樹嶺國家實驗室和瑞士國家超級計算機中心,預計將成為該技術的第一批超級計算機使用者。
簡而言之,OpenACC指令與OpenMP指令工作方式很類似,但前者特別適用於高度資料並行程式碼。它們可插入標準的C,C + +和Fortran程式直接指導編譯器進行某些程式碼段的並行。編譯器會特別注意資料在CPU和GPU(或其他)之間來回轉移的邏輯關係,並將計算對映到適當的處理器上。


這樣,開發人員就可以在現存的或者新的程式碼上做相對小的改動以標示出加速並行區域。由於指令設計適用於一個通用並行處理器,這樣相同的程式碼可以執行在多核CPU、GPU或任何編譯器支援的其他型別的並行硬體上。這種硬體的獨立性對於HPC的使用者來說特別重要,因為他們不願意接受那種受供應商限制的,非行動式程式設計環境。
站在NVIDIA的角度,目標就是將GPU計算帶入後CUDA時代。今天,CUDA C和CUDA Fortran廣泛用於GPU程式設計。但是這個底層技術屬於NVIDIA,對於GPU計算提供了一個相對低階的軟體模型,因此想較於對一般程式設計人員或者研究人員,CUDA的使用對於計算科學型別而言受限制程度越來越明顯
。 

受NVIDIA、AMD等支援的OpenCL同樣也提供了GPU和其他加速器的並行程式設計框架。與CUDA不一樣的是,OpenCL是個真正開放的標準。 但與CUDA相似的是,OpenCL相對底層,需要對目標處理器的內部結構有一定了解。因此與CUDA一樣,使用OpenCL對於電腦科學家來說有很大的侷限性。  
NVIDIA公司估計這個星球上有超過10萬的CUDA程式設計師和比較多的的OpenCL開發人員,但他們也意識到如果能夠使GPU程式設計更加開放且開發介面更加友好,就會有一個更大的潛在觀眾。從本質上講,他們認為OpenACC將能夠被數以百萬計的科學家和研究人員使用,這些人不需要關心和涉足處理器架構,也不需要關心晶片與晶片之間通訊

NVIDIA的Tesla業務部門的首席技術官Steve Scott總結了OpenACC目標:“我們確實想在這一點上做到大幅提高適用性和人們利用GPU的廣度和深度。”
Scott表示作為高層OpenACC不會影響執行效能。這來自於他以前在Cray公司做首席技術官的經驗,他遇到了基於加速器的指令程式碼只比手工CUDA編碼的效能低5%到10%而已。據他介紹,這是相當典型的。Scott說,有些應用程式甚至做的比他們用CUDA程式設計要好,這受益於編譯器在對某些程式碼進行優化的能力超越了凡人。在任何情況下,OpenACC的目的是要利用CUDA進行互操作,因此如果需要的話,可以手工調整核心,並與指令程式碼做無縫連線。
除了PGI和Cray公司,法國的多核軟體工具的開發者CAPS公司,也簽署了協議支援新的指令。這三家廠商預計在2012年上半年推出支援OpenACC的編譯器。值得注意的是OpenACC支持者列表中缺少了英特爾和AMD,不過這也不會阻止PGI、CAPS或者Cray建立支援英特爾和AMD硬體的OpenACC編譯器。
PGI和NVIDIA目前向開發人員推出了30天免費試用PGI的加速指令編譯器。活動宣傳說可以在四周之內將應用效能翻倍。上百位研究人員已經註冊了申請試用,
不過對於OpenACC的支持者來說真正終結這場遊戲的是將指令納入到OpenMP標準。因為OpenACC的一部分工作來源於OpenMP,所以就意味著這件事情發生的可能性很高,不過目前沒有時間表,但最有可能結合的時間是在2012年某時OpenMP 4.0釋出的時候。

1,OpenHMPP和OpenACC是由兩個不同的組織發起的。

2,OpenHMPP比OpenACC發展的要成熟。

3,OpenHMPP可以支援多個加速裝置,而OpenACC沒有這樣的指導語句來支援這一點

4,OpenHMPP可以通過某些指導語句來使用想cuFFT一樣的庫

5,OpenHMPP可以使用更多的硬體細節,例如共享儲存器等

目前除了CAPS的編譯器之外,沒有其它廠商提供支援幾乎所有硬體廠商的加速器裝置的公司。從市場的角度講,OpenACC標準始於Nvidia GPU的支援,OpenHMPP始於對所有加速裝置的支援。

目前世界上幾家企業正在籌謀如何改善現有的OpenACC標準,以將其完善。雖然OpenACC始於Nvidia,但就像OpenCL始於蘋果一樣,它的最後歸屬也許是別人!

國內對OpenACC以及OpenHMPP這種基於指導語句的異構程式設計方式還在起步階段,慢慢會好起來的。。。。。

引言:

    什麼是基於指令的移植方式呢?首先我這裡說的移植可以理解為把原先在CPU上跑的程式放到像GPU一樣的協處理器上跑的這個過程。在英文裡可以叫Porting。移植有兩種方式:一種是使用CUDA或者OpenCL來重新設計程式碼,然後使用硬體廠商提供的編譯器來編譯;一種是使用OpenACC或者OpenHMPP提供的指令集新增到你想使用GPU計算的原始碼中的某個位置,讓編譯器來編譯出GPU上執行的程式碼。後一種方式就是基於指令的移植方式。   

     例如,下面一個簡單的迴圈:

  1. for (i=0; i<n;i++)  
  2. {  
  3.     dosomething(i);  
  4. }  

如果你想把這個迴圈放到GPU上,讓每個執行緒計算一次i的話,可以這樣做:

#pragma acc kernels

  1. for (i=0; i<n;i++)  
  2. {  
  3.     dosomething(i);  
  4. }  


網格化(gridification):
    這樣,編譯器拿到加了OpenACC指令的那段程式碼後,就會把你的迴圈放到GPU或者其他硬體加速器(例如MIC)上。編譯器分析了#pragma acc kernels下面的那個迴圈,就會根據迴圈的次數來分配執行緒數量,這個過程就叫網格化。為什麼說是網格化呢?可以這樣理解,因為GPU可以啟動很多執行緒,這些執行緒就像一張漁網一樣,可以認為一個網格代表一個執行緒,所以我就乾脆叫這個過程為“網格化”了。

 核心(kernel)

    在OpenACC裡可以這樣理解核心:核心就是在協處理器(例如GPU)上被多個執行緒同時執行的一段程式碼。如果每個執行緒都做一個活,豈不是沒意思了麼?當然不是這樣的,他們執行的程式碼是一樣的,但是每個執行緒可以根據自己的ID號來針對不同的資料做同樣的工作,這也就是資料並行的含義。

codelet

    使用CAPS的HMPP Workbench編譯加了OpenACC指導語句的原始碼時,編譯器會告訴你codelet產生了。實際上產生了一個CUDA或者OpenCL的原始檔,這個原始檔中包含了根據你的指導語句生成的CUDA或者OpenCL的原始碼。那什麼是codelet呢?可以認為codelet就是資料管理+核心。一個codelet要乾的事情包括兩部分:申請和管理CPU和協處理器之間的儲存,還有就是啟動在協處理上執行的程式碼。

work-sharing

    這個詞可以理解為名詞“共享工作”。如果在協處理器上的執行緒們執行的工作時work-sharing的,那麼每個執行緒可以根據自己的ID在不同的資料上幹了相似的工作。這個詞是在使用OpenACC或者OpenHMPP移植程式碼的時候遇到的,它描述的是CPU的序列程式碼中的狀態,例如:

  1. for (i=0; i<n; i++)  
  2. {  
  3.     a[i] = i;  
  4. }  


在這段程式碼中,a[i]的計算與a[i]之外的a的元素沒有依賴性,所以,每次迴圈的i可以使獨立的完成的,像這樣的狀態就是work-sharing的。還有例如規約,

  1. s = 0;  
  2. for (i=0; i<n; i++)  
  3. {  
  4.    s+=a[i];  
  5. }  

 雖然s的計算與i相關,但是細想一下,加法在數學上市滿足交換律的,s的每次加a[i]實際上不相關的,你不管以什麼順序加和a[i]到s,解結果總是一樣的。所以規約也可以理解為是worksharing 的。


相關推薦

平行計算-CUDA開發OpenACCOpenHMPP

在西雅圖超級計算大會(SC11)上釋出了新的基於指令的加速器並行程式設計標準,既OpenACC。這個開發標準的目的是讓更多的程式設計人員可以用到GPU計算,同時計算結果可以跨加速器使用,甚至能用在多核CPU上。出於顯而易見的原因,NVIDIA在大力推廣和支援OpenACC。

平行計算-CUDA開發CUDA軟體架構Nvidia硬體對應關係

硬體基本架構 實際上在nVidia的GPU裡,最基本的處理單元是所謂的SP(Streaming Processor),而一顆nVidia的GPU裡,會有非常多的SP可以同時做計算;而數個SP會在附加一些其他單元,一起組成一個SM(Streaming Multiprocessor)。幾個SM則會在組成所

平行計算-CUDA開發淺談GPU平行計算新趨勢

 隨著GPU的可程式設計性不斷增強,GPU的應用能力已經遠遠超出了圖形渲染任務,利用GPU完成通用計算的研究逐漸活躍起來,將GPU用於圖形渲染以外領域的計算成為GPGPU(General Purpose computing on graphics proces

平行計算-CUDA開發FPGA 設計者應該學習 OpenCL及愛上OpenCL的十個理由

作為OpenCL CodeBench的開發者,Amdahl軟體公司始終堅信OpenCL能夠帶來巨大的利益,也從未懷疑過OpenCL標準的成功性。現在人們對計算效能的要求越來越高,在不超過發熱量和功耗的限制範圍,我們相信多核和多核系統提供了一個可行的解決方法。對於OpenCL使用者來說,OpenCL標準的優

平行計算-CUDA開發從零開始學習OpenCL開發(一)架構

本文將作為我《從零開始做OpenCL開發》系列文章的第一篇。 1 異構計算、GPGPU與OpenCL   OpenCL是當前一個通用的由很多公司和組織共同發起的多CPU\GPU\其他晶片 異構計算(heterogeneous)的標準,它是跨平臺的。旨在充分利用G

平行計算-CUDA開發GPGPU OpenCL/CUDA 高效能程式設計的10大注意事項

1.展開迴圈 如果提前知道了迴圈的次數,可以進行迴圈展開,這樣省去了迴圈條件的比較次數。但是同時也不能使得kernel程式碼太大。   迴圈展開程式碼例子: 1 #include<iostream> 2 using namespace std; 3 4 int main(){

平行計算-CUDA開發:淺談GPU平行計算新趨勢

前幾天偶然之間與同事談論到ROM,RAM,FLASH一些知識,而突然之間當我們去說這些英文單詞的

計算機視覺平行計算CUDA開發GPU硬解碼---CUVID

問題描述:專案中,需要對高清監控視訊分析處理,經測試,其解碼過程所佔CPU資源較多,導致整個系統處理效率不高,解碼成為系統的瓶頸。 解決思路: 利用GPU解碼高清視訊,降低解碼所佔用CPU資源,加速解碼過程。 一、OpenCV中的硬解碼 OpenCV2.4.6中,

Windows 10 應用開發使用x:Bind標記動態獲得計算結果

ash 進行 reg tps 屬性綁定 使用 例子 應用 處理 UWP 在傳統(WPF)的Binding標記上引入了 Bind 標記,Bind 基於編譯階段生成,因而具有較高的性能。但是,你得註意,這個性能上的優化是免去了運行階段動態綁定的開銷,這是不包括數據源的體積的。要

Win 10 應用開發UI Composition 劄記(三): XAML 集成

單獨使用 切換 column gif 頂部 tel border 靜態 ons 除了 DirectX 遊戲開發,我們一般很少單獨使用 UI Composition ,因此,與 XAML 互動並集成是必然結果。這樣能夠把兩者的優勢混合使用,讓UI布局能夠更靈活。 說到與 X

Unity3D遊戲開發materialsharedMaterial的區別 (三八)

如果你需要修改模型材質的顏色,或者是修改材質Shader的一些屬性, 通常情況是用獲取模型的Renderer元件,然後獲取它的material屬性。 舉個簡單的例子,修改顏色或者直接更換shader material.color = Color.red; material.shader = Resources

Android開發Toolbar返回按鈕

在toolbar上面的返回按鈕有兩個可能的功能: 結束當前fragment 結束當前activity 但無論是哪個,都需要設定這個按鈕的圖示並給這個按鈕一個監聽器: Toolbar toolb

平行計算字首和並行思路

一.定義 如果給定一個數列a[n],令S[k] = a[0]+a[1]+…+a[k],(k = 0, 1, 2…n-1),數列S[k]即為數列a[n]的字首和。 二.序列演算法 很容易就能想到序列的演算法: S[0] = a[0]; for (int i

平行計算用MPI進行分散式記憶體程式設計(二)

 通過上一篇中,知道了基本的MPI編寫並行程式,最後的例子中,讓使用0號程序做全域性的求和的所有工作,而其他的程序卻都不工作,這種方式也許是某種特定情況下的方案,但明顯不是最好的方案。舉個例子,如果我們讓偶數號的程序負責收集求和的工作,情況會怎麼樣?如下圖:  

ARM-Linux開發CUDA開發視訊開發關於Linux下利用GPU對視訊進行硬體加速轉碼的方案

最近一直在研究Linux下利用GPU進行硬體加速轉碼的方案,折騰了很久,至今沒有找到比較理想的硬加速轉碼方案。似乎網上討論這一方案的文章也特別少,這個過程中也進行了各種嘗試,遇到很多具體問題,以下便對之前所作的一些工作做一些總結和分享,省的時間長了自己也忘記了,也希望後來

iOS開發H5Native互動之JSBridge技術

做過混合開發的很多人都知道Ionic和PhoneGap之類的框架,這些框架在web基礎上包了一層Native,然後通過Bridge技術使得js可以呼叫視訊、位置、音訊等功能。本文就是介紹這層Bridge的互動原理,通過閱讀本文你可以瞭解到js與ios及andro

Android開發Toolbar標題居中

在toolbar的xml佈局部分加一個textview並居中即可(記得不要給toolbar設定標題!) 具體程式碼: <android.support.v7.widget.Toolbar&

微信小程式開發IOS安卓樣式相容問題

1.margin在IOS中失效 在頁面中元素使用margin值,在某些IOS裝置下會出現失效的情況,而安卓機則正常顯示,此問題暫無直接的解決方案,當前使用空DIV控制間距。 2.fixed定位問題 整個頁面的fixed定位,在ios下下拉會觸發下拉事件,但

平行計算Bitonic Sort(雙調排序)基礎

雙調序列 雙調序列(Bitonic Sequence)是指由一個非嚴格增序列X和非嚴格減序列Y構成的序列,比如序列(23,10,8,3,5,7,11,78)。 定義:一個序列a1,a2,…,an是雙調序列(Bitonic Sequence),如果: (1)

CUDA開發Thrust庫

Thrust庫從C++的STL中得到靈感,將最簡單的類似於STL的結構放在Thrust庫中,比如STL中的vector。此外,Thrust庫還包含STL中的演算法和迭代器。         Thrust函式庫提供了兩個向量容器,分別為主機和裝置提供了向量類並且分別駐留在