PyCUDA documentation / Документация PyCUDA: Welcome to PyCUDA’s documentation! http://documen.tician.de/pycuda/#welcome-to-pycuda-s-documentation

Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

PyCUDA дает вам простой, Pythonический доступ к API параллельных вычислиний Nvidia CUDA. Некоторые обертки CUDA API уже существуют - поэтому, зачем нужна еще и PyCUDA?

wuffur 02.08.11 в 07:11

0

Очистка объектов привязана к времени жизни объектов. Эта идиома, часто называемая RAII в C++, дает более легкий способ написать корректный и свободный от утечек памяти и падений системы код. PyCUDA знает о зависимостях тоже, поэтому (например) она не хочет отделяться от контекста до того, каким образом выделенная в ней память также освободится.

wuffur 02.08.11 в 07:17

0

Удобство. Абстракции наподобие pycuda.compiler.SourceModule и pycuda.gpuarray.GPUArray делают программирование на CUDA еще более удобным, чем с использованием Nvidia основанном на Си компилируемой runtime (компилятором nvcc).

wuffur 02.08.11 в 07:19

0

Полнота. PyCUDA предоставляет полную мощь API CUDA драйвера в ваше распоряжение, если вы этого пожелаете.

wuffur 02.08.11 в 07:20

0

Автоматическая проверка ошибок. Все ошибки в CUDA автоматически переводятся в выражении Python.

wuffur 02.08.11 в 07:20

0

Скорость. Базовый слой PyCUDA написан на C++, поэтому он практически свободен от всех описанных его тонкостей.

wuffur 02.08.11 в 07:23

0

Полезная Документация. Вы на нее смотрите. :)

wuffur 02.08.11 в 07:23

0

Это пример, который даcт вам представление о PyCUDA:

wuffur 02.08.11 в 07:24

0

Это пример, который создает вам впечатление об использовании PyCUDA:

wuffur 02.08.11 в 07:24

0
+1

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

wuffur 02.08.11 в 07:24

0

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];
}
""")

wuffur 02.08.11 в 07:24

0

multiply_them = mod.get_function("multiply_them")

wuffur 02.08.11 в 07:24

0

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

wuffur 02.08.11 в 07:24

0

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

wuffur 02.08.11 в 07:24

0

print dest-a*b

wuffur 02.08.11 в 07:26

0

(Это пример examples/hello_gpu.py в дистрибутиве исходного кода PyCUDA.)

wuffur 02.08.11 в 07:26

0

На поверхности лежит то, что эта программа будет печатать экран полный нулей. За нашем вниманием осталось много интересных вещей, которые происходят:

wuffur 02.08.11 в 07:28

0

PyCUDA компилирует исходный код CUDA и закачивает его на карточку(графическую).

wuffur 02.08.11 в 07:29

0

Замечание: Этот код не должен быть постоянным - вы можете легко заставить Python генерировать код, который вы хотите скомпилировать. Смотрите Метапрограммирование с PyCUDA.

wuffur 02.08.11 в 07:31

0

Код взаимодействия numpy PyCUDA автоматически высвобождает место на вашем устройстве, копирует массивы numpy a и b поверх, запускает одноблоковую сетку 400x1x1, и копирует dest назад.

wuffur 02.08.11 в 07:36

0

Отметим, что вы можете также и просто хранить ваши данные на карточке между вызовами ядра - нет нужды копировать данные все время.

wuffur 02.08.11 в 07:37

0

Видите, почему в этом примере нет кода подчистки? Его нет, потому что мы слишком ленивые и просто его пропустили. И он просто не нужен. PyCUDA автоматически станет делать вывод, где и какая необходима подчистка памяти и делает это для вас.

wuffur 02.08.11 в 07:40

0

Любопытно? Давайте начнем.

wuffur 02.08.11 в 07:38

0
Минутку...