我正在编写一个与我的AMD Radeon HD 7800系列GPU一起使用的OpenCL程序。根据AMD的OpenCL编程指南,这一代GPU具有两个可以异步操作的硬件队列。


5.5.6命令队列

对于Southern Islands和更高版本,设备至少支持两个硬件compute
队列。这使应用程序可以通过两个用于异步提交和可能执行的命令队列来提高小型调度的吞吐量。
按以下顺序选择硬件计算队列:第一个队列=
甚至OCL命令队列,第二个队列=奇数个OCL队列。要做到这一点,我创建了两个单独的OpenCL命令队列,将数据馈送到GPU。大致来说,在宿主线程上运行的程序看起来像这样:

单个命令队列,然后运行直至GPU一直很忙。通过查看CodeXL分析器的输出,可以看到以下内容:这项工作平均分配给两个队列。如果有的话,我希望每个队列分别具有与一个队列相同的特征:依次开始工作,直到一切完成。但是,当使用两个队列时,我可以看到并非所有工作都分散在两个硬件队列中:

在GPU的工作开始时,队列确实设法异步运行了一些内核,尽管似乎它们都没有完全占据硬件队列(除非我误解了)。在GPU工作快要结束时,队列似乎只向其中一个硬件队列按顺序添加工作,但有时甚至没有内核在运行。是什么赋予了?我对运行时应该如何运行有一些基本的误解吗?调用迫使GPU同步地从共享内存池中分配设备资源,这使单个内核的执行停滞。
因为我使用的是GL对象,所以GPU需要在写入期间同步对专门分配的内存的访问。

这些假设是否正确?有谁知道在两队列情况下导致GPU等待的原因是什么?任何见解将不胜感激!

评论

我在编程指南中找不到它说有两个硬件队列的位置。您能发表这份文件的报价吗?提到哪一章说有两个队列?使用OpenCL在运行时是否可以查询硬件队列的数量?

我已经更新了我的帖子。它确实表示可能的执行,但是如果可以执行,为什么不能全部执行呢?另外,OpenCL运行时没有硬件队列的概念,因此您无法查询。

#1 楼

通常,计算队列不一定意味着您现在可以并行执行2x分派。完全饱和计算单元的单个队列将具有更好的吞吐量。如果一个队列消耗较少的资源(共享内存或寄存器),则多个队列很有用,然后辅助队列可以在同一计算单元上重叠。

对于实时渲染,尤其是阴影渲染等情况,在计算/着色器上非常轻便,而在固定功能硬件上则很繁重,因此释放了GPU调度程序来运行辅助队列异步。

也可以在发行说明中找到。不知道这是否是同一问题,但可能仅仅是CodeXL不好。我希望它可能没有进行调度的最佳工具。

https://developer.amd.com/wordpress/media/2013/02/AMD_CodeXL_Release_Notes.pdf


对于同时执行异步数据传输和内核执行的应用程序,
在“应用程序跟踪”会话视图中显示的时间轴不会显示这些操作重叠。这是因为驱动程序和硬件在进行概要分析时会强制这些操作同步。 (333981)