1. 程式人生 > >CUDA系列學習(三)GPU設計與結構QA & coding練習

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: 

我們在中講過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程式模板來一個?

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是人眼對不同通道的敏感度不同所致)

參考資料:

udacity - cs344