模拟Gaussian模糊计算

来源:互联网 发布:如何做到处事不惊 知乎 编辑:程序博客网 时间:2024/06/16 12:29
就是计算一个矩阵,其中的每个值是周围所有值的和!
/***************************************************功能描述:此函数完成一个高斯模糊模拟过程,即*对于一张图片(这里简单为一个矩阵)*每一个像素值等于它周围所有像素值的和。*有考虑到了有补齐的问题,以后就只考虑*对齐情况了,知道补齐的思想就好了。**************************************************/#include<iostream>#include<stdlib.h>#include<stdio.h>#include<cuda_runtime.h>#include<device_launch_parameters.h>#define M 64#define N 64#define size M*N*sizeof(float)using namespace std;void showResult(float *p);void init(float *p,int num,int value);__global__ void Raussian_kernel(float *d_a,float *d_b);int main(){float *h_a=(float*)malloc(size);//定义主机指针并分配空间float *h_b=(float*)malloc(size);//初始化输入数据init(h_a,M*N,1);//输入矩阵初始化为1//showResult(h_a);init(h_b,M*N,0);//输出矩阵初始化为0//showResult(h_b);cudaError_t err=cudaSuccess;float *d_a,*d_b;//定义设备指针,分配空间并初始化为0err=cudaMalloc((void**)&d_a,size);cudaMemset(d_a,0,size);cudaMalloc((void**)&d_b,size);cudaMemset(d_b,0,size);if(err!=cudaSuccess){fprintf(stderr,"error=%s\n",cudaGetErrorString(err));exit(EXIT_FAILURE);}err=cudaMemcpy(d_a,h_a,size,cudaMemcpyHostToDevice);//主机向设备拷贝数据if(err!=cudaSuccess){fprintf(stderr,"error=%s\n",cudaGetErrorString(err));exit(EXIT_FAILURE);}dim3 threadsPerBlock(32,32);dim3 blocksPerGrid(N/32,M/32);//这里只考虑对齐的情况,所以就不搞那么复杂的判断了//启动核函数Raussian_kernel<<<blocksPerGrid,threadsPerBlock>>>(d_a,d_b);cudaMemcpy(h_b,d_b,size,cudaMemcpyDeviceToHost);//显示结果showResult(h_b);return 0;}//初始化函数void init(float *p,int num,int value)//num表示有多少个数{for(int i=0;i<num;i++){p[i]=value;}}//显示函数void showResult(float *p){for(int i=0;i<M;i++){for(int j=0;j<N;j++){cout<<p[i*N+j]<<'\t';}cout<<endl;}}__global__ void Raussian_kernel(float *d_a,float *d_b)//M*N矩阵{int tid_in_grid_x=blockIdx.x*blockDim.x+threadIdx.x;int tid_in_grid_y=blockIdx.y*blockDim.y+threadIdx.y;float sum=0.0f;for(int i=tid_in_grid_y-1;i<=tid_in_grid_y+1;i++)//i是行,j是列,注意线程中的的区别,x是列,y是行{for(int j=tid_in_grid_x-1;j<=tid_in_grid_x+1;j++){if(i>=0&&i<=(M-1)&&j>=0&&j<=(N-1))//四个条件必须同时满足才进行取值求和操作sum+=d_a[i*N+j];}}sum-=d_a[tid_in_grid_y*N+tid_in_grid_x];//把自己本身再减掉d_b[tid_in_grid_y*N+tid_in_grid_x]=sum;}

0 0
原创粉丝点击