我正在研究一种算法,它经常做同样的操作.由于操作由一些线性代数(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上,而我传递的所有内容都是实际调用.
解决方法
首先,除非下一个内核对先前的内核具有数据依赖性,否则不应等待来自先前内核的事件.设备利用率(通常)取决于队列中是否存在随时可用的内容.只有在需要等待活动时才等待活动.
“does all of this get pushed to the graphic chip of does the driver store the queue?”
那是实现定义的.请记住,OpenCL不仅仅适用于GPU!就CUDA风格的设备/主机二分法而言,您应该考虑“主机”上的命令队列操作(对于大多数实现).
尝试排队多个内核调用,而不必在它们之间等待.此外,请确保您使用的是最佳工作组大小.如果您同时执行这两项操作,则应该能够最大化您的设备.