GPU程式設計模型
前言:如果想要學習CUDA程式設計,對GPU的程式設計模型的瞭解是必不可少的。就像如果想要追一個女孩子,就得去了解這個女孩子是什麼樣的性格一樣,程式設計模型就像是女孩子的性格,必須先得去摸索。然後再針對性格採用相應的手段。
概念:
1, 執行緒塊: 執行緒的概念大家應該都懂(執行緒識別符號、pc指標、暫存器、堆疊幾部分組成,但CUDA程式設計模型中的執行緒略有不同,後面會介紹)
而執行緒塊就是將眾多的執行緒進行分塊,每一塊中的執行緒個數是一樣的(就是在設計之初,將GPU的資源進行均分)。
2,多處理機: 在CPU的模型中,一個執行緒對應一個處理機, 而由於在GPU中有眾多的執行緒和眾多的處理機,所以都會將執行緒和處理機進行分塊處 理,這樣執行緒塊就會和多處理機進行對應。而多處理機就是多個處理機的集合,裡面會有一塊共享記憶體,以便於執行緒的合作。
可以看到在一個多處理機上有8個處理機,這樣就可以實現八個執行緒的同步執行, 而且由於是一個塊對應一個多處理機,而一個塊中的執行緒數是根據待解決的問題來進行設定的,比如是32個執行緒。雖然表面上這一個塊是同步執行,但實際是對這32個執行緒進行編號 0-31, 0-7、8-15、16-23...是真正意義上的同步。
而這個看似複雜的多處理機,只是GPU眾多多處理機的一個
3,全域性記憶體
在上面的介紹中已經有了兩個記憶體 一個是執行緒裡的區域性記憶體,一個是執行緒塊中的共享記憶體,接下來就是要介紹全域性記憶體。全域性記憶體是對整個GPU裝置分配的,所以很大,但速度慢。
模型:
GPU程式碼和CPU程式碼:CUDA中的程式碼都是在通過CUDA提供的介面作用於GPU,將CPU中快取的資料拷貝到GPU的全域性記憶體中,然後利用對資料進行分塊處理以實現高效的平行計算。
GPU執行緒和CPU執行緒:CUDA中的執行緒只有一些區域性記憶體和暫存器,與CPU中的執行緒比更輕