我正在研究一种算法,它经常做同样的操作。由于操作由一些线性代数(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上,而我所传递的所有内容都是实际的呼叫。
答案 0 :(得分:5)
首先,您不应该等待来自先前内核的事件,除非下一个内核对该先前内核具有数据依赖性。设备利用率(通常)取决于队列中是否存在随时可用的内容。只有在您需要等待活动时才等待活动。
“所有这些都被推到了图形芯片上,驱动程序是否存储队列?”
这是实施定义的。请记住,OpenCL不仅仅适用于GPU!就CUDA风格的设备/主机二分法而言,您应该考虑“主机”上的命令队列操作(对于大多数实现)。
尝试排队多个内核调用,而不必在它们之间等待。此外,请确保您使用的是最佳工作组大小。如果你同时做这两件事,你应该能够最大化你的设备。
答案 1 :(得分:1)
不幸的是我不知道你所有问题的答案,你现在也让我想知道同样的事情但是我可以说我怀疑OpenCL队列会变满,因为GPU应该完成执行在提交至少20个命令之前的最后排队命令。只有当你的GPU有一个“看门狗”时才会这样,因为这会阻止执行中的长内核(我想5秒或更长时间)。