Opencl 不正确的内核缓冲区读取

Opencl 不正确的内核缓冲区读取,opencl,Opencl,我在做一个GPU信号处理的项目。它包括乘法、加法和FFT/IFFT。数据集非常庞大,我开发的内核总共有9个,最复杂的显然是FFT/IFFT的内核。我有一个我真的不明白的问题。这可能是一种比赛状态,但对我来说似乎很奇怪,实际上我无法解决它 我确实使用单个队列,因此每个命令都是按照顺序调用的。事实上,简单地说,该项目分为两个部分(我必须尽可能节省计算时间,因此我只在底部放置了重要的命令,并尽可能地对它们进行批处理): 1) 在顶部,我创建了基础(平台、设备、上下文、程序、内核、队列、工作大小和其他内

我在做一个GPU信号处理的项目。它包括乘法、加法和FFT/IFFT。数据集非常庞大,我开发的内核总共有9个,最复杂的显然是FFT/IFFT的内核。我有一个我真的不明白的问题。这可能是一种比赛状态,但对我来说似乎很奇怪,实际上我无法解决它

我确实使用单个队列,因此每个命令都是按照顺序调用的。事实上,简单地说,该项目分为两个部分(我必须尽可能节省计算时间,因此我只在底部放置了重要的命令,并尽可能地对它们进行批处理):

1) 在顶部,我创建了基础(平台、设备、上下文、程序、内核、队列、工作大小和其他内容)。此外,我在这里创建了一些固定缓冲区(指向要读取且在执行期间不会更改的已存储数据的指针)和设备缓冲区(指向null的指针)。然后,我使用命令SetKernelArg只将在执行期间(大部分)不会更改的参数推送到不同的内核

2) 在底部(while loop-if语句),我打包了所有排队命令(内存映射、内核执行、某些情况下的缓冲区复制),以加速处理(批处理)。在这里,有时我必须重新定义一些内核参数(很少,在执行期间更改),并且必须创建其余的固定缓冲区(很少,与更改的数据相关)

在运行该项目时,我将十个命令(内存映射、内核执行、缓冲区复制)放入队列,一切正常。每个内核都使用前一个内核的输出作为输入之一。此外,其中一些命令使用固定缓冲区(一些在顶部创建,与独立数据相关,一些在执行期间在底部创建,与重新计算的数据相关),并且作为附加约束,每个命令通过命令等待列表等待前一个命令完成(可能是冗余的,因为使用了一个队列)。外推一些数据用作以下输入,我在不同内核上再次运行另一组相同的命令。前两个内核执行工作正常,数据良好(第一个内核将顶部创建的一个固定缓冲区作为输入之一)。运行第三个内核时,将顶层创建的一个固定缓冲区(输入、全局内存)存储在内核内同一类型的私有变量上会出现问题(竞争条件?),通过使用CodeXL调试器检查内核内的数据可以看出这一点。在这两者之间,只有设备缓冲区充当每个内核的输出/输入。我在问自己,为什么这个问题会依次出现(在第三次内核执行时),而不是在第一次执行时,因为两者都使用在顶层创建的全局固定缓冲区(与独立的不同数据相关)

事实上,如果我在内核执行之前/之后读取主机上的输入缓冲区内容,那么数据对应于原始值,因此它们是相同的,并且以相同的方式排序,实际上在内核中一些值是不同的(real,每次都是相同的未更正值,每次都对应于相同的工作项,没有随机值)。在内核中,我尝试使用barrier(CLK_GLOBAL_MEM_FENCE)命令,read_MEM_FENCE(CLK_GLOBAL_MEM_FENCE)在主机上,该体系结构与第一部分相同,命令按顺序排队并与事件同步。 这是竞争条件吗?如果事件(在主机上)和屏障/围栏(在内核中)不能解决问题,我如何修复它

我很抱歉给你一个恼人的问题描述(可能有点混乱),不幸的是,我不能分享隐私规则的代码片段(而且可能太长了,因为主机代码太大)

向大家问好

马可我不明白你的问题。2) CLK_GLOBAL_MEM_FENCE不同步全局工作项,只同步访问全局内存的本地工作项。1)固定缓冲区(CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR)在内核内未正确读取,即使其数据已正确存储(在内核排队之前/之后读取缓冲区已验证)。每次在相同的工作项上,不正确的值都是相同的、有限的,而不是随机的。内核之间的同步通过事件启用。2) 嗯