【问题标题】:How to launch multiple kernel in OpenCL, inside the program?如何在程序内部在 OpenCL 中启动多个内核?
【发布时间】:2014-09-30 05:42:28
【问题描述】:

我正在尝试查看 Opencl 编程模型在 GPU 上的性能,现在在测试编程模型时,我必须使用 clEnqueueNDkernel() 启动内核,我试图多次调用此函数,所以当启动两个或四个并发内核时,我可以看到它的执行情况。

我观察到程序与启动一个内核所用的时间相同,现在我假设它只运行内核一次,因为不可能运行两个或四个并发内核。

现在我想知道如何在一个 GPU 上启动多个内核。

例如:我想推出类似的东西:

clEnqueueNDkernel()
clEnqueueNDkernel()

我该怎么做?

【问题讨论】:

  • 四个并发内核是指四个相同的内核代码还是四个不同的内核代码?另外一个内核中有多少工作,是两个值的加法还是很多计算?
  • 四个相同的内核。而且工作量不一。当我在各种工作量下检查时
  • 如果计算量很小,几乎所有的时间都可以用来在主机和设备之间移动数据。这可能是一个内核和四个内核花费相同时间的原因。与数据传输相比,尝试使负载非常大。那么它应该花费四次发射的四倍时间。
  • 您是否在基准测试中包含了 clFinish?如果你没有,你只是在测量异步排队时间。除非您使用多个命令队列或乱序命令队列,否则内核肯定不会同时运行。你必须付出一些努力才能实现。

标签: opencl gpu


【解决方案1】:

首先,检查您的设备是否支持并发内核执行。最新的 AMD 和 Nvidia 显卡可以。

然后,创建多个命令队列。如果将内核排入同一个队列,它们将依次执行。

最后,检查内核是否确实是并行执行的。使用来自 SDK 或 OpenCL 事件的分析器来收集分析信息。

【讨论】:

  • 所以你的意思是.. 我在不同的 clenqueuendkernel() 中使用不同的队列.. 这样它将在同一设备上并行运行
  • 是的。队列本质上是指其中的对象将被一个一个访问。所以,如果你使用单队列,内核会一个接一个地执行。
猜你喜欢
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多