opencl命令队列是如何工作的,我可以对它提出什么要求

How does the opencl command queue work, and what can I ask of it

本文关键字:我可以 什么 队列 命令 何工作 工作 opencl      更新时间:2023-10-16

我正在研究一种算法,它可以多次执行几乎相同的操作。由于操作包括一些线性代数(BLAS),我想我会尝试使用GPU。

我已经编写了我的内核,并开始在命令队列上推送内核。因为我不想在每次调用后等待,我想我可以尝试将调用与事件链接起来,然后开始将这些事件推送到队列中。

call kernel1(return event1)
call kernel2(wait for event 1, return event 2)
...
call kernel1000000(vait for event 999999)

现在我的问题是,所有这些都被推送到图形芯片,驱动程序存储队列吗?如果我可以使用的事件数量有限制,或者命令队列的长度有限制,我已经环顾四周,但我没有找到这个。

我正在使用atMonitor来检查我的gpu的利用率,并且很难将其推到20%以上,这可能仅仅是因为我无法将调用推到那里足够快吗?我的数据已经存储在GPU上,所有我传递出去的都是实际的调用。

首先,您不应该等待来自上一个内核的事件,除非下一个内核对上一个内核有数据依赖。设备利用率(通常)取决于队列中总是有一些准备就绪的东西。只在需要等待事件时才等待事件。

"是否所有这些都被推送到图形芯片或驱动程序是否存储队列?"

实现定义的

。记住,OpenCL不仅仅适用于gpu !就cuda风格的设备/主机二分法而言,您可能应该考虑在"主机"上执行命令队列操作(对于大多数实现)。"

尝试在多个内核调用之间不等待地排队。此外,确保你正在使用一个最佳的工作小组规模。如果你做到了这两件事,你应该能够最大限度地发挥你的设备。

不幸的是,我不知道你所有问题的答案,你现在也让我想知道同样的事情,但我可以说,我怀疑OpenCL队列将永远变得完整,因为你的GPU应该在至少20个命令提交之前完成执行最后排队的命令。这只有在你的GPU有一个"看门狗"的情况下才是正确的,因为这会阻止长得离谱的内核(我认为是5秒或更长)的执行。

相关文章: