Python 是否可以调用间接调用另一个cuda.jit函数的cuda.jit函数?
我需要能够调用一个GPU函数,该函数本身会间接调用另一个GPU函数:Python 是否可以调用间接调用另一个cuda.jit函数的cuda.jit函数?,python,cuda,jit,numba,Python,Cuda,Jit,Numba,我需要能够调用一个GPU函数,该函数本身会间接调用另一个GPU函数: from numba import cuda, jit import numpy as np # GPU function @cuda.jit(device = True) def euclidean_distance_gpu(input_vec, weight, diffs): i = cuda.grid(1) if i < input_vec.shape[0]: diffs[i] = (input_
from numba import cuda, jit
import numpy as np
# GPU function
@cuda.jit(device = True)
def euclidean_distance_gpu(input_vec, weight, diffs):
i = cuda.grid(1)
if i < input_vec.shape[0]:
diffs[i] = (input_vec[i] - weight[i]) ** 2
@jit
# CPU function
def euclidean_distance_cpu(diffs):
diffs_sum = np.sum(diffs)
euclidean_distance = np.sqrt(diffs_sum)
return euclidean_distance
@jit
# CPU function
def euclidean_distance(input_vec, weight):
euclidean_distance_gpu[1, 5](input_vec, weight, diffs)
return euclidean_distance_cpu(diffs)
@cuda.jit
# GPU function
def compare(input_vec, categories, diffs):
i = cuda.grid(1)
if i < categories.shape[0]:
euclidean_dist = 0
euclidean_dist = euclidean_distance(input_vec, categories[i])
diffs[i] = euclidean_dist
vec1 = np.array([1, 2, 3, 4, 5])
c1 = np.array([2, 3, 4, 5, 6])
c2 = np.array([3, 4, 5, 6, 7])
c = np.array([c1, c2])
diffs = np.array([0, 0])
compare(vec1, c, diffs)
从numba导入cuda,jit
将numpy作为np导入
#GPU功能
@jit(设备=True)
定义欧几里得距离gpu(输入向量、权重、差值):
i=cuda.grid(1)
如果i<输入向量形状[0]:
差异[i]=(输入向量[i]-权重[i])**2
@准时制
#CPU功能
def欧几里德距离(差异):
差异之和=np.之和(差异)
欧几里德距离=np.sqrt(差和)
返回欧氏距离
@准时制
#CPU功能
def欧几里得距离(输入向量,权重):
欧几里得距离gpu[1,5](输入向量、权重、差值)
返回欧几里德距离(差异)
@cuda.jit
#GPU功能
def比较(输入向量、类别、差异):
i=cuda.grid(1)
如果i
在这种情况下,我需要调用compare()
函数,它本身通过euclidean\u distance()
调用euclidean\u-gpu()
,以及compare()
和euclidean\u-gpu()
都是要使用gpu的函数
据我所知,这两个函数都需要用@cuda.jit
修饰,用欧几里德距离\u gpu()
修饰@cuda.jit(device=True)
。但是,当我稍后调用compare()
时,我不知道如何调用它而不引发错误,因为它首先必须通过CPU函数(euclidean_distance()
修饰为@jit
)
我的理解是,您只能从另一个cuda.jit
函数调用cuda.jit
函数-这是否正确?假设我将euclidean_distance()
转换为cuda.jit
函数。有没有一种方法可以通过所有这些层的函数调用使其正确工作
我对jit很陌生-这里有什么我可以做的吗?请注意,这些函数实际上比显示的更复杂,因此我想要一个实际的解决方案,而不仅仅是在函数中排列。在这个问题中的单词和代码中有很多误解。简言之:
我会建议一个替代的设计模式,但它是如此不明显的代码试图实际做什么,我不能这样做。在代码的不同部分有太多奇怪的矛盾。如果您在代码中实际包含了您正在使用(或想要使用)的装饰器,那么这个问题就会简单得多,也更容易理解