CUDA内核的即时编译(JIT)是否可行?

6

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

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

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

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


2
CUDA代码可以编译成中间格式PTX代码,然后在运行时进行即时编译,生成实际的设备架构机器码。但是我不确定这是否符合您的需求,因为我不确定您的代码在运行时会以何种方式进行不同的编译(例如宏将依赖于什么)。 - Robert Crovella
我从输入文件中读取了一些标量值,并希望在内核编译时定义它们。例如:#define epsilon 3.0 - user1829358
1
如果您有几个可能的常量组合,您可以在CUDA中使用模板来为每个组合生成单独的代码。然后编译器可以在运行时为您选择正确的内核。 - Roger Dahl
ArrayFire在运行时进行JIT编译,以优化针对输入数据大小和形状的内核(我正在ArrayFire上工作,所以我知道)。因此,在CUDA中也是可能的! - arrayfire
我认为答案是否定的。但是,如果你只想改变一些常量,你可以使用模板(参见这篇博客文章)。它们远不如能够在运行时编译代码那么强大,这是我喜欢OpenCL的主要特性之一。 - Ryan Marcus
@accelereyes 能否提供一下具体的实现方法? - Dmitri Nesteruk
2个回答

1

0

如果您可以使用Python,那么您可以使用优秀的pycuda模块在运行时编译您的内核。结合像Mako这样的模板引擎,您将拥有一个非常强大的元编程环境,使您能够动态调整内核以适应您可用的任何架构和特定设备属性(显然,有些事情很难完全实现动态和自动化)。

您还可以考虑仅维护几个具有不同参数的内核版本,您的程序可以根据输入选择在运行时之间进行选择。


1
谢谢您的想法。对我来说,使用pycuda似乎有点过度。然而,如果没有其他方法,我可能会尝试一下。是否没有类似于OpenCL的clBuildProgram的cuda驱动程序调用? - user1829358
至少在原始的CUDA中,我不知道是否有类似于clBuildProgram的东西。如果GPU二进制文件不存在,CUDA确实会对设备无关的PTX代码进行运行时编译,但我不知道你如何利用它来解决你的问题。 - Brendan Wood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接