2022_PP_NYCU
在 hostFE.c
和 kernel.c
中的 *2 和 /2 都用 bit operation 來作加速。
在 hostFE.c
中 修改 filter
大小,和將 inputImage 的 float 型態轉換成 char 型態,減少傳輸量。
在 kernel.c
中修改 convolution 寫法,減少多餘的判斷式。
filter
大小我有把 filter 外圍多餘的 0 都去除掉,產生一個較小的 filter ,這樣可以在傳輸到 gpu 時傳較少 data,在作 convolution 時也可以減少一些不必要的計算。
例如:
我有把 inputImage 中 ,把原本 float(4 bytes)
轉換乘 char(1 byte)
,這樣可以減少傳送到 gpu 的 data 量。
我參考作業提供的 void serialConv()
來實做。
針對 內部兩個 for loop 來作修改。
原始板本每次都需要用 if/else 去作邊界的判斷,這樣會比較沒有效率。
修改版本可以事先算出 inputimage 從第幾個 row 和 第幾個 col 開始,這樣可以減少多餘的判斷,加速運算。
filter 1 | filter 2 | filter 3 | |
---|---|---|---|
Opencl Optimized | 0.416 | 0.404 | 0.412 |
Opencl | 0.671 | 0.482 | 0.674 |
Cuda | 0.850 | 0.565 | 0.687 |
我實做 cuda 一般版本的 convolution。
我的 cuda 結果會比 opencl 慢,尤其是在 filter 1 的時候。
以目前查看到的文獻是 cuda 會比 opencl 快。
但是我的 cuda 結果會比 opencl 慢,可能的原因是我在 cuda 部份實做的不夠好。也有可能是我的 opencl 的程式在傳 memory 的種類分得比較細(global, constant) 讓速度贏過 cuda。