就是计算一个矩阵,其中的每个值是周围所有值的和!
/**************************************************
*功能描述:此函数完成一个高斯模糊模拟过程,即
* 对于一张图片(这里简单为一个矩阵)
* 每一个像素值等于它周围所有像素值的和。
* 有考虑到了有补齐的问题,以后就只考虑
* 对齐情况了,知道补齐的思想就好了。
**************************************************/
#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;//定义设备指针,分配空间并初始化为0
err=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;
}