PyOpenCL、Clyther与纯OpenCL和C99:新手最佳选择是什么?
我遇到了一个问题:我需要快速解决线性方程组(我有很多这样的方程组)。我打算用GPU和OpenCL来解决这个问题。
我喜欢动态语言,比如Ruby或Python,现在已经不太习惯使用像C这样的低级语言了。
所以我有两个目标:
- 尽量用最少的努力,开发出一个快速的OpenCL解决方案来解决线性方程组。
- 尽量不牺牲太多性能。我不想为了方便而付出2到10倍的速度损失,但我愿意为使用高级语言而接受30%到50%的性能下降。
对我来说,最理想的情况是:几乎可以把Python代码几乎毫无浪费地编译成OpenCL C。
我找到了这样的解决方案:纯粹的OpenCL C,PyOpenCL,Clyther。
我应该从哪个开始呢?
2 个回答
用OpenCL编程最难的部分就是让你的算法能够并行运行,也就是要写你的内核代码。你很可能会花大部分时间去调整和理解你的OpenCL C代码,毕竟这也是你写内核的唯一选择。
既然如此,我建议你直接用纯C和OpenCL来实现。一旦你把基本的OpenCL API部分搭建好并运行起来,之后你就不太需要去改动它了。如果有需要改动的,可能只是调整一下你传给clEnqueueNDRangeKernel
的工作组大小。
如果你是OpenCL的新手,我建议你保持简单。给问题增加一个额外的软件层,尤其是像线性求解这样的问题,只会让事情变得更加复杂。
补充一下:
我还想说,使用标准的OpenCL API可以让你获得更多的在线帮助和支持。如果你选择使用某个Python绑定,你可能会把支持的范围限制在那些社区的人。
我觉得把动态语言强行塞进OpenCL里其实不太值得。这样做会让你失去大部分喜欢Python的地方,而且最后可能也不会省下多少时间。
不过我说的只是用Python来写OpenCL的内核(也就是处理数据的部分)。还有一个主程序,它负责准备和提交这些内核。如果你喜欢Python,我建议你用纯Python来写这个主程序,配合像PyOpenCL这样的工具来访问OpenCL的接口。然后,你可以用纯OpenCL来写你的内核,让你的Python程序直接提交这些内核。我相信这样做可以让你在使用Python时获得大部分想要的功能,而且几乎不会影响性能。