用opencl编写的小波变换:在图像中看到伪影

用opencl编写的小波变换:在图像中看到伪影,opencl,Opencl,我在opencl中编写了一个前向小波变换 基本算法是将图像分成128x8的分块;两个左侧列和两个右侧列被视为边界列 磁贴数据被移动到本地内存中,并进行转换,非边界列存储在目标中 我在瓷砖的水平边界处看到了图像瑕疵,但我不知道是什么导致了它们。它们出现在第四列和第124列,即不在边界上的第一列和最后一列偶数列 该项目是开源的: 依赖项:Visual Studio 2012、英特尔OpenCL SDK和OpenCV通常当OpenCL在边界上返回意外答案时,这是一个越界问题。如果大多数代码都在边界上

我在opencl中编写了一个前向小波变换

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

磁贴数据被移动到本地内存中,并进行转换,非边界列存储在目标中

我在瓷砖的水平边界处看到了图像瑕疵,但我不知道是什么导致了它们。它们出现在第四列和第124列,即不在边界上的第一列和最后一列偶数列

该项目是开源的:


依赖项:Visual Studio 2012、英特尔OpenCL SDK和OpenCV通常当OpenCL在边界上返回意外答案时,这是一个越界问题。如果大多数代码都在边界上工作,请检查内核中的内存访问是否正确。通常情况下,它与以下内容有关:全局偏移量+全局id、局部偏移量+局部id,或大于分配的值的组合。确保C/C++代码中的全局和本地工作大小和偏移量与分配的内存相匹配,因为这会在内核中转换为全局和本地ID


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

通常当我在OpenCL数据中看到工件时,这是因为越界访问问题。确保所有索引都正确完成。您是在CPU还是GPU上进行测试?如果是GPU,试试Intel CPU,看看代码是否崩溃,这是OOB的好迹象。边界数的值是多少?谢谢,奥斯汀。我的源代码是一个opencl映像,在采样器中设置了CLK_地址_镜像_重复。因此,对于输入来说,越界是可以接受的。对于本地内存和输出,我非常确定没有OOB问题,但我必须再次检查。我已经在intel CPU和AMD GPU上进行了测试,我看到了问题边界号来自图像,但它们只是部分转换(这是一个循环流类型的问题),因此没有写入目标。如果您非常确定一切都像
getLocalId(0)一样工作,我想另一件要检查的事情是输出索引
,它应该是BOUNDARY\u X*2吗?哎呀,您在低端使用的是BOUNDARY\u X的偏移量,所以BOUNDARY\u X*2没有意义,怎么办