歡迎使用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將自動推斷出需要進行哪些清理,并為您進行清理。

好奇嗎?我們開始吧。

目錄#

請注意,本指南不會解釋CUDA編程和技術。請參考英偉達的 programming documentation 為此。

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

索引和表格#