Замена декоратора njit декоратором cuda.jit - PullRequest
0 голосов
/ 03 мая 2019

У меня есть графический процессор Nvidia, я скачал CUDA и пытаюсь использовать его.

Скажите, у меня есть этот код:

#@cuda.jit (Attempted fix #1)
#@cuda.jit(device = True) (Attempted fix #2)
#@cuda.jit(int32(int32,int32)) (Attempted fix #3)

@njit
def product(rho, theta):
    x = rho * (theta)
    return(x)
a = product(1,2)
print(a)

Как мне заставить его работать с декоратором cuda.jit вместо njit?

Вещи, которые я пробовал:

Когда я переключаю декоратор с @njit на @ cuda.jit, я получаю: TypingError: Нет преобразования из int64 в none для '$ ​​0.5', определенного в None.

Когда я переключаю декоратор @ cuda.jit (device = True), я получаю: TypeError: объект DeviceFunctionTemplate не вызывается.

И когда я указываю типы для своих входов и выходов и использую декоратор @ cuda.jit (int32 (int32, int32)), я получаю: TypeError: Ядро CUDA должно иметь тип возвращаемого значения void.

1 Ответ

1 голос
/ 04 мая 2019

ядер numba cuda ничего не возвращают . Вы должны вернуть результаты через параметры / аргументы функции. Отправной точкой для этого обычно является какой-то пустой массив. Вот пример:

$ cat t44.py
from numba import cuda
import numpy as np

@cuda.jit
def product(rho, theta, x):
        x[0] = rho * (theta)

x = np.ones(1,dtype=np.float32)
product(1,2,x)
print(x)
$ python t44.py
[ 2.]
$

Есть потенциально много других вещей, которые можно было бы сказать; Вы можете воспользоваться документацией, указанной выше, или, например, этот урок . Обычно вам нужно решить задачи, которые намного больше, чем умножение двух скаляров, прежде чем вычисления на GPU будут интересны.

Кроме того, numba предоставляет другие методы для доступа к вычислениям на GPU, которые не зависят от использования декоратора @cuda.jit. Эти методы, такие как @vectorize, документированы.

Я также опускаю любой синтаксис конфигурации запуска ядра при вызове product. Это допустимо в Numba Cuda, но это приводит к запуску ядра из 1 блока, который содержит 1 поток. Это работает для данного конкретного примера, но это в основном бессмысленный способ использования графических процессоров CUDA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...