接上篇文章繼續寫。
1、二進位制相容性
二進位制**是裝置相關的,使用nvcc編譯器編譯時,若指定-code選項,則會編譯產生目標裝置的二進位制cubin物件。例如,編譯時使用-code=sm_13會產生適用於計算能力1.3的二進位制**。二進位制**在cuda計算裝置上具有小版本的向前相容性,但是在大版本上不具備相容性。也就是說,對於計算能力x.y的硬體,使用-code=sm_xy編譯後,程式能夠執行於計算能力x.z(其中z>=y)的硬體上,但不能執行在計算能力m.n(m!=x)的硬體上。
2、ptx**相容性
不同計算能力的裝置所支援的ptx指令條數是不同的,一些ptx指令只在擁有較高計算能力的裝置上被支援。例如,全域性記憶體(global memory)的原子操作指令只能用於計算能力不小於1.1的裝置;雙精度浮點運算指令只能用於計算能力不小於1.3的裝置。在將c語言編譯為ptx**時,nvcc使用-arch編譯選項指定ptx**目標裝置的計算能力。因此,要想使用雙精度運算,編譯時必須使用選項-arch=sm_13(或使用更高的計算能力),否則nvcc會自動將雙精度操作降級為單精度操作。
為某一特定裝置產生的ptx**,在執行時總是能夠被具有更高計算能力的裝置jit編譯為可執行的二進位制**。
3、應用程式相容性
執行cuda程式有兩種方式,一種是直接載入編譯好的cuda二進位制**執行,另一種是首先引導程式中的ptx**,再執行jit編譯得到二進位制的裝置可執行檔案,然後執行。特別需要注意的是,為了讓程式執行具有更高計算能力的未來裝置上,必須讓程式載入ptx**。
事實上,在乙個cuda c程式中可以嵌入不止乙個版本的ptx/二進位制**。那麼,具體執行時哪乙個版本的ptx或者二進位制**會得到執行呢?答案是:最相容的那個版本。例如編譯乙個名為x.cu的cuda源**:
將會產生相容計算能力1.1硬體的二進位制**(第一排的-gencode選項)以及相容計算能力1.1裝置的ptx和二進位制**,這些**都將會嵌入到編譯後的目標檔案中。
主機端將會產生一些額外的**,在程式執行時,這些**會自動決定裝載哪乙個版本的**來執行。對於上面的例子:
同時,x.cu還可以在程式中使用一些特殊的巨集來改變不同裝置的**執行路徑。例如,對於計算能力1.1的裝置而言,巨集__cuda_arch__等於110,在程式中可以對該巨集的值進行判斷,然後分支執行程式。
nvcc使用者手冊列出了很多-arch,-code和-gencode等編譯選項的簡化書寫形式。例如,-arch=sm_13就是-arch=compute_13 -code=compute13, sm_13的簡化形式。更多詳盡的內容請參閱該手冊。
4、c/c++相容性
nvcc編譯器前端使用c++語法啊規則來處理cuda原始檔。在主機端,cuda支援完整的c++語法;而在裝置端,只有部分c++語法是被支援的。這方面更為詳盡的討論請參見《cuda c程式設計指南》的c/c++語言支援章節。
5、64位相容性
64位版本的nvcc編譯器將裝置**編譯為64位模式,即指標是64位的。執行64位裝置**的先決條件是主機端**必須也使用64位模式進行編譯。同樣,32位版本的nvcc將裝置**編譯為32位模式,這些**也必須與相應的32位主機端**相配合方能執行。
32位nvcc編譯器可以使用-m64編譯選項將裝置**編譯為64位模式。同時64位nvcc編譯器也可使用-m32編譯選項將裝置**編譯為32位模式。
CUDA程式設計指南閱讀筆記(六)
接上文。共享記憶體是cuda裝置中非常重要的乙個儲存區域,有效地使用共享記憶體可以充分利用cuda裝置的潛能,極大提公升程式效能。那麼,共享記憶體有哪些特點呢?1 共享記憶體 shared memory 是整合在gpu處理器晶元上的 on chip 因此相比於存在於視訊記憶體顆粒中的全域性記憶體 g...
CUDA程式設計指南閱讀筆記(六)
接上文。共享記憶體是cuda裝置中非常重要的乙個儲存區域,有效地使用共享記憶體可以充分利用cuda裝置的潛能,極大提公升程式效能。那麼,共享記憶體有哪些特點呢?1 共享記憶體 shared memory 是整合在gpu處理器晶元上的 on chip 因此相比於存在於視訊記憶體顆粒中的全域性記憶體 g...
cuda程式設計 CUDA程式設計入門(四)並行歸約演算法
這一篇我們一起學習一下如何使用cuda實現並行歸約演算法。首先我們要知道什麼是並行歸約。並行歸約 reduction 是一種很基礎的並行演算法,簡單來說,我們有n個輸入資料,使用乙個符合結合律的二元操作符作用其上,最終生成1個結果。這個二元操作符可以是求和 取最大 取最小 平方 邏輯與或等等。我們以...