天天看點

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

本節書摘來自華章計算機《cuda c程式設計權威指南》一書中的第1章,第1.3節,作者 [美] 馬克斯·格羅斯曼(max grossman),譯 顔成鋼 殷建 李亮,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

學習一個新程式設計語言的最好方法就是使用這種新語言來編寫程式。在本節,你将開始編寫在gpu上運作的第一個核心代碼。像其他任何程式設計語言一樣編寫gpu上的第一個程式是輸出字元串“hello world”。

如果這是你第一次使用cuda,在linux系統中,你可能想使用以下指令來檢查cuda編譯器是否正确安裝:

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

通常的結果可能是:

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

你還需要檢查你的機器上是否安裝了gpu加速卡。對此你可以在linux系統上使用以下指令:

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

通常的結果是:

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

在這個例子中,你安裝了兩個gpu卡(不同的使用者配置可能有所不同,是以顯示結果會有所差異)。現在你要準備好寫你的第一個cuda c程式。寫一個cuda c程式,你需要以下幾個步驟:

1.用專用擴充名.cu來建立一個源檔案。

2.使用cuda nvcc編譯器來編譯程式。

3.從指令行運作可執行檔案,這個檔案有可在gpu上運作的核心代碼。

首先,我們編寫一個c語言程式來輸出“hello world”,如下所示:

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

把代碼儲存到hello.cu中,然後使用nvcc編譯器來編譯。cuda nvcc編譯器和gcc編譯器及其他編譯器有相似的語義。

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

如果你運作可執行檔案hello,将會輸出:

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

接下來,編寫一個核心函數,命名為hellofromgpu,用它來輸出字元串“hello world from gpu!”。

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

修飾符__global__告訴編譯器這個函數将會從cpu中調用,然後在gpu上執行。用下面的代碼啟動核心函數。

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

三重尖括号意味着從主線程到裝置端代碼的調用。一個核心函數通過一組線程來執行,所有線程執行相同的代碼。三重尖括号裡面的參數是執行配置,用來說明使用多少線程來執行核心函數。在這個例子中,有10個gpu線程被調用。綜上所述,得到代碼清單1-1所示的程式。

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

函數cudadevicerest()用來顯式地釋放和清空目前程序中與目前裝置有關的所有資源。如下所示,在nvcc指令行中使用-arch sm_20進行編譯:

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

開關語句-arch sm_20使編譯器為fermi架構生成裝置代碼。運作這個可執行檔案,它将輸出10條字元串“hello world from gpu”,每個線程輸出1條。

《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World
《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World
《CUDA C程式設計權威指南》——1.3 用GPU輸出Hello World

繼續閱讀