明智地使用GPU和CPU

4

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


1
不,那完全不是 OpenCL 的工作方式。 - talonmies
哦...@talonmies 那我该如何实现这样的工作呢?使用主机端的Pthreads吗? - username_4567
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。

有时候你不能将一个算法并行化,这种情况下CPU的工作速度比GPU更快,所以我想把这样的任务交给CPU,让GPU去做它能够更好地完成的工作。我读了一些关于CUDA和OpenCL性能差异的研究论文,发现OpenCL并不比CUDA表现更好,那么除了可移植性之外,投资时间学习OpenCL是否值得为了获得性能上的好处呢? - username_4567
有时算法没有可利用的并行性,因此将其保留在CPU上是有意义的,特别是如果您可以让GPU做其他事情。就这个讨论而言,CUDA与OpenCL无关紧要。 - Paul S

2
你可以使用多个OpenCL设备来处理你的算法,但工作负载需要被细致地分割,以便跨设备的工作得到适当平衡,否则开销可能会使你的运行时间变得更糟。在AMD OpenCL编程指南第4.7节中清楚地说明了如何使用多个OpenCL设备,所以我的答案是,如果且仅如果你的调度算法足够智能化以平衡整个过程,那么你可以将要执行的工作划分给多个设备顺畅地完成。

我正在使用nVIDIA的GPU,我猜这个技巧在他们的GPU上也可以工作,对吗? - username_4567
可以的。但是就像我说的那样,只有当你有一个好的调度算法时才能实现,而且你必须考虑许多变量来制定一个好的算法,例如内存传输开销、共享内存的使用、内核使用寄存器的大小等,所有这些都会影响负载平衡调度程序。 - ardiyu07
请注意,过载CPU非常容易。否则,您的GPU将大部分时间处于无工作状态,因为CPU正在忙于计算并且无法处理事件。请查看英特尔关于设备分裂的优秀文章。 - Kentzo

0

OpenCL代码在运行时针对所选设备(CPU、GPU型号)进行编译。

您可以为不同的任务切换使用的目标,但是(就我所知的任何实现)不能将相同的任务分配给CPU和GPU。


在这里可以找到一些相关的问题:https://dev59.com/Jk_Sa4cB1Zd3GeqP8w-3?rq=1,但我没能够完全理解它。 - username_4567

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接