OpenCL可以在CPU上使用了吗?

OpenCL可以在CPU上使用了吗?,opencl,mpi,cluster-computing,hpc,Opencl,Mpi,Cluster Computing,Hpc,在实验室中,我们有一个异构群集设置,有许多Intel CPU、一些AMD CPU和一些Nvidia GPU 对于HPC开发,我知道我可以在这个设置中编写一次并在任何地方运行的东西是OpenCL(甚至不是Java;)。但在实验室里,我们非常习惯于使用C或Fortran+MPI来开发完全在CPU上运行的程序,而且可能很少有人需要使用Nvidia的节点来运行CUDA中的某些程序 现在,在一个新项目的开始,我认为能够在MPI+OpenCL中编写代码,并且能够在分布式处理中包括GPU和CPU,运行相同的O

在实验室中,我们有一个异构群集设置,有许多Intel CPU、一些AMD CPU和一些Nvidia GPU

对于HPC开发,我知道我可以在这个设置中编写一次并在任何地方运行的东西是OpenCL(甚至不是Java;)。但在实验室里,我们非常习惯于使用C或Fortran+MPI来开发完全在CPU上运行的程序,而且可能很少有人需要使用Nvidia的节点来运行CUDA中的某些程序


现在,在一个新项目的开始,我认为能够在MPI+OpenCL中编写代码,并且能够在分布式处理中包括GPU和CPU,运行相同的OpenCL代码,这将是非常好的。那么,OpenCL实现是否准备好执行这样的任务呢?如果OpenCL代码在使用英特尔SDK的CPU上运行,我是否可以像使用英特尔编译器编译的多线程C程序那样计算性能?你能指出比较和基准吗?

OpenCL是可移植的,但它不是性能可移植的。您不应该期望OpenCL在任何地方快速运行后都可以编写。为GPU编写的OpenCL代码可能在CPU上运行得很差,我不希望GPU之间有统一的性能,特别是来自不同供应商的GPU

为了回答您的具体问题,基于大量第三方评估,不,我不希望OpenCL在英特尔CPU上击败编写良好的C+OpenMP。原因有很多


请注意,由于问题的广泛性,我的答案上的错误栏非常大。如果能更详细地了解您打算计算什么,那将是非常有帮助的。

我很幸运地在CPU和GPU之间移植了我的OpenCL代码。我的项目是Levenberg Marquardt,我先用C编写调试它,然后将它移植到Intel CPU上的OpenCL以检查结果并进行更多的调试,然后在AMD GPU上进行OpenCL

我发现,要真正跨设备编写好OpenCL代码,最好的技巧是将全局内存缓冲到本地内存,即使您使用的是CPU,因为这通常是GPU上的瓶颈。我在GPU和CPU上发现的第二个瓶颈是内核大小,CPU可以处理比GPU更大的内核,所以请注意用于常量的内存类型,分配了多少本地内存,等等


它已经6个月了,所以可能是固定的,但AMD FFT在Intel CPU、GPU和AMD GPU上工作得很好,但在NVIDIA GPU上却不工作。AMD论坛有一个帖子,认为NVIDIA不支持一些矢量功能

除了其他答案之外,再次强调一个重要的问题:问题非常广泛,绩效将取决于许多您在问题中未提及的因素。您可能已经意识到这些因素,但在中可能会找到一个摘要(乍一看,这个问题似乎与CUDA无关,但许多概念也适用于OpenCL)

OpenCL背后的主要驱动思想之一是(值得注意的是,该页面甚至没有提到OpenCL…)。也就是说,OpenCL旨在为开发人员提供利用所有可用处理资源的可能性,从单个ARM内核到具有数千个内核的多个高端GPU

这种多功能性是有代价的。某些概念是为许多核心架构隐式定制的(或者至少,到目前为止,这似乎是主要的应用领域)。在任何情况下,“优化”OpenCL程序通常只意味着“调整它以便在某个特定架构上运行得特别快”。像矢量化或共享内存这样的东西在一个平台上可能是有利的,或者在另一个平台上根本不可用

有一些可能绕过这一点,或者至少尝试使一个OpenCL程序对其将运行的硬件更加“不可知”。一个明显的选择是查询目标平台属性(例如,首选向量大小或共享内存是否可用),并根据结果启动不同的内核。由于OpenCL中的内置编译器,甚至可以在内核源代码中包含特定于平台的优化,例如通过
#define
s。然而,很难对这种优化的努力与性能增益比率做出一般性的陈述。而且,当内核数量增加,OpenCL编译器变得更好时,更难预测“通用”OpenCL实现(与经过完美调整的C实现相比)可能降低的性能是否迟早不会得到补偿

因此,我的建议是做一些“代表性”任务的基准测试,看看不同设备之间的性能是否具有竞争力,记住每个设备的平均核心数量(以及,最有可能的是,设备的总体异质性)将增加,而OpenCL可能更容易适应这些变化