直接Cpu线程或OpenCL

时间:2013-04-28 13:43:43

标签: multithreading opencl cpu

我搜索了各种问题(和网络),但没有找到任何满意的答案。

我很好奇是否使用线程直接加载CPU的核心或使用OpenCL实现。 OpenCl是否只是为了使多处理器/内核更具可移植性,这意味着将代码移植到GPU或CPU或OpenCL更快更高效?我知道GPU有更多的处理单元,但这不是问题。是代码中的间接多线程还是使用OpneCL?

抱歉,我有另一个问题......

如果IGP与Descrete Graphics Card共享PCI线路并且其驱动程序无法在Windows 7下加载,我必须假设它不可用,即使您只想使用集成GPU的处理内核。这是正确的还是没有驱动程序访问IGP的方法。

3 个答案:

答案 0 :(得分:1)

在最近使用英特尔opencl工具的实验中,我们发现opencl性能非常类似于基于CUDA和基于内在化的基于gcc和icc的AVX代码 - 比早期实验(几年前)更好,我们看到opencl表现更差。

答案 1 :(得分:0)

编辑:正如@Yann Vernier在评论部分指出的那样,我对我使用的术语不够严格。所以在这篇文章中我使用术语thread作为workitem的同义词。我不是指CPU线程。

我无法将OCL与允许使用CPU的不同内核的任何其他技术进行比较,因为到目前为止我只使用了OCL。
但是我可能会带来一些关于OCL的意见,特别是我不同意ScottD。
首先,即使开发在GPU上运行的OCL内核在CPU上运行也是如此,但这并不意味着它将是高效的。原因很简单, OCL在CPU和GPU上的工作方式不同。要更好地理解它的不同之处,请参阅“heterogeneous computing with opencl”的第6章。
总而言之,虽然GPU将同时在给定工作组内启动一堆线程,但CPU将在同一工作组内的核心一个线程上执行。另请参阅the standard关于OCL支持的两种不同类型的编程模型的观点3.4。这可以解释为什么OCL内核在CPU上的效率低于“经典”代码:因为它是针对GPU设计的。
开发人员是将目标CPU还是GPU不是“严肃工作”的问题,而只是依赖于最适合您需求的编程模型类型。此外,OCL支持CPU的事实很好,因为它可以在没有配备适当GPU的计算机上优雅地降级(尽管必须很难找到这样的计算机)。

关于AMD平台,我注意到在带有ATI的笔记本电脑上CPU也有问题。我观察到一些代码和崩溃的性能也很低。但原因是因为处理器是英特尔。 AMD平台将声明即使它是Intel CPU也可以使用CPU设备。但是它不能像它应该的那样有效地使用它。当我运行与CPU相同的完全相同的代码但在安装(和使用)英特尔平台后,所有问题都消失了。这是表现不佳的另一个可能原因。
关于iGPU,它不共享PCIe线路,它在CPU芯片上(至少是Intel),是的,你需要驱动程序才能使用它。我假设您尝试安装驱动程序并收到“您的计算机不符合最低要求......”或类似内容的消息。我想这取决于计算机,但就我而言,我的桌面配备了NVIDIA和i7 CPU(它有一个HD4000 GPU)。为了使用iGPU我首先在BIOS中启用它,这允许我安装驱动程序。当然,显示器一次只使用两个GPU中的一个(取决于BIOS设置),但我可以使用OCL访问这两个。

答案 2 :(得分:-2)

根据我的经验,OpenCL支持将CPU用作计算设备并不适合认真工作。性能损失太大了。似乎还存在操作问题,至少在AMD代码生成方面存在问题。我所看到的性能损失与AMD和英特尔代码生成一样,但对AMD来说更严重。对于一个简单的测试,我发现gcc代码生成比OpenCL代码生成快2X-10X。一个原因是OpenCL不支持SSE,AVX和AVX2的内部函数。这些内在函数对于高效的S​​SE,AVX和AVX2代码生成至关重要。另一个原因是当前的OpenCL代码生成忽略了一些有用的处理器指令。例如,popcount函数的AMD和Intel OpenCL代码生成都无法使用处理器的popcnt指令。但即使避免了这些缺点,gcc代码生成对我的测试来说仍然更快。我认为原因是gcc x86代码生成代表了数百名工程师多年的工作。另一方面,OpenCL x86代码生成相对较新。我遇到的AMD代码的操作问题是使用大的工作项计数值。在我的情况下,工作项计数超过处理器代码计数的4倍会导致线程不执行屏障调用。如果性能很重要,请花时间使用gcc代码生成和OpenCL代码生成来对代码进行基准测试。