4

我是 OpenCL 的新手,刚开始学习。我想知道是否可以在 GPU 上执行几个线程并在 CPU 上执行剩余线程?换句话说,如果我启动 100 个线程并假设我有 8 个核心 CPU,那么是否有可能 100 个线程中的 8 个线程将在 CPU 上执行,其余 92 个线程将在 GPU 上运行?OpenCL 可以帮助我完成这项工作吗?顺利?

4

3 回答 3

5

我想知道是否可以在 GPU 上执行几个线程并在 CPU 上执行剩余线程?

是的

换句话说,如果我启动 100 个线程并假设我有 8 个核心 CPU,那么是否有可能 100 个线程中的 8 个线程将在 CPU 上执行,而剩余的 92 个线程将在 GPU 上运行?

不,该描述表明您将 GPU 和 CPU 视为单个计算资源。你不能那样做。

这并不意味着你不能让两者都从事同一个任务。

  • GPU 和 CPU 将被视为独立的 OpenCL 设备。
  • 您可以编写可以与多个设备通信的代码。
  • 您可以为多个设备编译相同的内核。
  • 您可以要求多个设备同时工作。

...但...

  • 这些都不是自动的。
  • OpenCL 不会在多个设备之间拆分单个 NDRange(或等效)调用。
  • 这意味着您必须自己在两台设备之间安排任务。
  • 速度上会有很大的差异,因此保持最佳状态需要超过“这里 92,那里 8”。

我发现更好的是让 CPU 在 GPU 工作时处理不同的任务。也许为 GPU 准备下一个工作,或者对来自 GPU 的结果进行后处理。有时这是正常的代码。有时它是 OpenCL。

于 2012-06-13T08:04:48.670 回答
2

您可以使用多个 openCL 设备来处理您的算法,但是需要对工作负载进行足够巧妙的分区,以便正确平衡设备之间的工作,否则开销可能会使您的运行时变得更糟。

AMD OpenCL 编程指南第 4.7 节中明确说明了使用多个 OpenCL 设备,所以我的回答是,是的,当且仅当您的调度算法足够智能以平衡整个事情。

于 2012-06-13T01:16:10.167 回答
0

openCL 代码在运行时为所选设备(CPU、GPU 型号)编译

您可以切换用于不同任务的目标,但不能(使用我知道的任何实现)在 CPU 和 GPU 之间拆分相同的任务

于 2012-06-12T20:47:23.927 回答