Проверка границ не поддерживается для CUDA - PullRequest
2 голосов
/ 07 февраля 2020

Я пытаюсь использовать Numba и получить доступ к графическому процессору для ускорения кода, но я получаю следующую ошибку:

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

Я увидел, что был задан другой вопрос, но он не был полностью указан или не дан ответ здесь . Я реализовал циклы 2-for, когда увидел, что векторизованный код (y = corr*x + np.sqrt(1.-corr**2)*z) не работает (та же ошибка). Я также пытался поиграть с опцией boundscheck, но это не изменило результат. Ошибка не появилась, если не указать target, так как он загружается в ЦП автоматически (я думаю).

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)

Не могли бы вы мне помочь? Python составляет 3,7,6, а Numba - 0,48,0.

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Замените @jit (nopython = True, target = 'cuda', boundscheck = False) на @ 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)
0 голосов
/ 23 апреля 2020

В моем случае я также заменил на @ jit , который является декоратором для компиляции нескольких операций с использованием XLA. Вот пример кода, чтобы увидеть производительность процессора и графического процессора.

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) 

Результат: без графического процессора: 5.353004818000045 с графическим процессором: 0.23115529000006063

...