2014-10-12 49 views
1

我编写了一个CUDA内核来处理图像。但取决于处​​理后的图像的输出,我必须再次调用内核来重新调整图像。 例如,让我们考虑有9像素CUDA中的迭代图像处理

1 2 3 
4 5 6 
7 8 9 

图像假设,根据其相邻值,该值9变化10。由于值已更改,我必须用相同的内核重新处理新图像。

1 2 3 
4 5 6 
7 8 10 

我已经编写了算法来在单次迭代中处理图像。我计划在CUDA中实施迭代的方式如下:

__global__ void process_image_GPU(unsigned int *d_input, unsigned int *d_output, int dataH, int dataW, unsigned int *val) { 

    __shared__ unsigned int sh_map[TOTAL_WIDTH][TOTAL_WIDTH]; 
    // Do processing 
    // If during processing, anywhere any thread changes the value of the image call 
      { atomicAdd(val, 1); } 

} 
int main(int argc, char *argv[]) { 
    // Allocate d_input, d_output and call cudaMemcpy 
    unsigned int *x, *val; 
    x = (unsigned int *)malloc(sizeof(unsigned int)); 
    x[0] = 0; 
    cudaMalloc((void **)&val, sizeof(unsigned int)); 
    cudaMemcpy((void *)val, (void *)x, sizeof(unsigned int), cudaMemcpyHostToDevice); 
    process_image_GPU<<<dimGrid, dimBlock>>>(d_input, d_output, rows, cols, val); 
    cudaMemcpy((void *)x, (void *)val, sizeof(unsigned int), cudaMemcpyDeviceToHost); 
    if(x != 0) 
     // Call the kernel again 
} 

是否唯一这样做?有没有其他有效的方法来实现?

非常感谢您的时间。

+0

这个问题在概念上类似于快速前进/快速扫描/快速迭代方法,其中“信息通过更新相邻像素在计算域中传播”。 – JackOLantern 2014-10-12 11:15:03

+0

也许在这方面介绍设置迭代和停止规则的想法可能是有用的。 – JackOLantern 2014-10-12 11:19:09

+0

谢谢。正如其中一个答案/评论(被删除 - 我不知道为什么)中的建议,我删除了atomicAdd,并用* val = 1替换它,因为我只关心是否有任何更改。 – 2014-10-13 01:20:53

回答

1

尽管您提供的信息几乎消失,但我仍然有一个答案。希望能帮助到你。

根据您所说的,您已经根据相邻像素的值为您的像素设置了更新规则。让x^(k)_ij在迭代k的像素数ij的价值,并让

x^(k+1)_ij = f(x^(k)_(i-1)j, x^(k)_ij, x^(k)_(i+1)j, x^(k)_i(j-1), x^(k)_i(j+1)) 

我假设典型的基于模版的更新规则,当然,其他规则将是可能的。

此时,您必须设置停止规则,即指示您的算法是否已达到收敛的规则。例如,您可以在步骤k+1k中评估两个图像之间的差异的标准。

配制后的问题通过这种方式,我会说,你有以下两种可能:

  1. Rouy-Tourin-like方案:所有的计算像素以暴力的方式“同步”,直到收敛更新到达;
  2. Fast sweeping method:计算网格沿着前缀数量的方向扫描(选择性更新),直到达到收敛;

取决于那种你正在处理的问题,我会说,你有additionl可能性:

  • Fast iterative method:计算像素选择性地与更新援助堆结构。
  • 所有上述方法已经被比较,用于求解eikonal方程,here

    当然,对于我们感兴趣的特定问题,您需要显示上述计算方案的趋同性。

    +0

    对不起,延迟回复。是的,我正在使用典型的基于模板的规则。如果像素的值大于其平均值(相邻值*卷积滤波器)的某个阈值,我将用新值(邻居值的平均值)替换它。我正在使用强力方法。我是并行编程的新手,正在经历上述方法。将尝试一个接一个合并,并在此处发布。非常感谢。 – 2014-10-13 22:13:40