推出這個系列的目的呢,主要是因為cuda學習的乙個主要用途就是對影象處理進行加速,而處理影象的過程中經常要用到卷積。卷積的計算有多種形式,本系列主要研究的是二維矩陣的卷積計算。從最原始的計算方法(就是本科教科書上的那種)再到優化後的適用於大型資料的演算法,均提供並行化的設計思路。
考慮到機器學習很火,很多人也用python來做圖形處理。但不好的地方在於python目前還不支援gpgpu程式設計,這就很尷尬。所以說程式語言掌握全面一點總歸是好的嘛!
下面是普通版的cuda進行卷積的操作方法,是對卷積最初始的演算法進行的gpu平台的移植。我們稱之為版本二(版本一就是原始版的嘛)。演算法本身不難,但他考驗了一些cuda的基本功,對以後的深入學習有著鋪墊作用。
那麼利用計算機計算卷積最原始的版本呢,莫過於離散乘積求和,即對f[n-m]g[m]求和。那麼整個卷積就只需要幾個迴圈便可以做出來了。
__global__ void conv_kernel(const float *ina, const float *inb, float *out, size_t len_a, size_t len_b, size_t len_out)
float sum = 0.0f;
for (int m = 0; m < len_b; ++m)
}out[tid] = sum;
}
__global__ void conv2_kernel(const float *ina, const float *inb, float *out, size_t len_a, size_t len_b, size_t len_out)
if (tid < len_a)
__syncthreads();
float sum = 0.0f;
for (int m = 0; m < len_b; ++m)
else}}
out[tid] = sum;
}
__constant__ static float c_b[1024];
__global__ void conv3_kernel(const float *ina, float *out, size_t len_a, size_t len_b, size_t len_out)
if (tid < len_a)
__syncthreads();
float sum = 0.0f;
for (int m = 0; m < len_b; ++m)
else}}
out[tid] = sum;
}
一口氣列了三種,都是非常經典的加速技巧。
下面附上main()
int main(int argc, char const *argv)
cout << endl;
return 0;
}
筆記 CUDA加速
cuda 由nvidia推出的通用平行計算架構 該架構使gpu能夠解決複雜的計算問題 包含了cuda指令集架構 isa 以及gpu內部的平行計算引擎 開發人員現在可以使用c語言來為cuda架構編寫程式,將來還會支援其它語言,包括fortran以及c 在科學計算領域所要用到的計算往往不是我們熟知的普通...
CUDA加速學習
今天學習了一下nvidia官方教程第一課 cuda 提供了一種可擴充套件 c c python 和 fortran 等語言的編碼正規化 我對 cuda理解,cuda就像是c的超集一樣,提供了對gpu的操作,我目前覺得cuda沒有太多物件導向的東西,更多的是面向過程的 cpu上的 稱為主機 而在gpu...
kinectbridge啟用cuda加速
如果不啟用cuda,跑程式的時候,kinect2影象的接收頻率總是會突然降為0,連線斷開 1 安裝對應版本的cuda 2 在對lib 2進行build的時候,新增這麼一步操作,cmake denable cxx11 on dcuda propagate host flags off 3 在安裝iai...