In [ ]:
#Código extraído de: https://documen.tician.de/pycuda/tutorial.html
#4o ejemplo: https://documen.tician.de/pycuda/array.html#pycuda.gpuarray.GPUArray
La clase GPUArray asocia un array de numpy con un array en el device, maneja transferencias entre el host y el device y expresa las operaciones de array's en la GPU con sintaxis de array's de numpy. (Ver: numpy.ndarray)
El módulo pycuda.autoinit realiza lo necesario para preparar a CUDA para lanzamiento de kernels a la GPU. Lo necesario se refiere a: initialization, context creation, and cleanup. Esto puede realizarse de forma manual si se desea en lugar de utilizar pycuda.autoinit
. (Ver: Notas del curso MNO para revisar qué es un kernel.)
Realizamos transferencias de numpy arrays alojados en el host (CPU) hacia el device (GPU) y deben utilizarse tipos de dato de numpy. Algo tan sencillo como:
value = 256
va = numpy.int32(value)
debe usarse.
Para esto existen diferentes métodos en PyCUDA proveídos por el módulo de pycuda.driver (por ejemplo mem_alloc
, memcpy_htod
, memcpy_dth
) y la clase GPUArray.
In [1]:
import pycuda.gpuarray as gpuarray
import pycuda.autoinit
import numpy as np
In [2]:
np.random.seed(0)
In [3]:
a = np.random.randn(4,4)
In [4]:
a.dtype
Out[4]:
In [5]:
print(a)
In [6]:
a.nbytes
Out[6]:
Se utiliza el método to_gpu()
para instanciar la clase GPUArray y regresa una copia exacta (data_type, shape) del numpy.ndarray a
y el método get()
para almacenar la instancia de la clase GPUArray en un numpy.ndarray. Ver diferencia entre get() y memcpy_dtoh()
In [7]:
a_gpu = gpuarray.to_gpu(a)
a_doubled = (2*a_gpu).get()
In [8]:
a_gpu.dtype
Out[8]:
In [9]:
print(a_gpu)
In [10]:
a_doubled.dtype
Out[10]:
In [11]:
print(a_doubled)
Es posible utilizar element wise functions en las instancias de la clase GPUArray disponibles en el módulo pycuda.math para las funciones contenidas en math
In [12]:
from pycuda.cumath import floor as cufloor
from pycuda.cumath import exp as cuexp
In [13]:
cufloor(2*a_gpu)
Out[13]:
In [14]:
cuexp(a_gpu)
Out[14]:
In [15]:
np.floor(2*a)
Out[15]:
In [16]:
np.exp(a)
Out[16]:
In [ ]: