欢迎使用Pycuda的文档!#
pycuda让你很容易,pythonic访问 Nvidia 的 CUDA 并行计算api。cuda api的几个包装器已经存在——那么为什么需要pycuda呢?
对象清理绑定到对象的生存期。这个成语,常被称为 RAII 在C++中,更容易编写正确的、无泄漏和无崩溃的代码。pycuda也知道依赖关系,因此(例如)在分配给它的所有内存都被释放之前,它不会与上下文分离。
方便。抽象
pycuda.compiler.SourceModule
和pycuda.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数组 a 和 b 结束,启动400x1x1单块网格,并复制 dest 回来。
请注意,您也可以将您的数据保持在内核调用之间的卡上——不必总是复制数据。
看看这个例子中怎么没有清除代码?那不是因为我们太懒了就跳过了。根本不需要。Pycuda将自动推断出需要进行哪些清理,并为您进行清理。
好奇吗?我们开始吧。
使用/增强PyCUDA的其他软件#
根据定义,这份清单是不完整的!如果您知道其他您认为应该在这里列出的软件,请提交PR!
目录#
请注意,本指南不会解释CUDA编程和技术。请参考英伟达的 programming documentation 为此。
Pycuda也有自己的 web site ,您可以在其中找到更新、新版本、文档和支持。