欢迎使用Pycuda的文档!

pycuda让你很容易,pythonic访问 NvidiaCUDA 并行计算api。cuda api的几个包装器已经存在——那么为什么需要pycuda呢?

  • 对象清理绑定到对象的生存期。这个成语,常被称为 RAII 在C++中,更容易编写正确的、无泄漏和无崩溃的代码。pycuda也知道依赖关系,因此(例如)在分配给它的所有内存都被释放之前,它不会与上下文分离。

  • 方便。抽象 pycuda.compiler.SourceModulepycuda.gpuarray.GPUArray 使cuda编程比nvidia基于c的运行时更加方便。

  • 完整性。如果您愿意的话,pycuda会将cuda的驱动程序api的全部功能交给您使用。

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

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

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

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

import pycuda.autoinit
import pycuda.driver as drv
import numpy

from pycuda.compiler import SourceModule
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
  const int i = threadIdx.x;
  dest[i] = a[i] * b[i];
}
""")

multiply_them = mod.get_function("multiply_them")

a = numpy.random.randn(400).astype(numpy.float32)
b = numpy.random.randn(400).astype(numpy.float32)

dest = numpy.zeros_like(a)
multiply_them(
        drv.Out(dest), drv.In(a), drv.In(b),
        block=(400,1,1), grid=(1,1))

print(dest-a*b)

(这个例子是 examples/hello_gpu.py 在pycuda源代码发行版中。)

从表面上看,这个程序将打印一个满是零的屏幕。在幕后,发生了很多有趣的事情:

  • pycuda已经编译了cuda源代码并将其上传到卡上。

    注解

    此代码不必是常数——您可以轻松地使用Python生成要编译的代码。见 元程序设计 .

  • pycuda的numpy交互代码已经在设备上自动分配了空间,复制了numpy数组 ab 结束,启动400x1x1单块网格,并复制 dest 回来。

    请注意,您也可以将您的数据保持在内核调用之间的卡上——不必总是复制数据。

  • 看看这个例子中怎么没有清除代码?那不是因为我们太懒了就跳过了。根本不需要。Pycuda将自动推断出需要进行哪些清理,并为您进行清理。

好奇吗?我们开始吧。