Python中的GPGPU编程

4 投票
4 回答
2657 浏览
提问于 2025-04-16 02:37

我想在Python中开始学习GPGPU编程。我应该先从pyopencl还是clyther开始呢?它们有什么区别?

4 个回答

0

CLyther 是一种在 C 语言层面上使用的工具,和 OpenCL 以及 PyOpenCL 有点类似。

clyther 之所以被称为“pythonic”,是因为它允许你把 Python 函数作为 OpenCL 的设备或内核函数来使用。

在你的 Python 代码中,你可以直接写

@kernel
@bind('global_work_size' ,'a.size')
@bind('local_work_size' , 1)
def sum(a,b,ret):
    i = clrt.get_global_id(0)
    ret[i] = a[i] + b[i]

sum(clarray1,clarray2,clarray3)
2

我觉得PyOpenCL跟OpenCL的C语言接口更接近,而CLyther则稍微不同。

这意味着如果你已经了解OpenCL,或者打算把其他语言的实现移植到Python上,那么PyOpenCL可能更适合你。另一方面,CLyther在使用上看起来更“符合Python风格”,所以如果你对Python比较熟悉,可能会觉得它的用法更容易理解。

不过这两个库现在都还在测试阶段(Beta),所以你可能会发现它们缺少一些你想要的功能,或者存在一些小问题。

祝你好运!

11

OpenCL分为两个部分。一部分是主机端,通常用C语言编写;另一部分是设备端,使用OpenCL定义的C语言的变种。这个代码在运行时会被编译到设备上(通常是GPU)。

CLyther试图把所有东西都简化。你可以用Python编写主机端代码,而设备端代码则用一种Python的子集来写(类似于Cython)。这样做非常高层次,使用起来也很简单。

PyOpenCL则是一个相对低层次的接口,让你可以用Python来访问OpenCL的API。设备端代码是用OpenCL的C99子集编写的。它让你可以完全控制OpenCL,几乎没有东西被简化。

我对这两者的经验有限,但我的感觉是,一旦它们都成熟,我更倾向于在大多数项目中使用Clyther。因为它更友好,使用起来更容易,这样你就更可能去使用它,而且使用得更多。把代码在Clyther和Python之间来回转换也比在PyOpenCL和Python之间要简单,所以代码的维护和重构应该会更容易。对于那些对性能要求极高的项目,我会选择PyOpenCL。它提供了更好的低层控制,与你的硬件之间的层次更少。最终的性能在PyOpenCL上应该会比Clyther更好。

我不知道这种情况是否会一直持续下去。PyOpenCL可能最终会添加更高层次的构造,而Clyther也可能会增加更低层次的控制。在理想的情况下,Clyther的开发者会把核心架构建立在PyOpenCL之上,这样我们就不需要选择,也能避免重复劳动。不过我怀疑这会发生。

目前来看,PyOpenCL似乎比Clyther更成熟。它起步较早,目标也没有那么宏大。它的文档比Clyther更好,用户社区也看起来更大。两者的代码量相对相似——Clyther大约有4千行Python和4千行C代码,而PyOpenCL大约有7千行Python代码和9千行C++代码。这些数字是大致的(包括构建系统、示例等),所以不应该被视为有更深的含义。

撰写回答