5

今天我偶然发现了stackoverflow中的一篇文章(另请参见此处):

我们正在开发opencl4py,更高级别的绑定。这个项目使用 CFFI,所以它适用于 Pypy。

我们在使用 pyopencl 时遇到的主要问题是“import pyopencl”会执行 OpenCL 初始化,并在 NVIDIA 驱动程序的情况下占用整个虚拟内存,从而阻止正确的分叉并有效地禁用多处理(是的,我们声称使用 pyopencl 至少在 NVIDIA 上会禁用多处理)。opencl4py 使用惰性 OpenCL 初始化,解决了这个“导入地狱”。

后来,它获得了一些不错的功能,例如超级简单的二进制程序缓存等。不幸的是,文档有点简短。了解其工作原理的最佳方法是通过测试。

由于还有 pyOpenCL,我很想知道这两个包之间的区别是什么。有人知道我在哪里可以找到这两个软件包的优缺点概述吗?

编辑:包括 benshope 的评论,因为我也会感兴趣:“禁用 [s] 多处理”是什么意思?就像,它不能一次在多台设备上运行内核?

4

1 回答 1

3

据我所知,没有这样的概述。我将尝试列出一些关键点:

  • pyOpenCL 是一个成熟的项目,拥有比较大的用户群。有教程、FAQ等。opencl4py出现在03/2014;没有教程、FAQ 等等——只有单元测试和文档字符串。
  • pyOpenCL 是一个原生的 cPython 扩展,而 opencl4py 使用cffi,因此它可以在PyPy上工作(pyOpenCL 不能),并且每次 cPython 更改版本时都不需要重新编译。
  • PyOpenCL 具有附加功能,例如随机数生成器和 OpenGL 互操作性。
  • opencl4py 在三星生产的真实世界场景中进行了广泛的测试,并且正在积极开发中。

“禁用[s]多处理”是什么意思?就像,它不能一次在多台设备上运行内核?

当然可以,我想说的是,在导入 pyopencl 之后,os.fork() 或 multiprocessing.Process() 会导致 NVIDIA OpenCL 用户空间库内部崩溃。在导入期间做工作总是一个坏主意。

于 2014-05-05T09:33:41.520 回答