CUDA系列學習(三)GPU設計與結構QA & coding練習

啥?你把CUDA系列學習(一)(二)都看完了還不知道為什麼要用GPU提速? 是啊。。經微博上的反饋我默默感覺到提出這樣問題的小夥伴不在少數,但是更多小夥伴應該是看了(一)就感覺離自己太遠所以趕緊撤粉跑掉了。。。都怪我沒有寫CUDA系列學習(零)。。。那麼,這一章就補上這一塊,通過一堆Q&A進行講解,並輔助coding練習,希望大家感覺貼近CUDA是這麼容易~~


請注意各個Q&A之間有順序關係,輕依次閱讀~ 否則不容易懂喔~



Q:現在硬件層面通常通過什麼樣的方法加速?
A:
 - More processors
 - Speed up clock frequency
 - More memory

圖1. Period - transistors(晶體管) size

途徑:將晶體管做得更快更小,功耗更少,那麼每塊芯片上就可以放更多transistor
宏觀上看,一個處理器上能同時處理的數據就越多。






Q:參考圖2,爲加速3大常見方法之一,提高clock frequency, 可見到後面clock speed就做不上去了。這是爲什麼呢?

圖2. Period - Clock frequency

A:是晶體管不能做得更快更小了麼?錯!

 - 關鍵問題在散熱!即便晶體管越做越小也難以散熱。所以,現在我們應該着眼於build更多小而低功耗(power-efficient)的processor來提速。





Q:CPU和GPU在設計上的區別?
A:
CPU: COMPLEX CONTROL HARDWARE
 - flexible in performance :)
 - expensive in terms of power :(

GPU: SIMPLE CONTROL HARDWARE
 - more hardware for computation :)
 - more power efficient :)
 - more restrictive programming model :(
所以剛纔說到的,目前想要設計更多power-efficient的處理器就是GPU的中心思想CPU更重視優化 (minimize) latency而GPU更重視優化 (maximize) throughput



Q:什麼是latency,什麼是throughput?
A:
比如,要駕車行駛5000km從A到B。
方法1:
  by taxi,200km/h,可承載2人:latency = 25h,throughput = 2/25 person/h
方法2:
  by bus, 50km/h, 可以承載10人:latency=100h,throughput = 10/100 person/h
所以CPU更喜歡taxi,因爲一次過來速度快,GPU更喜歡bus,因爲吞吐量大。



Q:CUDA是啥?CUDA programming軟件層面的結構?

A:






Q:CUDA編程注意什麼?

A: 注意GPU擅長什麼!

 - efficiency launching lots of threads

 - running lots of threads in parallel



Q: kernel聲明時對參數有沒有限制?

A: 

我們在CUDA系列學習(一)An Introduction to GPU and CUDA 中講過kernel的聲明:kernel<<<grid of blocks, block of threads>>> ,其限制是:maximum number of threads per block: 1024 for new, 512 for old。比如說,我希望2048個線程並行,不能直接申請kernel<<<1,2048>>>,而應該分開<<<a,b>>>,使a*b=2048 且a<=1024 && b<=1024.



Q: 具體講一下kernel的general聲明,參數意義與格式?

A: general表示:kernel<<<grid of blocks, block of threads, shmem>>>
shmem:shared memory per block in bytes

     用G表示grid of blocks
     用B表示block of threads
     事實上,dim(x,y,z)中每一維默認都爲1,所以:dim3(w,1,1)==dim3(w)==int w,即這三種表示是等效的





Q:CUDA程序中能夠調用的常用 built-in variables都有哪些?
A:threadIdx, blockDim, blockIdx, gridDim




Q: CUDA程序模板來一個?

A: 說是模板,只是一個簡單例子的大概套路,大家也可以參考CUDA系列學習(二)CUDA memory & variablesdifferent memory and variable types,如下:

1. 聲明host變量,申請分配空間,並初始化

2. 聲明device變量,申請分配空間

3. cudamemcpy將賦值了的host變量賦給device變量

4. 調用cuda kernel,並行跑線程

5. device返回結果傳給host

6. 釋放device變量memory





========================================



Exercise1

input: float array [0, 1, 2, ... 63]

output: float array [0^2, 1^2, 2^2, ... 63^2]


Exercise2:

輸入一張彩色圖,轉灰度圖。

提示:
in CUDA, each pixel is represented in struct uchar4:
unsigned char r,b,g,w;//w: alpha channel, represent the transparent information
灰度轉換公式:I = .299*r+.587*g+.114b(給rbg設置不同weight是人眼對不同通道的敏感度不同所致)



具體實現請參考 CUDA系列學習(二)CUDA memory & variablesdifferent memory and variable types,歡迎小夥伴們把exercise code和運行時間貼上來回復,最好和cpu版本有所比較~



參考資料:

udacity - cs344




發佈了475 篇原創文章 · 獲贊 670 · 訪問量 1000萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章