【问题标题】:How does the opencl command queue work, and what can I ask of itopencl 命令队列是如何工作的,我有什么要求
【发布时间】:2011-10-25 00:33:52
【问题描述】:

我正在研究一种算法,它可以多次执行几乎相同的操作。由于该操作由一些线性代数(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 上,我传递的只是实际调用。

【问题讨论】:

    标签: c++ c cuda opencl gpgpu


    【解决方案1】:

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

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

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

    尝试将多个内核调用排队,而无需在它们之间等待。此外,请确保您使用的是最佳工作组规模。如果你同时做这两个,你应该能够最大限度地利用你的设备。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好的,你能告诉我你从哪里知道的吗?我试图弄清楚opencl的实际规格,但这一点也不容易。(我实际上正在考虑切换到CUDA)。你说的驱动程序捆绑命令并将它们大块发送到 gpu 是什么意思?
      • 我认为驱动程序确实捆绑了命令,因为根据 OpenCL 文档 clFinish 会阻塞,直到传入的命令队列中的所有命令都完成执行,所以除非你调用 clFinish OpenCL 将决定何时执行命令.但是调用 clFinish 很昂贵,应该避免,但我仍然会尝试一下。您是否考虑过您的 GPU 可能足够快地执行您的计算而无需 100% 的功率?我能想到的唯一另一件事是 OpenCL 限制了 GPU 的使用,因此您的计算机显示不会锁定
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 2023-03-23
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      相关资源
      最近更新 更多