【问题标题】:Using Out of Order Execution on Nvidia Quadro FX 880在 Nvidia Quadro FX 880 上使用乱序执行
【发布时间】:2014-01-30 15:49:24
【问题描述】:

我使用的是 Quadro FX 880 卡。在我的图像分割代码中,我将图像分为 4 个部分(即如果有 4000 个像素,则每个部分为 1000 个像素)。我的代码中有 8 个内核......其中前 4 个将并行执行,接下来的四个将再次并行执行,但在前四个内核执行之后。如果我对所有 8 个内核使用相同的命令队列并为前四个内核中的每一个指定一个 clEnqueueNDRangekernel 命令并且我在创建命令队列时提到 OUT_OF_ORDER 参数,这是否可能......?如果这是可能的,如何并行执行接下来的四个内核,即在前四个内核之后执行..?我可以在前四个内核之后给出一个 clWaitForEvents 命令,然后指定接下来的四个内核..?这是否能保证前四个内核并行执行,接下来的四个内核在它们之后但并行执行..?

我认为 clEnqueueTask 会使我的代码变慢,因为我在每个内核中有大约 1000 个像素,而 clEnqueueTask 允许 gobal_workitem_size 和 local_work_item_size 仅为 1....!

我不确定是否可以完成所有这些事情......以及什么是错或对......所以我只需要确认......!但如果不是这种方式,请建议另一种方式......!

【问题讨论】:

    标签: opencl


    【解决方案1】:

    较新的设备应该支持在多个命令队列上并行运行多个内核。

    【讨论】:

      【解决方案2】:

      FX880M 是一款计算能力为 1.2 的设备。它不支持同时/并发内核执行,仅支持执行复制重叠。您可以创建一个无序执行的命令队列,但它不会产生您所询问的效果。

      【讨论】:

      • 如果我创建多个命令队列怎么办,即每个内核都有一个命令队列...它们会在不同的计算单元上并行执行吗?我要讨论的 4 个内核包含相同的代码,但我为不同的数据集执行它们,即如果我有 512X512 大小的图像,我创建它的 4 个部分,大小为 256x256 像素,并通过给出对​​每个部分进行相同的处理4 个不同的 clEnqueueNDRangeKernel 调用,它们将被排入不同的命令队列。!这会使代码并行还是只会增加创建 4 个内核的开销..?
      • 正如我在回答中所说,这需要您的 GPU 不具备的硬件功能。该要求是不可协商的。您无法在您询问的设备上执行此操作。
      • @user1770678 当然,您总是可以根据正在处理的像素重写您的算法以进行不同的分支,因为我假设图像被分成四个季度,分支的成本将可以忽略不计任何工作组中的项目几乎总是采用相同的分支。这样一来,您只需启动一个内核,该内核根据像素的位置执行的操作略有不同。
      • Thomas:: 是否可以像我计划的那样通过为相同的数据创建多个命令队列来实现加速...? @Talonmies,我认为我的 Gpu 支持多个命令队列......如果有人为每个内核都有不同的代码,因此创建多个命令队列来并行执行它们......?
      • @user1770678:您可以有多个命令队列,但它们不会导致内核并发执行因为您的 GPU 架构不支持它。你希望被告知多少次同样的事情?
      猜你喜欢
      • 2016-05-09
      • 1970-01-01
      • 2023-03-09
      • 2013-07-26
      • 2015-08-11
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多