欢迎使用PyOpenCL的文档!

PyOpenCL使您可以方便地通过Pythonic访问 OpenCL 并行计算API。是什么让PyOpenCL与众不同?

  • 对象清理绑定到对象的生存期。这个成语,常被称为 RAII 在C++中,编写更为正确的、无泄漏和无崩溃的代码更容易。

  • 完整性。如果您愿意,PyOpenCL可以将OpenCL的API的全部功能交给您使用。每一个模糊的 get_info() 查询和所有CL调用都是可访问的。

  • 自动错误检查。所有错误都会自动转换为Python异常。

  • 速度。PyopCl的底层是用C++编写的,所以上面的所有细节都是免费的。

  • 有用的文件。你在看。;

  • 自由许可证。PyOpenCL是 MIT license 免费供商业、学术和私人使用。

举个例子,给你一个印象:

#!/usr/bin/env python

import numpy as np
import pyopencl as cl

a_np = np.random.rand(50000).astype(np.float32)
b_np = np.random.rand(50000).astype(np.float32)

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)

mf = cl.mem_flags
a_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a_np)
b_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b_np)

prg = cl.Program(ctx, """
__kernel void sum(
    __global const float *a_g, __global const float *b_g, __global float *res_g)
{
  int gid = get_global_id(0);
  res_g[gid] = a_g[gid] + b_g[gid];
}
""").build()

res_g = cl.Buffer(ctx, mf.WRITE_ONLY, a_np.nbytes)
prg.sum(queue, a_np.shape, None, a_g, b_g, res_g)

res_np = np.empty_like(a_np)
cl.enqueue_copy(queue, res_np, res_g)

# Check on CPU with Numpy:
print(res_np - (a_np + b_np))
print(np.linalg.norm(res_np - (a_np + b_np)))
assert np.allclose(res_np, a_np + b_np)

(你可以找到这个例子 examples/demo.py 在PyOpenCL源代码发行版中。)

教程

使用或增强PyOpenCL的软件

  • Jon Roose's pyclblas (code) makes BLAS in the form of clBLAS available from within pyopencl code.

    两个早期的包装器仍然可用:一个由 Eric Hunsberger 一个接一个 Lars Ericson .

  • Cedric Nugteren为 CLBlast OpenCL BLAS库: PyCLBlast .

  • 格雷戈瑟尔哈默的 gpyfft 为AMD的openclfft库clFFT提供Python包装器。

  • 博格丹奥潘丘克 reikna 提供各种基于GPU的算法(FFT、随机数生成、矩阵乘法),用于 pyopencl.array.Array 物体。

  • Troels Henriksen、Ken Fris Larsen和Cosmin Oancea's Futhark 编程语言提供了一种很好的方法来编写嵌套的并行程序,并对数据进行缩减和扫描 pyopencl.array.Array 实例。

  • Robbert Harms和Alard Roebroeck的 MOT 提供各种GPU支持的非线性优化算法和MCMC采样例程,用于并行优化和多问题采样。

如果你知道一个软件,你觉得应该在这个名单上,请让我知道,或者,更好的,发送一个补丁!

目录

请注意,本指南没有解释OpenCL编程和技术。请向官方咨询 Khronos OpenCL documentation 为此。

PyOpenCL也有自己的 web site ,您可以在其中找到更新、新版本、文档和支持。