CUDA編程介面(二)------一十八般武器------GPU的革命

來源:互聯網
上載者:User

4. 程式運行控制:像Stream,Event,Context, Module, Execution control這樣的咱都把歸類到運行管理的。這裡也得分清楚有Runtime層級的,也有Driver層級的。Stream:如果瞭解AGP時代的顯卡,就知道在Device和Host之間進行資料交換的時候有作為中轉資料的部分,叫著stream;發展到G8X以後就有了新的專門針對GPGPU統一設計的方便資料轉送的Stream out的硬體裝置。

這個層的功能是將Vertex Shader和Pixel Shader(在G8X的設計中已經差不多不用把他們倆再分開,差不多統一起來)處理完成的資料輸出給使用者,由使用者進行處理後再反饋給流水線繼續處理。它可以直接讀寫本地顯存。如果是記憶體對齊的,速度會更快,這個部分可以參考simpleStream的代碼。Event:和平時的大家在編程中使用的Event一個道理,都是起到通知的作用,建立一個事件,然後同步;Event在多線程編程中會經常遇到。Context:上下文,什麼叫叫上下文- -!(中文翻譯叫上下文,實在的,俺覺得這個翻譯不恰當,但是很多傳統的書都這麼翻譯了,咱們也只能叫上下文)這裡的Context和CPU裡面使用的Context差不多,都是一個process裡面需要用到的一些“資源”(系統資源:堆棧,記憶體……等等)。我倒覺得翻譯為process包含的東東更為恰當。Module:可以理解為linux裡面的module意思;如果你不瞭解linux也不用擔心,module就是一個個的專門針對Device的程式。知道很久很久以前的dos時代就有的.com檔案嗎?那個東東就像直接在CPU上可以調用的一個檔案,載入到記憶體中就可以啟動並執行。

這裡的module就是載入到Device上就可以運行。Execution control:這個就是從驅動層面來控制線程怎麼在Device上運行。Stream和Event在Runtime API和Driver API中都有,函數介面也差不多。Context, Module, Execution control就只有在Driver API層面才有。上面的這些都沒多少痛點,其實API的講解,一般都沒多少痛點,痛點在於怎麼能靈活的運用API,那就得通過多次的練習,多用API實踐;其實有的時候也能發現API的不足,才會產生新的API。這裡就不放具體的代碼,代碼可以參考編程手冊上面。

5. 好了,這裡就剩下OpenGL和Direct3D的介面函數了,他也有兩個層次的API,有Runtime層次的,也有Driver層次的。Runtime和Driver層面都有調用的API,CUDA2.0在這裡也做了一些最佳化,在記憶體交換方面。具體代碼參考編程手冊。前面說過要講解函數的定義,其實在以前的文章裡面正好已經翻譯過一段,不過現在要講解,也就提出來,專門再把那些東西翻出來:GPU NVIDIA_CUDA_Programming_Cuide_1.0 Chapter 4. Application Programming Interface

4.2.1 Function Type Qualifiers 函數類型

4.2.1.1 __device__

__device__ 規定的函數:

在device上執行。

只能在device上調用。

4.2.1.2 __global__

__global__ 定義了一個kernel函數:

在device上運行。

只能在host上調用

4.2.1.3 __host__

__host__定義的函數:

在host上運行,

只能在host上調用。

沒有定義__host__,__device__或者__global__的函數等同於__host__函數,系統都會把函數編譯成host函數。

另外,__host__定義可以和__device__定義一起使用,編譯器會把這個函數編譯為host和device通用的函數。

4.2.1.4 Restrictions (強調,限制)

__device__函數通常是inline,所以如果需要不inline 就需要加上uninline

__device__和__global__函數都不支援遞迴調用。

__device__和__global__函數都不能定義static變數在函數內部。

__device__和__global__函數不能使用可變參數。

__device__函數沒有函數地址,也沒有指向它的函數指標,但是__global__函數有。

__global__定義和__host__定義不能一起使用。

__global__函數必須是void傳回型別。

任何調用__global__的函數都必須指明回合組態。(Section 4.2.3)也就是線程kernel的調用方法。

__global__函數是非同步呼叫的。在運行結束前就會返回。

__global__函數的參數通常是通過shared memory調用到Device中,最多是265bytes。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。