- 一個區塊與一個執行緒 -- 640M clock cycles (約0.43秒)
- 一個區塊與 256 個執行緒 -- 8.3M clock cycles (約 0.0055 秒)
- 同上,但改變執行緒讀取資料的方式 -- 2.6M clock cycles (約 0.0017 秒)
- 32 個區塊與 256 個執行緒 -- 150K clock cycles (約 0.0001 秒)
- 同上,但個別區塊先利用 shared memory 做加總 -- 164K clock cycles (約 0.00011 秒)
- 同上,但改變在 shared memory 的加總方式 -- 136K~140K clock cycles (約 0.00009 秒)
我手邊拿到的筆電,顯示卡為「GeForce 9700M GTS」,搭配的驅動程式版本是 177.19,但是,官網針對 Windows Vista 32 bits 提供的 CUDA 版本至少是 2.0(驅動程式版本為 178.08),幸好可以安裝,不過安裝 CUDA 2.3 失敗啦!而顯示卡資訊如下圖:(雖然安裝 2.0 版,不過顯示結果只支援到 1.1 版)
矩陣乘法之時間比較:(單位:秒)
CPU GPU
500x500 0.188 0.109
1000x1000 6.131 0.202
3000x3000 200.819 5.241
5000x5000 1222.182 12.480
如果你的筆記型電腦或者桌機的顯示卡不支援CUDA,那麼,cudaGetDeviceProperties 只能抓到一個虛擬裝置「device 0」,而該裝置內容如下:做平行計算所探討的議題、思考的方向和做法,是我以前沒有接觸,或者甚少接觸的部分,即使看得懂,也需要許多的時間去消化吸收,爾後才能靈活運用(高微看得懂和寫得出來是兩回事)。而且,最好要能掌握顯示卡提供的硬體資訊,例如:最多可以產生幾個區塊、幾個執行緒、shared memory 有多大、有幾個暫存器,因為這些資訊都會影響資料的切割、存取,及演算法的修改,可以說是針對板子去寫平行的程式,所以像是 cublas、cufft 這些函式庫,我猜硬體資訊都已參數化。最後,開越多的執行緒或許越能隱藏 latency,但相對地,每個執行緒能分配到的資源就會越少,這是需要衡量的地方。
參考資料:
- 支援 CUDA 的顯示卡列表
- CUDA Zone Taiwan
- CUDA in Ubuntu ref 1
- CUDA in Ubuntu ref 2
- 批踢踢 VideoCard 板 a5000ml 的文章