【问题标题】:wavelet transform opencl for loop小波变换 opencl for 循环
【发布时间】:2021-09-01 09:35:31
【问题描述】:

我想在 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 循环? 谢谢

【问题讨论】:

    标签: c for-loop opencl wavelet


    【解决方案1】:

    内核的每个维度都将一个 for 循环“解包”成一个并行进程。您有一个 2D 内核,因此您的内核中根本不需要循环。 将内核中的 rowcolumn 变量想象为 ij(或 @ 987654325@ 和 i,取决于你的 C 代码中的设置。

    尝试在图像的不同位置之间累积值时会有些困难。每个工作项并行运行,引入潜在的竞争条件。您可能需要在内核中使用一个或多个 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_sizeglobal_size 的比率不是最佳值,OpenCL 内核有时可能会完全失败。为了保证结果,您可以将local_size 设置为{1,1}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 2016-02-18
      • 2023-01-12
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多