#include
"cuda_runtime.h"
#include
"device_launch_parameters.h"
#include
using
namespace std;
//返回thread和block
intgetthreadnum()
__global__ void
conv
(float
*imggpu,
float
*kernelgpu,
float
*resultgpu,
int width,
int height,
int kernelsize)
int row = id / width;
//獲取img 的行和列
int clo = id / height;
//每乙個執行緒處理一次卷積計算
for(
int i =
0; i < kernelsize;
++i)
else
resultgpu[id]
+= kernelgpu[i*kernelsize + j]
* im**alue;}}
}int
main()
}//宣告卷積核大小,大小為3*3
const
int kernelsize =3;
float
*kernel =
newfloat
[kernelsize*kernelsize]
;//卷積核賦值
//第一種方法
//for (int i = 0; i < kernelsize; ++i)
////}
//第二種
for(
int i =
0; i < kernelsize*kernelsize;
++i)
//輸出img的左上角
for(
int row=
0; row <10;
++row)
std::cout <<
'\n';}
for(
int i =
0; i < kernelsize*kernelsize;
++i)
float
*imggpu =0;
//將host值複製到device上面
float
*kernelgpu =0;
//將kernel也複製到device上
float
*resultgpu =0;
//卷積結果
cudamalloc
(&imggpu, height*width *
sizeof
(float))
;cudamalloc
(&kernel, kernelsize*kernelsize *
sizeof
(float))
;//這個地方捕捉錯誤,明天改
cudamemcpy
(imggpu, img, width*height*
sizeof
(float
), cudamemcpyhosttodevice)
;cudamemcpy
(kernelgpu, kernel, kernelsize*kernelsize*
sizeof
(float
), cudamemcpyhosttodevice)
;const
int threadnum =
getthreadnum()
;const
int blocknum =
(width*height + threadnum -1)
/ threadnum;
//這裡block使用一維
conv <<
>
>
(imggpu, kernelgpu, resultgpu, width, height, kernelsize)
;float
*showimg =
newfloat
[height*width]
;cudamemcpy
(showimg, resultgpu, width*height *
sizeof
(float
), cudamemcpydevicetohost)
;return0;
}
cuda做卷積運算最終版本
include device functions.h include cuda runtime.h include device launch parameters.h include stdlib.h include include using namespace std 返回thread和blo...
cuda 計算1維的卷積
1維卷積的公式如下.用c 序列計算,程式如下 void conv vector uin,vector vin,vector convout 1 32 endlastarr32 zeros 1,32 if iy 1 lastarr32 blocksstep1 33 64 endblocksstep2 ...
CUDA卷積加速 一
推出這個系列的目的呢,主要是因為cuda學習的乙個主要用途就是對影象處理進行加速,而處理影象的過程中經常要用到卷積。卷積的計算有多種形式,本系列主要研究的是二維矩陣的卷積計算。從最原始的計算方法 就是本科教科書上的那種 再到優化後的適用於大型資料的演算法,均提供並行化的設計思路。考慮到機器學習很火,...