【问题标题】:Calling other functions from within a @cuda.jit numba function从 @cuda.jit numba 函数中调用其他函数
【发布时间】:2019-09-24 06:38:56
【问题描述】:

我有一个添加了 @cuda.jit 装饰器的函数。

@cuda.jit
def foo(x):
   bar(x[0])
   bar(x[1])
   bar(x[2])

def bar(x):
  # Some routine

我不想将 bar 复制到 foo 的主体中,因为这会使代码变得笨拙和丑陋。

Numba 的 cuda.jit 如何处理这个问题? 编译期间函数是否内联? bar需要jitted吗?

如果是这样,它将调用其他线程,我发现这对于仅超过 3 个元素的计算来说太过分了......

我也认为一个 cuda 内核也不能调用其他 cuda 内核。

我是 numba/cuda 的新手,如果在这里理解有一些根本性的错误,请原谅我。

【问题讨论】:

    标签: python cuda jit numba


    【解决方案1】:

    Numba 的 cuda.jit 如何处理这个问题?

    它没有。如果你尝试过,你会得到一个错误

    函数是否内联 汇编?

    没有。

    bar需要jitted吗?

    是的。需要用@cuda.jit(device=True)装饰一下

    如果是这样,它将调用其他线程,我发现这对于仅超过 3 个元素的计算来说太过分了......

    没有。设备功能和内核不是一回事。设备功能的代码被编译并发出,它是“单线程”的。

    我也认为一个 cuda 内核也不能调用其他 cuda 内核。

    可以,但 Numba 目前不支持。

    【讨论】:

    • 感谢您的帮助,如果我想将内核中的例程分解为我多次调用的函数,我认为 cuda 设备函数是可行的方法?
    • 这就是他们的设计目的
    • 这个答案是否也适用于普通的@jit@njit 函数?因为他们不处理对身体其他功能的调用,对吧?我认为是这种情况,但如果有人可以确认会很好。
    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2018-06-09
    • 2013-07-20
    • 2013-01-12
    相关资源
    最近更新 更多