Cudamaloc是如何工作的?

Cudamaloc是如何工作的?,cuda,Cuda,我正在尝试修改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

我正在尝试修改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
}
\uuuuu全局\uuuuu无效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;
如果(iy!=0&&iy
//外行

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);
}*

}
外部“C”无效
cuda_F1D(T颜色*dst、int图像W、int图像H)
{
dim3螺纹(块状DIM_X,块状DIM_Y);
dim3网格(iDivUp(图像W,块尺寸X),iDivUp(图像H,块尺寸Y));
副本(dst、imageW、imageH);
大小\u t size=imageW*imageH*sizeof(TColor);
TColor*主机=(TColor*)malloc(大小);
t颜色*dst2;
//t颜色*dst3;
//TColor*d=新的TColor(imageW*imageH*sizeof(TColor));
dim3螺纹2(图W,1);
dim3网格2(iDivUp(imageW,imageW),iDivUp(imageH,1));

*对于(inti=0;i您的内核正在异步运行-您需要等待它完成,例如

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);
cudaMalloc((void**)和dst2,尺寸);
cudaMemcpy(dst2、dst、imageW*imageH*sizeof(TColor)、cudaMemcpyHostToDevice);
F1D(dst、imageW、imageH、dst2);
cudaThreadSynchronize();//***等待内核完成***
cudaFree(dst2);

当您之前发布相同的问题时,我已经为您回答了这个问题-您需要等待内核完成后再运行它-添加:

cudaThreadSynchronize(); // *** wait for kernel to complete ***
在内核调用之后。

语句

image[imageW * iy + ix] =   buffer[imageW * iy + ix];
是导致问题的原因。您正在覆盖内核中的输入图像。因此,根据线程执行顺序,您可能会进一步模糊图像的某些部分

而且,我不明白

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

dst
看起来像是设备内存,因为您可以在cuda内核中访问它。

大概dst也是cudaMalloc在其他地方使用的?一个想法供将来参考,也许您打算使用“i”循环执行更多的迭代-你应该避免圈内的CUADAMOLC和CUADFRE,只做一次。在性能路径上不是很好的,它们不是超快的。如果你的算法允许的话,你也可以考虑异步MeMCPIE。@ KITW:点击上面的编辑按钮来修复TyPOS等等。计数?这是同一个帐户。kitw。是的,谢谢你的回答,但是cudaThreadSynchronize()没有帮助。我以前试过,结果还是不正确。结果:左一个是第一次申请时,中间一个是在这个程序循环100次之后,右一个是我100次之后应该得到的times@kitw:您仍然没有
cudaThreadSynchronize()
但是在上面的代码中-为什么要省略此项?如果没有此项,代码就无法在循环中工作。