pyOpenCL与opencl4py的区别
今天我在 stackoverflow 上看到一个帖子(可以查看 这里):
我们正在开发 opencl4py,这是一个更高级的绑定库。这个项目使用了 CFFI,所以它可以在 Pypy 上运行。
我们在使用 pyopencl 时遇到的主要问题是,当你执行 'import pyopencl' 时,它会进行 OpenCL 的初始化,并且在使用 NVIDIA 驱动时会占用整个虚拟内存,这样就会导致无法正确地进行进程分叉,从而有效地禁用了多进程(没错,我们认为使用 pyopencl 会禁用多进程,至少在 NVIDIA 的情况下是这样)。而 opencl4py 则采用了懒加载的方式进行 OpenCL 初始化,解决了这个“导入地狱”的问题。
后来,它还增加了一些不错的功能,比如超级简单的二进制程序缓存等等。可惜的是,文档有点简略。学习它如何工作的最好方法就是查看测试用例。
因为还有 pyOpenCL,我在想这两个包之间有什么区别。有没有人知道哪里可以找到这两个包的优缺点概述?
编辑:为了包含 benshope 的评论,我也想知道:“禁用多进程”是什么意思?是说不能同时在多个设备上运行内核吗?
1 个回答
3
据我所知,目前没有这样的概述。我会尽量列出一些关键点:
- pyOpenCL是一个成熟的项目,用户群体相对较大。它有教程、常见问题解答等。而opencl4py是在2014年3月出现的,只有单元测试和文档,没有教程和常见问题解答。
- pyOpenCL是一个原生的cPython扩展,而opencl4py使用cffi,这意味着它可以在PyPy上运行(而pyOpenCL不可以),并且在cPython版本更改时不需要重新编译。
- PyOpenCL有一些额外的功能,比如随机数生成器和与OpenGL的兼容性。
- opencl4py在三星的实际生产场景中经过了广泛测试,并且正在积极开发中。
“禁用多进程”是什么意思?比如,它不能同时在多个设备上运行内核吗?
当然可以,我想说的是,在导入pyopencl之后,使用os.fork()或multiprocessing.Process()会导致NVIDIA OpenCL用户空间库崩溃。在导入时进行操作总是个坏主意。