Opencl 明智地使用GPU和CPU

Opencl 明智地使用GPU和CPU,opencl,Opencl,我是OpenCL的新手,刚刚开始学习。我想知道是否有可能在GPU上执行几个线程,在CPU上执行其余的线程?换句话说,如果我启动100个线程并假设我有8个核心CPU,那么100个线程中的8个线程是否有可能在CPU上执行,其余92个线程将在GPU上运行?OpenCL能否帮助我顺利完成这项工作?OpenCL代码是在运行时为所选设备(CPU,GPU型号)编译的 您可以切换用于不同任务的目标,但您不能(根据我所知的任何实现)在CPU和GPU之间分割同一任务您可以使用多个openCL设备来处理您的算法,但工

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

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


您可以切换用于不同任务的目标,但您不能(根据我所知的任何实现)在CPU和GPU之间分割同一任务

您可以使用多个openCL设备来处理您的算法,但工作负载需要进行足够精细的分区,以便跨设备的工作得到适当平衡,否则,开销可能会使运行时变得更糟糕

在关于使用多个OpenCL设备的文章中有明确的说明,因此我的回答是,是的,您可以将工作平顺地分配给多个设备执行,如果且仅当您的调度算法足够聪明,能够平衡整个事情

我想知道是否有可能在GPU上执行几个线程,在CPU上执行其余的线程

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

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

这并不意味着你不能让两个人都做同一件事

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

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

我发现更好的方法是让CPU在GPU工作时处理不同的任务。可能是为GPU准备下一项工作,或者对GPU的结果进行后处理。有时这是正常的代码。有时是OpenCL

不,这根本不是OpenCL的工作原理。哦…@Talonmes那么我如何才能完成这样的工作?在主机端使用Pthreads?这里可以找到一些相关的问题,我无法清楚地理解。我正在使用nVIDIA GPU,我想,这个技巧也可以使用他们的GPU,对吗?是的,你可以。但是正如我所说的,只有当你有一个很好的调度算法,BTW有很多变量你必须考虑做一个很好的变量,比如内存传输开销,共享内存的使用,你的内核使用的寄存器有多大,所有这些都会影响负载平衡调度器。您必须避免它,否则您的GPU将停留在没有工作的大部分时间,因为CPU忙于计算,无法处理事件。看看这篇关于有时无法并行化算法的优秀文章,在这种情况下,CPU的工作速度比GPU快,所以我想把这样的任务交给CPU,让GPU以更好的方式完成它可以完成的工作。我读了一些关于CUDA和OpenCL之间性能差异的研究论文,发现OpenCL的性能并不比CUDA好,所以除了可移植性,是否值得在OpenCL上投入一些时间来获得性能优势?事实上,有时算法没有并行性可利用,因此在CPU上保持并行性是有意义的,特别是如果你能给GPU一些其他的事情去做。就这一讨论而言,CUDA与OpenCL并不相关。