如何解决OpenCL 矩阵中值滤波器
我有一个问题,我正在尝试实现一个中值滤波器。要解决的任务是计算矩阵上的中值滤波器,该矩阵必须重复 x 次。我的问题是当矩阵大于 2048x2048 时,结果不再正确。
__kernel void saxpy_kernel(float alpha,int size,__global float *in,__global float *out,int loops) {
int i = get_global_id(0);
int index = 0;
for (int loop = 0; loop < loops; loop++) {
for (int j = 0; j < size; j++) {
index = j * size + i;
float center = in[index];
float centerTop = (index > size) ? in[index - size] : 0;
float centerLeft =
(index > 0 && (index - 1) % size < (size - 1)) ? in[index - 1] : 0;
float centerRight = ((index + 1) % size > 0) ? in[index + 1] : 0;
float centerDown =
(index + size < (size * size)) ? centerDown = in[index + size] : 0;
// write in buffer
out[index] =
alpha * (center + centerTop + centerLeft + centerRight + centerDown);
}
if (loop < loops - 1) {
barrier(CLK_GLOBAL_MEM_FENCE);
for (int j = 0; j < size; j++) {
index = j * size + i;
*(in + index) = *(out + index);
}
barrier(CLK_GLOBAL_MEM_FENCE);
}
}
}
内核加载如下。
size_t global_size[] = {VECTOR_SIZE,VECTOR_SIZE,0}; //My matrix pattern
size_t group_pattern[] = {1,0}; //My workgroups pattern
size_t local_size[] = {global_size[0] / group_pattern[0],global_size[1] / group_pattern[1]}; //My workgroups pattern
clStatus = clEnqueueNDRangeKernel(command_queue,kernel,2,NULL,global_size,local_size,NULL);
我希望有人能帮助我。我很乐意收到有关可以优化的任何其他反馈。
解决方法
问题是您代码中的 global_size[]
是 3D 并且 3D 范围有最大尺寸限制,例如 2048x2048x64
(clinfo
中的最大工作项尺寸)。将 global_size
设为一维并使用线性索引 (n=size_x*y+x
) 来访问您的二维矩阵坐标。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。