未正确的内核缓冲区读取

时间:2016-01-08 14:51:04

标签: opencl

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

我确实使用单个队列,因此每个命令都被称为尊重命令。事实上,该项目很容易说,分为两个部分(我必须尽可能多地节省计算时间,所以我只在底部放置了重要命令,尽可能多地对它们进行批处理): / p>

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

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

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

事实是,如果我应该在内核执行之前/之后读取主机上的输入缓冲区内容,数据对应于原始值,所以它们是相同的并且以相同的方式排序,实际上在内核中有些值是不同的(真实的,每次都是相同的不正确的值,每次都对应同一个工作项,没有随机值)。在内核中,我尝试使用barrier(CLK_GLOBAL_MEM_FENCE)命令,read_mem_fence(CLK_GLOBAL_MEM_FENCE)命令,但没有解决它。在主机上,该体系结构与第一部分相同,命令按顺序排列并且另外同步事件。 这是竞争条件吗?如果事件(在主机上)和障碍/栅栏(在内核中)无法解决问题,我怎么能解决它呢?

我很遗憾给你一个令人烦恼的问题描述(也许有点令人困惑),不幸的是我不能分享隐私规则的代码片段(自主机代码以来可能太长了是非常巨大的。)

关心每个人

0 个答案:

没有答案