opencl命令队列如何工作,我可以问什么

Mar*_*sen 6 c c++ cuda gpgpu opencl

我正在研究一种算法,它可以做很多次相同的操作.由于操作由一些线性代数(BLAS)组成,所以我会尝试使用GPU.

我写了我的内核并开始在命令队列上推送内核.由于我不想在每次通话后等待,我想我会尝试用事件菊花链接我的呼叫,然后开始在队列中推送这些.

call kernel1(return event1)
call kernel2(wait for event 1, return event 2)
...
call kernel1000000(vait for event 999999)
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,所有这些都被推到图形芯片上,驱动程序是否存储队列?它有我可以使用的事件数量,或命令队列的长度,我环顾四周,但我无法找到它.

我正在使用atMonitor来检查我的gpu的利用率,并且非常难以将其推高到20%以上,这可能只是因为我无法将呼叫推得那么快吗?我的数据已经存储在GPU上,而我所传递的所有数据都是实际的调用.

Rya*_*cus 5

首先,除非下一个内核对先前的内核具有数据依赖性,否则不应等待来自先前内核的事件.设备利用率(通常)取决于队列中是否存在随时可用的内容.只有在您需要等待活动时才等待活动.

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

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

尝试排队多个内核调用,而不必在它们之间等待.此外,请确保您使用的是最佳工作组大小.如果您同时执行这两项操作,则应该能够最大化您的设备.