Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以调用间接调用另一个cuda.jit函数的cuda.jit函数?_Python_Cuda_Jit_Numba - Fatal编程技术网

Python 是否可以调用间接调用另一个cuda.jit函数的cuda.jit函数?

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_

我需要能够调用一个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_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很陌生-这里有什么我可以做的吗?请注意,这些函数实际上比显示的更复杂,因此我想要一个实际的解决方案,而不仅仅是在函数中排列。

在这个问题中的单词和代码中有很多误解。简言之:

  • Numba内核无法启动其他Numba内核(从)
  • 。。。较新的CUDA设备支持设备端内核启动;此功能称为动态并行,但Numba目前不支持此功能

  • Numba内核可以调用Numba设备函数,Numba设备函数可以调用其他Numba设备函数()。我非常确信,设备功能通过降低和内联扩展来工作,也就是说,Numba设备功能不使用CUDA ABI

  • 没有CUDA代码、Numba或其他可以在主机CPU上运行代码

  • 如果你看一下你问题中的代码,很明显,从上面第1、2和3项的角度来看,基本上所有代码都是非法的


    我会建议一个替代的设计模式,但它是如此不明显的代码试图实际做什么,我不能这样做。在代码的不同部分有太多奇怪的矛盾。

    如果您在代码中实际包含了您正在使用(或想要使用)的装饰器,那么这个问题就会简单得多,也更容易理解