关于imageDenoising我的CUDA任务的问题

时间:2010-06-04 14:03:25

标签: cuda

  

可能重复:
  How CudaMalloc work?

这是我几天前发布的帖子,我丢失了帐户并注册了另一个

我正在尝试修改CUDA SDK中的imageDenosing类,我需要多次重复过滤器来捕获时间。但是我的代码无法正常运行。

//启动

__global__ void F1D(TColor *image,int imageW,int imageH, TColor *buffer)
{  

const int ix = blockDim.x * blockIdx.x + threadIdx.x;
const int iy = blockDim.y * blockIdx.y + threadIdx.y;

if(iy != 0 && iy < imageH-1  && ix < imageW)
{

    float4 fresult = get_color(image[imageW * iy + ix]);
    float4 fresult4 = get_color(image[imageW * (iy+1) + ix]);
    float4 fresult5 = get_color(image[imageW * (iy-1) + ix]);

    float4 fresult7; 
        fresult7.x = fresult.x*0.5+fresult4.x*.25+fresult5.x*.25;
        fresult7.y = fresult.y*0.5+fresult4.y*.25+fresult5.y*.25;
        fresult7.z = fresult.z*0.5+fresult4.z*.25+fresult5.z*.25;

    buffer[imageW * iy + ix] =      
        make_color(fresult7.x,fresult7.y,fresult7.z,0);     

}

image[imageW * iy + ix] =   buffer[imageW * iy + ix];
//should be use cudaMemcpy, But it fails
}
//extern

extern "C" void
cuda_F1D(TColor *dst, int imageW, int imageH)
{
dim3 threads(BLOCKDIM_X, BLOCKDIM_Y);
dim3 grid(iDivUp(imageW, BLOCKDIM_X), iDivUp(imageH, BLOCKDIM_Y));
Copy<<<grid, threads>>>(dst, imageW, imageH);

size_t size = imageW*imageH*sizeof(TColor);
TColor *host =(TColor*) malloc(size);
TColor *dst2;
//TColor *dst3;
//TColor *d = new TColor(imageW*imageH*sizeof(TColor));
dim3 threads2(imageW,1);
dim3 grid2(iDivUp(imageW, imageW), iDivUp(imageH, 1));

for(int i = 0;i<1;i++)
{   
cudaMalloc( (void **)&dst2, size);
cudaMemcpy(dst2, dst, imageW*imageH*sizeof(TColor),cudaMemcpyHostToDevice);
F1D<<<grid2, threads2>>>(dst, imageW, imageH,dst2);
cudaFree(dst2);
}

}

此代码有效,但无法同步图像数组。导致许多同步问题。

这是我的任务问题

实验课程描述:

在此作业中,您必须实施一个小型CUDA程序进行图像处理。您可能希望重新使用CUDA SDK提供的Image去噪视觉工作室项目。

问题1 编写一个CUDA内核,将以下1D滤波内核应用于图像[0.25 0.5 0.25](与之前的CW类似)。测量使用CUDA计时器所需的时间。为此,您可能需要重复过滤n次,以便您的测量足够准确。

因此我完成了过滤内核部分和时间测量。但循环N次失败。结果模糊不清,当我变大时,图像变黑。

0 个答案:

没有答案