天天看點

CUDA學習(五十九)

執行環境和記憶體模型:

執行環境:

CUDA執行模型基于線程,線程塊和網格的原語,核心函數定義由線程塊和網格中的各個線程執行的程式。 當調用核心函數時,網格的屬性由執行配置來描述,該配置在CUDA中具有特殊的文法。 對CUDA中的動态并行性的支援擴充了在新網格上配置,啟動和同步裝置上運作的線程的能力。

父子網格:

配置和啟動新網格的裝置線程屬于父網格,并且由調用建立的網格是子網格。

子網格的調用和完成是正确嵌套的,這意味着直到由其線程建立的所有子網格完成之後,才認為父網格完整。 即使調用線程沒有在啟動的子網格上顯式同步,運作時也會保證父級和子級之間的隐式同步。

CUDA學習(五十九)

CUDA原語的範圍:

在主機和裝置上,CUDA運作時提供了一個API用于啟動核心,等待啟動的工作完成以及跟蹤通過流和事件啟動的依賴關系。 在主機系統上,啟動狀态和引用流和事件的CUDA原語被程序内的所有線程共享; 但是程序獨立執行并且可能不共享CUDA對象。

裝置上存在類似的層次結構:啟動的核心和CUDA對象對于線程塊中的所有線程均可見,但線上程塊之間是獨立的。 這意味着例如一個流可以由一個線程建立并由同一線程塊中的任何其他線程使用,但不能與任何其他線程塊中的線程共享。

同步:

來自任何線程的CUDA運作時操作(包括核心啟動)線上程塊中都可見。 這意味着父網格中的調用線程可以在該線程啟動的網格,線程塊中的其他線程或同一線程塊内建立的流上執行同步。 隻有在塊中所有線程的所有啟動都完成之後才執行線程塊。 如果一個塊中的所有線程在所有子啟動完成之前退出,則會自動觸發同步操作。

流和事件:

CUDA流和事件允許控制網格啟動之間的依賴關系:啟動到同一個流中的網格按順序執行,事件可用于建立流之間的依賴關系。 在裝置上建立的流和事件可以達到完全相同的目的。

在網格内建立的流和事件存在于線程塊範圍内,但在建立它們的線程塊之外使用時具有未定義的行為。 如上所述,線程塊啟動的所有工作在塊退出時隐含地同步; 這項工作包括釋出到流中的工作,所有依賴關系都得到适當解決。 線上程塊範圍之外修改的流上的操作行為未定義。

當在任何核心中使用時,在主機上建立的流和事件都具有未定義的行為,就像由父網格建立的流和事件在子網格内使用時具有未定義的行為一樣。

CUDA學習(五十九)

繼續閱讀