c - 小波变换 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 循环?谢谢
解决方案
内核的每个维度都将一个 for 循环“解包”成一个并行进程。您有一个 2D 内核,因此您的内核中根本不需要循环。row
将内核中的andcolumn
变量想象为C 代码中的i
and j
(或j
and 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_size
to global_size
ratio 不是最理想的,OpenCL 内核有时可能会完全失败。为了保证结果,您可以设置local_size
为{1,1}
。
推荐阅读
- r - 使用 data.table 按组对数据进行 Winsorize
- javascript - 我想点击菜单切换然后打开菜单
- typescript - [cocosCreator, cocos2d-x]loadScene回调函数不能使用bind?
- javascript - 如何使用 Datebox 在输入文本中设置/显示值日期
- android - Jsondatalistview 只显示最后一个值。怎么做?
- css - CSS自定义彩色边框
- python - 必须多次输入负数才能跳出循环
- boto3 - boto3 中的 cloudwatch 警报给出了单位错误
- three.js - threejs:如何使用自定义着色器渲染纹理,包括纹理 UV 偏移
- html - Bootstrap - 内联表单无法正确显示