在编写openCL代码时,它如何在没有GPU的单核机器上执行?

嘿所有,我目前正在将FORTRAN 77的光线跟踪器移植到C进行研究项目。

移植完要素后,问题是我们如何进行并行化。
在实验室中,我可以访问几台不同的Opteron机器,有2到8个内核,但没有GPU(目前)。 我们正在运行64b gentoo。

GPGPU版本(非常)是可取的,但项目中只有一个程序员,维护单独的非GPU和GPU版本不是一种选择。
此外,代码将是GPL,并且我们希望看到它被其他可能具有完全不同硬件的人使用。

因此,整个程序必须易于编译/运行,而无需GPU或甚至多核系统。
OpenCl似乎是一个不错的选择,因为它可以在没有GPU的机器上运行,但是这个代码将如何在单核或32b系统上运行?
是否有可能以这样的方式编写代码,以便在没有openCL的情况下轻松编译代码?

目前有四种主要的OpenCL实现:AMD,nVidia(Cuda),Apple,Intel,很快就会有更多: OpenCL实现 。 OpenCL不是专门针对GPU计算的语言,它被设计为异构设备的通用计算语言。 例如,即使没有GPU和任何非AMD CPU(当然是x86),你也可以使用AMD实现。

是否有可能以这样的方式编写代码,以便在没有openCL的情况下轻松编译代码?

正如你所说,这是一个单人项目,我怀疑它是值得的。

该代码如何在单核或32b系统上运行?

与任何本机程序一样好。 您可以通过OpenCL矢量类型访问SIMD。 您可以通过工作组配置处理线程。

但是,不要指望使用相同的内核/工作组设置可以从每台设备中获得100%的性能。 可以进行大量特定于设备的调整( OpenCL CPU Tutorial开始 )。

我会说去OpenCL。 它为您的应用程序提供了更多的可能性,并且它的平台是独立的。

利用OpenCL和C99的通用性并使用预处理器来处理差异可能是可行的。 然后,您将拥有一个C99和OpenCL代码库。 这是SmallPT-GPU采用的方法

但是,CPU的OpenCL实现应该与任何便携式标量C代码一样好,如果您使用OpenCL的矢量类型来允许便携式SIMD,则更好。