Numba & CUDA нуб здесь.Мне бы хотелось, чтобы одна функция numba.cuda
программно вызывала другую с устройства без необходимости передавать данные обратно на хост.Например, учитывая настройку
from numba import cuda
@cuda.jit('int32(int32)', device=True)
def a(x):
return x+1
@cuda.jit('int32(int32)', device=True)
def b(x):
return 2*x
, я бы хотел иметь возможность определить составную функцию ядра, такую как
@cuda.jit('void(int32, __device__, int32)')
def b_comp(x, inner, result):
y = inner(x)
result = b(y)
и успешно получить
b_comp(1, a, result)
assert result == 4
В идеале я бы хотел, чтобы b_comp
принимал различные аргументы функции после ее компиляции [например, после вышеуказанного вызова, чтобы все еще принимать b_comp(1, b, result)
] - но решение, в котором аргументы функции становятся фиксированными во время компиляции, все равно будет работать для меня.
Из того, что я прочитал, похоже, что CUDA поддерживает передачу указателей на функции. Этот пост предполагает, что numba.cuda
не имеет такой поддержки, но пост не убедителен, и ему тоже год.Страница для с поддержкой Python в numba.cuda не упоминает поддержку указателя на функцию.Но он ссылается на поддерживаемый Python на странице numba , что дает понять, что numba.jit()
поддерживает функции в качестве аргументов, хотя они исправляются во время компиляции.Если numba.cuda.jit()
сделает то же самое, как я сказал выше, это сработает.В таком случае, при указании подписи для comp
, как мне указать тип переменной?Или я мог бы использовать numba.cuda.autojit()
?
Если numba
не поддерживает такой прямой подход, является ли метапрограммирование разумным вариантом?Например, когда я знаю функцию inner
, мой сценарий может создать новый сценарий, содержащий функцию python, которая объединяет эти конкретные функции, а затем применить numba.cuda.jit()
и затем импортировать результат.Это кажется запутанным, но это единственный другой вариант, основанный на numba
, о котором я только мог подумать.
Если numba
не сработает вообще, или, по крайней мере, без серьезных ошибок, я быбудьте счастливы с ответом, который дал несколько деталей, а также с записью типа «переключиться на PyCuda».