天天看點

CUDA實踐指南(二十二)

并發核心執行:

正如“計算異步和重疊傳輸”中所述,CUDA流可用于将核心執行與資料傳輸重疊。 在能夠并發執行核心的裝置上,還可以使用流同時執行多個核心,以更充分地利用裝置的多處理器。 裝置是否具有此功能由cudaDeviceProp結構的并發核心字段訓示(或在deviceQuery CUDA示例的輸出中列出)。 非預設流(流0以外的流)對于并發執行是必需的,因為使用預設流的核心調用隻有在裝置上的所有前面的調用(任何流)完成之後才開始,并且裝置上沒有任何操作 流)開始直到完成。

以下示例說明了基本技巧。 因為kernel1和kernel2在不同的非預設流中執行,是以有能力的裝置可以同時執行核心。

多個上下文:

CUDA工作發生在稱為上下文的特定GPU的程序空間内。 上下文封裝了該GPU的核心啟動和記憶體配置設定以及支援頁表等内容。 上下文在CUDA Driver API中是明确的,但在CUDA Runtime API中完全隐含,它自動建立和管理上下文。

借助CUDA驅動程式API,CUDA應用程式程序可能會為給定的GPU建立多個上下文。 如果多個CUDA應用程式程序同時通路同一GPU,則這幾乎總是暗含多個上下文,因為上下文與特定主機程序綁定,除非正在使用CUDA多程序服務。

雖然可以在給定的GPU上同時配置設定多個上下文(及其相關資源,如全局記憶體配置設定),但隻有其中一個上下文可以在該GPU上的任何給定時刻執行工作; 共享相同GPU的上下文是時間片的。 建立額外的上下文會導緻每上下文資料的記憶體開銷和上下文切換的時間開銷。 此外,當需要并行執行多個上下文時,對上下文切換的需求可以降低使用率。

是以,最好在相同的CUDA應用程式中避免每個GPU的多個上下文。 為此,CUDA Driver API提供了通路和管理每個GPU上稱為主要上下文的特殊上下文的方法。 這些是CUDA運作時隐式使用的相同上下文,當沒有線程的目前上下文時。

NVIDIA®(英偉達™)SMI可用于配置獨立處理模式的GPU,進而将每個GPU的上下文數量限制為一個。 在建立過程中,此上下文可以是任意多個線程,如果在裝置上已經存在使用CUDA驅動程式API建立的非主要上下文,cuDevicePrimaryCtxRetain将會失敗。

隐藏寄存器依賴關系:

中等優先級:為了隐藏由寄存器依賴性引起的延遲,為每個多處理器維護足夠數量的活動線程(即足夠的占用率)。

當指令使用存儲在指令寫入的寄存器中的結果之前,會産生寄存器相關性。 目前支援CUDA的GPU的延遲時間大約為24個周期,是以線程在使用算術結果之前必須等待24個周期。 但是,這種延遲可以通過執行其他warp中的線程完全隐藏。