【问题标题】:Is just-in-time (jit) compilation of a CUDA kernel possible?是否可以对 CUDA 内核进行即时 (jit) 编译?
【发布时间】:2018-01-07 21:57:32
【问题描述】:

CUDA 是否支持 CUDA 内核的 JIT 编译?

我知道 OpenCL 提供了这个功能。

我有一些在运行时不会更改的变量(即仅取决于输入文件),因此我想在内核编译时(即运行时)用宏定义这些值。

如果我在编译时手动定义这些值,我的寄存器使用量会从 53 下降到 46,这会大大提高性能。

【问题讨论】:

  • cuda 代码 can be compiledintermediate format ptx code,然后将 jit-compiled 到运行时的实际设备架构机器代码。我不确定这是否会满足您的需求,但是因为我不确定您的代码在运行时将如何以不同的方式编译(即宏将依赖什么。)
  • 我从输入文件中读取了一些标量值,我想在内核编译时定义它们。例如:#define epsilon 3.0
  • 如果可能的常量组合很少,可以使用 CUDA 中的模板为每个组合生成单独的代码。然后编译器可以在运行时为您选择正确的内核。
  • ArrayFire 在运行时进行 JIT 编译,以针对传入的数据大小和形状优化内核(我在 ArrayFire 上工作,这就是我所知道的)。所以是的,可以在 CUDA 中做!
  • 我相信答案是“不”。但是,如果您只想更改几个常量,则可以使用模板 (see this blog post)。它们远没有在运行时编译代码那么强大。我喜欢 OpenCL 的主要功能之一。

标签: cuda jit


【解决方案1】:

如果您使用 Python 可行,您可以使用出色的 pycuda 模块在运行时编译您的内核。结合Mako 之类的模板引擎,您将拥有一个非常强大的元编程环境,允许您动态调整内核,以适应您可以使用的任何架构和特定设备属性(显然有些事情会很困难使完全动态和自动)。

您还可以考虑仅使用不同参数维护几个不同版本的内核,您的程序可以在运行时根据您提供给它的任何输入在它们之间进行选择。

【讨论】:

  • 感谢您的想法。使用 pycuda 对我来说似乎有点矫枉过正。但是,如果没有其他方法,我可能会给它一个机会。有没有类似 OpenCL 的 clBuildProgram 的 cuda 驱动调用?
  • 至少在原版 CUDA 中,我不知道有任何类似于 clBuildProgram 的东西。如果 GPU 二进制文件尚不可用,CUDA 确实会对与设备无关的 PTX 代码进行运行时编译,但我不知道您如何将其用于您的用例。
【解决方案2】:

它在 cuda 7.0 的 nvrtc 库中可用。通过这个库,您可以在运行时编译您的 cuda 代码。

http://devblogs.nvidia.com/parallelforall/cuda-7-release-candidate-feature-overview/

但你可以获得什么样的优势?在我看来,我找不到动态编译的这么多显着优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多