我在opencl中编写了一个前向小波变换。
基本算法是将图像分割成128x8的图块;两个左列和两个右列被视为边界列。
将平铺数据移入本地内存,进行转换,并将非边界列存储在目标中。
我在瓷砖的水平边界看到了图像瑕疵,我无法弄清楚造成它们的原因。它们出现在第四和第124列,即不在边界上的第一个和最后一个偶数列。
这个项目是开源的:
https://github.com/boxerab/roger
依赖关系:Visual Studio 2012,Intel OpenCL SDK和OpenCV
答案 0 :(得分:2)
通常当OpenCL在边界上返回意外答案时,它就是一个Out-of-Bounds问题。如果大多数代码在边界之外工作,请检查内核中的内存访问是否正确。通常它将与以下内容有关:全局偏移+全局ID,本地偏移+本地ID,或者大于分配的组合。确保C / C ++代码中的全局和本地工作量和偏移量与分配的内存匹配,因为这会转换为内核中的全局和本地ID。
编辑:尝试在CPU设备上运行代码,因为这些代码不太容忍OOB,并且(通常)会导致堆栈溢出或类似情况。 GPU设备非常宽容,通常使用undefined,0(取决于编译器选项),或者一些奇怪的超巨值。