在CUDA内核中,如何在一个线程中处理一列用于图像值

时间:2015-01-21 22:43:45

标签: image cuda processing

我的图片是灰度图片。我想使用float*类型处理一个线程中的列的平均值。我想用平均值添加输出像素的值。当我启动它时,我只能看到一行。我无法理解发生了什么。

__global__ void processing(float* in, float* out, int COL, int ROW)
{
    int row=10;
    int col=10;
    __shared__ float u_shared[10];
    int idx=threadx.x
    if (idx>=N){return;}

    float mean = 0;
    if ( idx < COL) 
    {    
        for (int jdx=0; jdx < ROW; ++jdx)
        {
            mean += in[idx*ROW+jdx];
        }
        u_shared[idx] = mean/ROW;

        for (int jdxx=0; jdxx < ROW; ++jdxx)
        {
            out[idx*ROW+jdxx] =  in[idx*ROW+jdxx]+mean;
        }
    }     
}

kernel<<<1,10>>> // one thread for one column

1 个答案:

答案 0 :(得分:1)

这样的东西应该可行(在浏览器中编码,未经测试):

__global__ void processing(float* in, float* out, int COL, int ROW)
{
        int idx=threadx.x + blockDim.x*blockIdx.x;
        float mean = 0;
        if ( idx < COL) 
        {    
          for (int jdx=0; jdx < ROW; ++jdx)
          {
              mean += in[jdx*COL+idx];
          }
          mean /= ROW;
          for (int jdx=0; jdx < ROW; ++jdx)
          {
              out[jdx*COL+idx] =  mean + in[jdx*COL+idx];
          }
        }     
}

如果您的图片有1000行,5000列,您可以像这样启动它:

#define NROW 1000
#define NCOL 5000
#define nTPB 256
processing<<<(NCOL+nTPB-1)/nTPB, nTPB>>>(in_data, out_data, NCOL, NROW);

这假定输入和输出的普通,非音调分配。