2010-05-30 50 views
3

我想修改CUDA SDK中的imageDenosing类,我需要多次重复过滤以捕获时间。但我的代码无法正常工作。CudaMalloc如何工作?

//开始

__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); 
//cudaMalloc((void **)&dst3, imageW*imageH*sizeof(TColor)); 
//cudaMemcpy(dst3, dst, imageW*imageH*sizeof(TColor),cudaMemcpyHostToDevice); 
    F1D<<<grid2, threads2>>>(dst, imageW, imageH,dst2); 
//cudaMemcpy(dst, dst3, imageW*imageH*sizeof(TColor),cudaMemcpyDeviceToHost); 
    cudaFree(dst2); 
}* 

} 

此代码的工作,但不能像数组同步。并导致许多同步问题

+0

推测dst也是cudaMalloc'd在别的地方?一个想到未来的参考,也许你打算让“我”循环执行更多的迭代 - 你应该避免在该循环内的cudaMalloc和cudaFree,并只做一次。让他们走上性能的道路并不是一个好主意,他们不是超快的。如果你的算法允许,你也可以考虑异步memcpys。 – Tom 2010-05-31 08:41:51

+0

ITYM“去噪”? – 2010-06-04 14:45:15

+0

YEs ... mistyping – kitw 2010-06-04 14:47:06

回答

6

您的内核异步运行 - 您需要等待它完成,例如,

cudaMalloc((void **)&dst2, size); 
cudaMemcpy(dst2, dst, imageW * imageH * sizeof(TColor), cudaMemcpyHostToDevice); 
F1D<<<grid2, threads2>>>(dst, imageW, imageH, dst2); 
cudaThreadSynchronize(); // *** wait for kernel to complete *** 
cudaFree(dst2); 
0

我已经回答了这个给你,当你发布了同样的问题以前 - 你需要等待内核再次运行前完成 - 增加:

cudaThreadSynchronize(); // *** wait for kernel to complete *** 

内核调用之后。

+0

谢谢你的回答,但cudaThreadSynchronize()没有帮助。 我曾尝试过,不知何故结果仍然不正确。 – kitw 2010-06-04 14:52:20

+0

http://www.mypicx.com/uploadimg/30130182_06042010_1.jpg 结果: 左边一个是第一次应用 中间一个是这个程序循环100次后 右边是我应该有的100倍 – kitw 2010-06-04 15:10:15

+0

@kitw:你仍然没有在上面的代码中使用'cudaThreadSynchronize()',但是为什么你会放弃这个呢?如果没有这个,代码就不能在循环中工作。 – 2010-06-05 08:57:38

0

声明

image[imageW * iy + ix] = buffer[imageW * iy + ix]; 

引起的问题。你在内核中覆盖你的输入图像。因此,根据线程执行顺序,您可能会进一步模糊图像的某些部分。

另外,我没有看到

cudaMemcpy(dst2, dst, imageW*imageH*sizeof(TColor),cudaMemcpyHostToDevice); 

dst目的看起来是设备内存,因为你可以访问它的CUDA籽粒。

+0

我知道这是问题所在。但我无法解决它 – kitw 2010-06-05 07:19:32