Я использую Numba (версия 0.37.0) для оптимизации кода для графического процессора.Я хотел бы использовать комбинированные векторизованные функции (используя @vectorize декоратор Numba).
Импорт и данные:
import numpy as np
from math import sqrt
from numba import vectorize, guvectorize
angles = np.random.uniform(-np.pi, np.pi, 10)
coords = np.stack([np.cos(angles), np.sin(angles)], axis=1)
Это работает, как и ожидалось:
@guvectorize(['(float32[:], float32[:])'], '(i)->()', target='cuda')
def l2_norm(vec, out):
acc = 0.0
for value in vec:
acc += value**2
out[0] = sqrt(acc)
l2_norm(coords)
Вывод:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32)
Но я бы хотел не использовать это "for" внутри "l2_norm", вызывая другую векторизованную функцию.
Я пробовал это:
@vectorize(["float32(float32)"], target="cuda")
def power(value):
return value**2
@guvectorize(['(float32[:], float32[:])'], '(i)->()', target='cuda')
def l2_norm_power(vec, out):
acc = 0.0
acc = power(vec)
acc = acc.sum()
out[0] = sqrt(acc)
l2_norm_power(coords)
Но поднимает TypingError:
TypingError: Failed at nopython (nopython frontend)
Untyped global name 'power': cannot determine Numba type of <class
'numba.cuda.dispatcher.CUDAUFuncDispatcher'>
Есть идеи о том, как выполнить эту комбинацию?
Есть предложения о другом способе оптимизации l2_norm с помощью Numba?