首页 > 解决方案 > 小波变换 opencl for 循环

问题描述

我想在 OpenCL 1.0 内核中编写小波变换。我知道如何用 C 语言做到这一点,但我不知道在 OpenCL 中。我想知道的是如何使用 for 循环浏览图像。在 C 语言中,我这样做:

for ( j = 0; j < n; j++ )
  {
    for ( i = 0; i < m; i++ )
    {
      v[i+j*m] = u[i+j*m];
    }
  }

用 m 和 n 表示图像的大小。在 OpenCL 中我不能这样做。我的内核刚刚开始:

__kernel void wavelet(__global float* output, __global float* input1,)
{
    int WIDTH = 320; 
    int HEIGHT = 200;
    int i;
    int j;
    int k;
    const int column = get_global_id(0);
    const int row = get_global_id(1);   
}

我想如何在 OpenCL 中编写两个 for 循环?谢谢

标签: cfor-loopopenclwavelet

解决方案


内核的每个维度都将一个 for 循环“解包”成一个并行进程。您有一个 2D 内核,因此您的内核中根本不需要循环。row将内核中的andcolumn变量想象为C 代码中的iand j(或jand i,取决于您的设置方式)。

当试图在图像中的不同位置之间累积值时,它有点困难。每个工作项并行运行,引入潜在的竞争条件。您可能需要在内核中使用一个或多个 for 循环来按顺序累积值。

在 OpenCL 2.2 及更高版本中,可变持续时间循环是可能的,它们的语法与 C 相同。您可以使用get_global_size(uint dimindx).

确保clEnqueueNDRangeKernel使用正确数量的维度进行调用。您还需要global_size在此调用中匹配您的图像尺寸。例如,int global_size[2] = {w,h}. 您local_size可以是任何小于全局大小的值,但我喜欢使用int local_size[2]={16,16};. 我发现如果local_sizeto global_sizeratio 不是最理想的,OpenCL 内核有时可能会完全失败。为了保证结果,您可以设置local_size{1,1}


推荐阅读