CUDA系列學習(三)GPU設計與結構QA & coding練習
啥?你把CUDA系列學習(一),(二)都看完了還不知道為什麼要用GPU提速? 是啊。。經微博上的反饋我默默感覺到提出這樣問題的小夥伴不在少數,但是更多小夥伴應該是看了(一)就感覺離自己太遠所以趕緊撤粉跑掉了。。。都怪我沒有寫CUDA系列學習(零)。。。那麼,這一章就補上這一塊,通過一堆Q&A進行講解,並輔助coding練習,希望大家感覺貼近CUDA是這麼容易~~
請注意各個Q&A之間有順序關係,輕依次閱讀~ 否則不容易懂喔~
Q:現在硬體層面通常通過什麼樣的方法加速?
A:
- More processors
- Speed up clock frequency
- More memory
途徑:將電晶體做得更快更小,功耗更少,那麼每塊晶片上就可以放更多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