明智地使用GPU和CPU

时间:2012-06-12 20:39:36

标签: opencl

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

3 个答案:

答案 0 :(得分:5)

  

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

  

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

没有。该描述表明您正在查看GPU& CPU作为单个计算资源。你不能这样做。

这并不意味着你不能同时处理同一个任务。

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

...但是...

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

我发现更好的方法是让GPU在GPU运行时处理不同的任务。也许准备GPU的下一部分工作,或者后处理GPU的结果。有时这是正常的代码。有时它是OpenCL。

答案 1 :(得分:2)

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

AMD OpenCL Programming Guide section 4.7清楚地说明了使用多个OpenCL设备,所以我的回答是,是的,您可以将工作划分为多个设备,顺利执行,当且仅当您的调度算法足够智能以平衡整个事情。

答案 2 :(得分:0)

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

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