測試用程式:原始檔下載
這邊用來作效能測試的程式,是之前《CUDA Texture Part.2 Linear Memory》、《CUDA Texture Part.3 CUDA Array》中,很簡單的 blending 演算法。而在這邊,Heresy 是用 cutil 的函式來作時間計算的工作,所以在下載原始檔後,如果要編譯可能會需要進專案設定的部分,修改相關的路徑。
而在執行的測試方面,分成五種不同的方法:
- CPU
使用 CPU 來做計算,但是沒有使用 OpenMP 之類的平行化計算,所以應該只有用到一顆 CPU 核心。 - GPU
簡單的透過 CUDA global memory 來做,沒有特別最佳化。 - GPU Texture
使用 CUDA Linear memory 的 texture 來做存取。 - GPU without transfer
簡單的透過 CUDA global memory 來做,沒有特別最佳化;不過在計算時間時,不考慮將記憶體由 host 複製到 device 的時間。 - GPU Texture without transfer
使用 CUDA Linear memory 的 texture 來做存取;不過在計算時間時,不考慮將記憶體由 host 複製到 device 的時間。
而測試的資料大小,分別有:640×480、1280×1024、1600×1200、1920×1200、2048×2048、4096×2048、4096×4096。計算時間時,每個方法在每組資料,都會跑 300 次;出來的結果,就是每處理一份資料所需的時間(單位應該是 ms)。
測試的平台:
- Intel Core 2 Exterme X9650 (3Ghz, 333mhz x 9 )
- 4GB DDR2
- ASUS P5K Premium/Wi-Fi (Intel P35)
- GeForce 8800GT 512MB
最後測試的結果,大概如下圖:
首先,當然是先看和 CPU 比較的結果了∼在上圖中,可以很清楚的看出來,在 GPU 上的測試,不管是哪種方法,所需時間都比 CPU 少;而當資料越大,差異也越大。如果比較「CPU」和「GPU Texture without transfer」的話,只要資料量稍大(1600×1200 以上),所需時間可以差到 11 倍以上!不過實際上,這個程式在每個 thread 的運算量還不是很多,應該還沒有能完全發揮大量平行化的優勢;如果在跑更複雜一些的計算,理論上應該可以快上更多。
而如果比較「GPU」和「GPU without transfer」這兩組結果,可以發現:在這個簡單的 CUDA 測試程式中,「將資料由 host 複製到 device」所花費的時間,大概佔了快一半左右的時間…而考慮「GPU Texture」和「GPU Texture without transfer」也可以發現,資料傳輸的部分佔了相當大的比重,比例甚至超過一半。
而比較「GPU Texture without transfer」和「GPU without transfer」的結果,可以發現在沒有最佳化的情況下,直接使用 CUDA global memory 來存取資料計算所需的時間,會比使用 texture 來的慢上不少(超過兩倍)。或許對不了解最佳化方法,或不想太花心思去做最佳化的人來說,使用 CUDA Texture 會是個不錯的選擇吧?