模拟Gaussian模糊计算

就是计算一个矩阵,其中的每个值是周围所有值的和!
/**************************************************
*功能描述:此函数完成一个高斯模糊模拟过程,即
*			对于一张图片(这里简单为一个矩阵)
*			每一个像素值等于它周围所有像素值的和。
*			有考虑到了有补齐的问题,以后就只考虑
*			对齐情况了,知道补齐的思想就好了。
**************************************************/

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值