web-dev-qa-db-fra.com

La vérification des limites n'est pas prise en charge pour CUDA

J'essaie d'utiliser Numba et d'accéder au GPU afin d'accélérer le code, mais j'obtiens l'erreur suivante:

in jit raise NotImplementedError("bounds checking is not supported for CUDA")
NotImplementedError: bounds checking is not supported for CUDA

J'ai vu qu'une autre question a été soulevée, mais pas complètement spécifiée ni répondu ici . J'ai implémenté les boucles 2-for quand j'ai vu que le code vectorisé (y = corr*x + np.sqrt(1.-corr**2)*z) ne fonctionnait pas (même erreur). J'ai aussi essayé de jouer avec l'option boundscheck, mais cela n'a pas changé le résultat. L'erreur n'apparaît pas lorsque vous ne spécifiez pas le target, car il passe automatiquement sur le processeur (je suppose).

import numpy as np
from numba import jit

N = int(1e8)
@jit(nopython=True, target='cuda', boundscheck=False)
def Brownian_motions(T, N, corr):
    x = np.random.normal(0, 1, size=(T,N))
    z = np.random.normal(0, 1, size=(T,N))
    y = np.zeros(shape=(T,N))
    for i in range(T):
        for j in range(N):
            y[i,j] = corr*x[i,j] + np.sqrt(1.-corr**2)*z[i,j]
    return(x,y)

x, y = Brownian_motions(T = 500, N = N, corr = -0.45)

Pourrais-tu m'aider s'il te plaît? Python vaut 3,7,6 et Numba vaut 0,48,0.

2
MG3

Dans mon cas, j'ai également remplacé par @ jit qui est un décorateur pour compiler les multiples opérations en utilisant XLA. Voici un exemple de code pour voir les performances du CPU et du GPU.

from numba import jit
import numpy as np 
# to measure exec time 
from timeit import default_timer as timer    

# normal function to run on cpu 
def func(a):                                 
    for i in range(10000000): 
        a[i]+= 1      

# function optimized to run on gpu  
@jit
#(target ="cuda")                          
def func2(a): 
    for i in range(10000000): 
        a[i]+= 1
if __name__=="__main__": 
    n = 10000000                            
    a = np.ones(n, dtype = np.float64) 
    b = np.ones(n, dtype = np.float32) 

    start = timer() 
    func(a) 
    print("without GPU:", timer()-start)     

    start = timer() 
    func2(a) 
    print("with GPU:", timer()-start) 

Résultat: sans GPU: 5,353004818000045 avec GPU: 0,23115529000006063

2
Bilal Chandio

Remplacez @jit (nopython = True, target = 'cuda', boundscheck = False) par @jit

import numpy as np
from numba import jit

N = int(1e8)
@jit
def Brownian_motions(T, N, corr):
    x = np.random.normal(0, 1, size=(T,N))
    z = np.random.normal(0, 1, size=(T,N))
    y = np.zeros(shape=(T,N))
    for i in range(T):
        for j in range(N):
            y[i,j] = corr*x[i,j] + np.sqrt(1.-corr**2)*z[i,j]
    return(x,y)

x, y = Brownian_motions(T = 500, N = N, corr = -0.45)
1
Amit