歡迎使用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將自動推斷出需要進行哪些清理,并為您進行清理。
好奇嗎?我們開始吧。
目錄#
請注意,本指南不會解釋CUDA編程和技術。請參考英偉達的 programming documentation 為此。
Pycuda也有自己的 web site ,您可以在其中找到更新、新版本、文檔和支持。