cuda編程系列-架構簡介(一)

1、cuda介紹
cuda(Compuite unified Device Architecture)是由英偉達開發的進行並行計算的平臺和編程模型。支持英偉達顯卡進行加速。其他類型的顯卡進行加速可以使用Opencl,它比cuda更復雜。
cuda編程需要C++/C基礎,使用c和C++藉助cuda提供的API進行應用程序開發,加速程序運行。(opencv裏面提供了cuda加速模塊,需要重新編譯opencv)
2、並行處理
看到一個例子介紹並行處理分享給大家,很容易理解。
假如需要在很短時間內挖一個很大的洞,會有哪些方法來實現?

  • 可以用一個普通的工具,加快挖掘速度。
  • 可以買一個更好用的鏟子。(磨刀不誤砍柴功)
  • 可以找更多的挖掘機,來進行挖掘

從這個例子裏面類比並行模式,第一種方案類似於使用更快的時鐘,第二種方案類似每個時鐘週期做更多工作的晶體管,第三種方案類似擁有許多可以並行執行任務的處理器。cuda遵循第三種方案,它不是一個可以執行復雜任務的更強大的處理器,而是有許多小而簡單的且可以並行工作的處理器。
3、gpu架構
GeForce256是英偉達於1999年開發的第一個GPU。最初只用於在顯示器上渲染高端圖形。它們只用於像素計算。後來,人們意識到如果可以做像素計算,那麼他們也可以做其他的數學計算。現在gpu除了用於渲染圖形圖像外,還可用於其他許多應用程序中。這些gpu被稱爲通用gpu(Gpgpu)。
你可能會想到的下一個問題是CPU和GPU的硬件架構有什麼不同,從而可以使得GPU能夠進行並行計算?CPU具有複雜的控制硬件和較少的數據計算硬件。複雜的控制硬件在性能上提供了CPU的靈活性和一個簡單的編程接口,但是就功耗而言,這是昂貴的。而另一方面,GPU具有簡單的控制硬件和更多的數據計算硬件,使其具有並行計算的能力。這種結構使它更節能。缺點是它有一個更嚴格的編程模型。在GPU計算的早期, Opengl和 Directx等圖形API是與GPU交互的唯一方式。對於不熟悉 OPENGL或 Directx的普通程序員來說,這是一項複雜的任務。這促成了CUDA編程架構的開發,它提供了一種與GPU交互的簡單而高效的方式。關於CUDA架構的更多細節將在下一節中給出。
一般來說,任何硬件架構的性能都是根據延遲吞吐量來度量的。延遲是完成給定任務所花費的時間,而吞吐量是在給定時間內完成任務的數量。這些概念並不矛盾。通常情況下,提高一個,另一個也會隨之提高。在某種程度上,大多數硬件架構旨在提高延遲或吞吐量。例如,假設你在郵局排隊。你的目標是在很短的時間內完成你的工作,所以你想要改進延遲,而坐在郵局窗口的員工想要在一天內看到越來越多的顧客。因此,員工的目標是提高吞吐量。在這種情況下,改進一個將導致另一個的改進,但是雙方看待這個改進的方式是不同的。
同樣,正常的串行CPU被設計爲優化延遲,而GPU被設計爲優化吞吐量。CPU被設計爲在最短時間內執行所有指令,而GPU被設計爲在給定時間內執行更多指令。GPU的這種設計理念使它們在圖像處理和計算機視覺應用中非常有用,這也是本書的目的,因爲我們不介意單個像素處理的延遲。我們想要的是在給定的時間內處理更多的像素,這可以在GPU上完成。
綜上所述,如果我們想在相同的時鐘速度和功率要求下提高計算性能,那麼並行計算就是我們所需要的。GPU通過讓許多簡單的計算單元並行工作來提供這種能力。現在,爲了與GPU交互,並利用其並行計算能力,我們需要一個由CUDA提供的簡單的並行編程架構。
4、cuda架構
CUDA架構包括幾個專門爲GPU通用計算而設計的特性,這在早期的架構中是不存在的。它包括一個 unified shedder管道,它允許GPU芯片上的所有算術邏輯單元(ALU)被個CUDA程序編組。ALU還被設計成符合IEE浮點單精度和雙精度標準,因此它可以用於通用應用程序。指令集也適合於一般用途的計算,而不是特定於像素計算。它還允許對內存的任意讀寫訪問。這些特性使 CUDA GPU架構在通用應用程序中非常有用。
所有的GPU都有許多被稱爲核心(Core)的並行處理單元,在硬件方面,這些核心被分爲流處理器和流多處理器。cuda程序作爲一系列列並行運行的多線程執行。每個線程都在不同的核心上執行。可以將GPU看作多個塊的組合,每個塊可以執行多個線程。每個塊綁定到GPU上不同流多處理器。
如何理解代碼程序在CPU上執行或者GPU執行,假如已知有一臺CPU和GPU組成的計算平臺,我們將CPU及其內存成爲主機(Host),GPU及其內存稱爲設備(Device).cuda代碼包含主機和設備的代碼。主機代碼由普通C或C++編譯器在CPU上編譯,設備代碼由GPU編譯器在GPU上編譯。主機代碼通過內核調用調用設備代碼。它將在設備上並行啓動多個線程具體流程如下:

  • 爲主機和設備顯存中的數據分配內存。
  • 將數據從主機內存複製到設備內存
  • 指定並行度來啓動內核
  • 所有線程完成後,將數據從設備現存複製回主機內存
  • 釋放主機和設備使用的所有內存

5、cuda應用的領域

  • 計算機視覺應用
  • 醫學成像
  • 金融計算
  • 電子設計自動化

6、cuda開發環境

  • 支持CUDA的GPU
  • 英偉達顯卡驅動
  • 標準的C編輯器
  • CUDA開發工具包

7、創建cuda程序的步驟

  • 安裝對應版本的vs
  • 新建工程->新建文件->Nvidia->cuda9.0->cuda9.0 runtime
  • 自定義名稱,確認
  • 將自動創建帶kernel.cu示例文件,刪除現有代碼,編寫代碼
  • 編譯運行

8、測試程序

#include<iostream>
__global__ void hellcuda(void){}
int main()
{
    hellocuda<<<1,1>>>();
    cout<<"hello cuda!"<<endl;
    return 0;
}

9、程序解讀

  • global cuda C在標準C中的添加的一個限定符,指定程序在gpu上運行
  • <<<1,1>>> 表示將cpu參數傳到gpu上,表示塊的數量和gpu上並行運行的線程數,具體含義表示hellocuda()運行在gpu上的一個塊和一個線程上。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章