【问题标题】:Translating C code to OpenCL将 C 代码转换为 OpenCL
【发布时间】:2012-12-13 14:20:46
【问题描述】:

我正在尝试将用 C 编写的较小程序翻译成 openCL。我应该将一些输入数据传输到 GPU,然后使用连续的内核调用在设备上执行所有计算。

但是,由于使用的数据量很大,我必须避免在 CPU 和 GPU 之间来回传输数据,因此我在处理不适合并行化的部分代码时遇到了困难。

有没有办法在没有并行处理的情况下执行一些内核,以便我可以用它们替换这些代码部分?这是通过将全局工作大小设置为 1 来实现的吗?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    是的,您可以在 OpenCL 设备上串行执行代码。为此,请像在 C 中一样编写内核代码,然后使用 clEnqueueTask() 函数执行它。

    【讨论】:

      【解决方案2】:

      您可以管理两个设备

      • 用于高度并行化代码的 GPU
      • 用于顺序代码的 CPU

      这有点复杂,因为您必须按设备管理一个命令队列,以将每个内核调度到适当的设备上。

      如果设备属于同一平台(通常是 AMD),您可以使用相同的context,否则您将不得不为 CPU 创建一个更多的上下文。

      此外,如果您想拥有更细粒度的 CPU task-parallelization,如果您的 CPU 支持,您可以使用 device-fission

      【讨论】:

      • 感谢您的回答。我是 openCL 的新手,所以如果这是一个愚蠢的问题,请原谅我,但是如果我有两个上下文(英特尔 CPU 和 nVidia GPU),这是否意味着我仍然需要来回发送数据?
      • 您可以将 pinned-memory 与 memory-mappings 一起使用:CPU 可以直接访问内存,GPU 可以将必要的部分复制到其全局内存中。如果与处理相比,您有很多数据移动,您可能需要调整您的算法。在理想情况下,您将能够同时运行 CPU 和 GPU。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 2010-09-17
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多