CUDA卷積加速 一

2021-07-24 01:58:45 字數 1529 閱讀 6113

推出這個系列的目的呢,主要是因為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...