2011-11-15 42 views
4

我有一个问题:快速线性系统求解(我有很多这样的系统)。我将使用GPU和OpenCL来解决它。PyOpenCL vs Clyther vs纯OpenCL和C99:新手最适合什么?

我喜欢动态语言如Ruby或Python,我得到了使用低级语言,比如C.

的习惯了

所以,我有两个同时发生的目标:

  1. 制定这样的OpenCL解决方案以尽可能少的努力尽可能快地解决线性系统。
  2. 不要在性能上松动很多。为了方便起见,我不希望支付2-10倍的减速,但我已经准备好用高级语言支付30-50%的费用。

对我来说最好的例子是:几乎Python代码在OpenCL C中编译几乎没有浪费。

我发现了这样的解决方案:纯OpenCL C,PyOpenCL,Clyther

我该从什么开始?

+1

在C语言中做尽可能多的事来做计算,使用类似Cython的东西来绑定到你自定义的C库。 – millimoose

回答

4

我的观点是,试图在OpenCL中使用动态语言是不值得的。你会失去大部分你喜欢Python的东西,并且可能不会为你的努力节省很多时间。

但我只是说在Python中编写OpenCL内核。还有主机应用程序,它准备并提交内核。如果您喜欢Python,我建议您使用PyOpenCL等包装来编写纯Python中的主机应用程序以访问OpenCL API。然后,用纯OpenCL写你的内核,让你的Python应用程序按原样提交它们。我相信这会从Python中获得大部分所需,而在性能上几乎没有任何成本。

+2

PyOpenCL写得很好。它为我节省了很多时间。我能够修改我的纯Python/Numpy Mandelbrot计算,使其速度提高了250倍以上。 Numpy也不慢!它利用它C编译代码很多,但PyOpenCL版本使它看起来像一个slu。。为了达到目的,我正在为两种版本的算法Numpy数组提供支持,因为PyOpenCL支持它们。 – Demolishun

1

用OpenCL编程最难的部分是并行化你的算法 - 这意味着编写你的内核。很可能,你将花费你大部分的时间来调整和理解你的OpenCL C代码,而AFAIK是你编写内核的唯一选择。

既然如此,我说的是纯粹的C/OpenCL实现。一旦将“样板文件”OpenCL API部分启动并运行,您不太可能需要更改大部分内容。如果有的话,你会玩的工作组大小,你传递给clEnqueueNDRangeKernel

如果你是一个CL的新手,我说保持简单。为问题添加另一个软件层 - 特别是定义为线性求解器的问题 - 只会使您的工作复杂化。

编辑:

我要补充,当你使用标准的OpenCL API,你扩大你的在线帮助/支持的潜力。如果您选择使用其中一种Python绑定,则可能会限制您对这些社区人员的潜在支持。