【问题标题】:Opencl - single queue with 2 devicesOpencl - 具有 2 个设备的单队列
【发布时间】:2019-04-02 05:22:03
【问题描述】:

我正在尝试将 CUDA 测试移植到 Opencl。它需要从 PCIe 设备 1 到相同类型(相同品牌、相同驱动程序等)的设备 2 上的缓冲区副本

在 CUDA 中非常简单:在设备 1 和设备 2 上分配内存并复制

在 Opencl 中: 1. 使用两个设备创建一个上下文 2. 在上下文中分配内存并使用 migrateMemObject 将其与 device-1 关联。对设备 2 重复相同的操作

  • 创建队列时,我需要指定上下文和设备。因此队列只能与设备关联,因此只能访问与该设备关联的内存(?)

  • 有没有办法让2台设备使用一个队列?

  • 或者有什么方法可以从与 device1 关联的 gfx-mem 复制到与 device2 关联的 gfx-mem 而无需复制到主内存?

感谢您的帮助!

【问题讨论】:

  • 只有amd才有,有clEnqueueMakeBuffersResidentAMD。只有nvidia,你可以再次使用CUDA,只是为了通信卡,反正它是硬件依赖的,违背了OpenCL的目的。要以锁步方式使用 2 个队列,您应该尝试在两个队列上使用事件,以便它们相互依赖。您可以将数据命令分别提供给两者,但仅使用事件运行内核以使它们同时运行或类似的东西。

标签: queue opencl bandwidth migrate


【解决方案1】:

不,您不能将两台设备关联到一个队列。两个设备需要两个队列。但是...如果您阅读clEnqueueMigrateMemObjects, 的文档,它会说:

通常,内存对象会隐式迁移到使用内存对象的排队命令所针对的设备

换句话说,OpenCL 运行时负责将所需的缓冲区自动迁移到将要使用 thqy 的设备。

问题是,您要在设备之间共享的缓冲区是只读的还是将由内核写入?如果它是只读的,那么您根本不需要任何迁移,只需将您的内核排入队列,运行时将复制一次缓冲区并重用它。如果它是由两个队列(=设备)中的内核编写的,那么您需要正确排序具有事件依赖关系的排队内核;否则内核可能会以错误的顺序运行,缓冲区内容会变得毫无意义。

但无论如何,运行时都会在后台尽可能高效地进行迁移。 clEnqueueMigrateMemObjects 仅作为优化有用 - 如果您想手动将内存传输与内核执行重叠。在尝试使用 clEnqueueMigrateMemObjects 的任何技巧之前,我会专注于让应用程序可靠运行。

【讨论】:

  • 你好 Huseyin 和 Mogu,这个信息对我非常有用。感谢你们俩。我想我在这里有几个选择,我会探索。再次感谢您的帮助
猜你喜欢
  • 2017-08-07
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 2017-01-16
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多