2014-08-27 45 views
1

我在opencl中编写了一个正向小波变换。用opencl编写的小波变换:在图像中看到伪像

基本算法是将图像分成128x8的图块;左边的两列和右边的两列被视为边界列。

瓷砖数据被移动到本地存储器中,被转换,并且非边界列被存储在目的地中。

我在瓷砖的水平边界处看到图像伪影,我无法弄清楚是什么导致了它们。它们发生在第四和第124列,即不在边界上的第一个和最后一个偶数列。

这个项目是开源:

https://github.com/boxerab/roger

依赖关系:的Visual Studio 2012,英特尔OpenCL的SDK和OpenCV

+1

通常,当我在OpenCL数据中看到工件时,这是由于出界限制访问问题。确保所有索引都正确完成。你正在测试CPU还是GPU?如果是GPU,请尝试使用Intel CPU,查看代码是否崩溃,这是OOB的一个好兆头。边界数的值是多少? – Austin 2014-08-27 20:09:48

+0

谢谢,奥斯汀。我的源代码是在采样器中设置了CLK_ADDRESS_MIRRORED_REPEAT的opencl图像。所以,对于输入来说越界越好。对于本地内存和输出,我非常确定没有OOB问题,但我必须仔细检查。我已经测试了英特尔CPU和AMD GPU,并且我看到问题 – Jacko 2014-08-27 20:13:44

+0

边界数字来自图像,但它们只是部分转换(这是一个卷积类型的问题),因此没有写入目标。 – Jacko 2014-08-27 20:15:35

回答

2

通常当OpenCL的上边界返回意想不到的答案,这是一个出界外的问题。如果大部分代码在边界以外工作,请检查内核中的内存访问是否正确。通常它会涉及到:全局偏移量+全局ID,本地偏移量+本地ID或组合大于分配的值。确保C/C++代码中的全局和本地工作量和偏移与分配的内存相匹配,因为这会转换为内核中的全局和本地ID。

编辑:尝试在CPU设备上运行代码,因为这些代码对OOB较不宽容,并且(通常)会导致堆栈溢出或类似情况。 GPU设备非常宽容,通常会使用undefined,0(取决于编译器选项)或者一些奇怪的超级巨大值。