【发布时间】:2022-05-15 19:01:32
【问题描述】:
我编写了一个 CUDA 内核来处理图像。但是根据处理后的图像的输出,我必须再次调用内核来重新调整图像。
例如,让我们考虑一个具有9 像素的图像
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
}
这是唯一的方法吗?还有其他有效的方法来实现吗?
非常感谢您的宝贵时间。
【问题讨论】:
-
这个问题在概念上类似于快速行进/快速扫描/快速迭代方法,其中信息通过更新相邻像素在计算域中传播。
-
也许在该领域引入的关于设置迭代和停止规则的想法可能有用。
-
谢谢。正如其中一个答案/cmets(已被删除 - 我不知道为什么)中所建议的那样,我删除了 atomicAdd 并将其替换为 *val=1 因为我只关心是否有任何更改。
-
您能否更具体地说明您正在执行的处理类型,特别是一个像素上的扰动如何反映到相邻像素上的扰动?也许,知道这一点后,人们可以提出一种与您设计的方法不同的方法。
标签: cuda