opencl命令队列是如何工作的,我能要求它做什么

问题描述 投票:0回答:2

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

我已经编写了内核并开始将内核推送到命令队列上。因为我不想在每次通话后等待,所以我想我会尝试将我的通话与事件进行菊花链连接,然后开始将它们推送到队列中。

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

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

我正在使用 atMonitor 来检查 GPU 的利用率,很难将其提升到 20% 以上,这可能只是因为我无法足够快地将调用推送到那里吗?我的数据已经存储在 GPU 上,我传递的只是实际的调用。

c++ c cuda opencl gpgpu
2个回答
5
投票

首先,您不应该等待来自前一个内核的事件,除非下一个内核对前一个内核具有数据依赖性。设备利用率(通常)取决于队列中始终有准备好的东西。仅当需要等待事件时才等待事件。

“所有这些都被推送到驱动程序存储队列的图形芯片吗?”

这是实现定义的。请记住,OpenCL 不仅仅适用于 GPU!就 CUDA 式设备/主机二分法而言,您可能应该考虑“主机”上的命令队列操作(对于大多数实现)。

尝试对多个内核调用进行排队,并且在它们之间不等待。另外,请确保您正在使用最佳的工作组规模。如果您同时执行这两项操作,您应该能够充分利用您的设备。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.