我编写了一个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
}
这是唯一的方法吗?有没有其他有效的方法来实现它?
非常感谢你的时间。
答案 0 :(得分:1)
尽管您提供的信息几乎消失,但我还是给出了答案。希望它有所帮助。
根据您的说法,您已经根据相邻像素的值为像素设置了更新规则。在迭代k处让x^(k)_ij
像素数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+1
和k
评估两张图片之间差异的标准。
一旦以这种方式表达问题,我会说你有以下两种可能性:
根据您正在处理的问题类型,我会说您有额外的可能性:
对于eikonal方程的求解,here已经比较了上述所有方法。
当然,您需要针对我们感兴趣的特定问题展示上述计算方案的一致性。