CPU设备上的OpenCL - 引擎盖下会发生什么?

时间:2014-09-30 05:58:33

标签: c++ multithreading opencl cpu core

因此,如果我在CPU设备上运行openCL内核函数而不是 GPU设备,那么内核是否会自动使用CPU上的所有内核?例如我的系统说我在CPU上有4个内核,内核会自动使用所有4个内核吗?

如果上述情况属实,那么是否意味着在单个CPU设备上运行openCL内核将等同于使用标准的std :: threads(假设我们正在使用C ++)来执行相同的任务?

我问,因为在我当前的计算机上,openCL似乎只能访问一个CPU而没有GPU。因此,如果我使用openCL来并行化我的代码,如果它基本上与基于std :: thread的实现做同样的事情,那么它似乎有点过分。

2 个答案:

答案 0 :(得分:3)

如果没有实际访问您实际使用的OpenCL实现,很难确切地说它是如何实现的。我确信有多种方法可以解决这个问题(在某种程度上取决于操作系统和其他因素),但最可能的情况是它以某种方式使用主机操作系统的线程系统。 OpenCL实现通常不是用C ++编写的,因此它可能不是std::threads,但几乎可以肯定的是基础因素是该系统std::threads的基础。

当您只有一个可用的CPU设备时,使用OpenCL的目的/好处是,您可以透明地从这样的系统转换到具有GPU设备的系统,而无需使用两组不同的代码。

调试在这种环境中行为不当的OpenCL内核也不那么困难(在任何人抱怨之前,我说不那么困难,不容易,有一个原因) - 当然假设两种环境中的行为相同,当然。

答案 1 :(得分:2)

英特尔提供的OpenCL SDK使用了。它比普通线程更有效,因为它利用了TBB提供的复杂调度和分区算法,以实现更好的负载平衡,从而更好地利用CPU。