我编写了一个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
}
是否唯一这样做?有没有其他有效的方法来实现?
非常感谢您的时间。
这个问题在概念上类似于快速前进/快速扫描/快速迭代方法,其中“信息通过更新相邻像素在计算域中传播”。 – JackOLantern 2014-10-12 11:15:03
也许在这方面介绍设置迭代和停止规则的想法可能是有用的。 – JackOLantern 2014-10-12 11:19:09
谢谢。正如其中一个答案/评论(被删除 - 我不知道为什么)中的建议,我删除了atomicAdd,并用* val = 1替换它,因为我只关心是否有任何更改。 – 2014-10-13 01:20:53