CUDA表达模板和即时编译(JIT)

时间:2013-04-08 14:41:16

标签: dll cuda expression jit ptx

我对使用CUDA的即时(JIT)编译有一些疑问。

我根据论文

实现了基于表达模板的库

J.M。 Cohen,“使用C ++元编程处理器件阵列”,GPU计算宝石 - 翡翠版

它似乎工作得相当好。如果我比较矩阵元素运算的计算时间

D_D = A_D * B_D-SIN(C_D)3;

与特意开发的CUDA内核,我有以下结果(在括号中,矩阵大小):

时间[ms]手写内核:2.05(1024x1024)8.16(2048x2048)57.4(4096 * 4096)

时间[ms] LIBRARY:2.07(1024x1024)8.17(2048x2048)57.4(4096 * 4096)

库似乎需要与手写内核大致相同的计算时间。根据{{​​3}},我还使用C ++ 11关键字auto来仅在实际需要时评估表达式。我的第一个问题是

1。 JIT为图书馆提供哪种进一步的好处(在代码优化方面)?由于运行时编译,JIT会引入任何进一步的负担吗?

众所周知,基于表达式模板的库不能放在.dll库中,例如参见Expression templates: improving performance in evaluating expressions?。我的第二个问题是:

2。 JIT会帮助将实现隐藏到第三方用户吗?如果是,怎么做?

CUDA SDK包含ptxjit示例,其中ptx代码未在运行时加载,而是在编译时定义。我的第三个问题是:

3。我应该如何在我的案例中实施JIT?是否有使用PTX在运行时加载的JIT示例?

非常感谢您的帮助。

按照Talonmies的评论编辑

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/00edbe1d-4906-4d91-b710-825b503787e2帖子中读取

  

cuda代码可以编译成中间格式的ptx代码,然后在运行时将jit编译为实际的设备架构机器代码

我怀疑上述是否可以将上述内容应用于表达式模板库。我知道,由于实例化问题,CUDA / C ++模板代码无法编译为PTX。但也许如果我为一元和二元表达式实例化所有可能的类型/运算符组合,至少可以将一部分实现编译(然后屏蔽到第三方用户)到PTX,然后可以将JIT编译为手头的建筑。

2 个答案:

答案 0 :(得分:1)

我认为你应该研究OpenCL。它提供了类似JIT的编程模型,用于在GPU上创建,编译和执行计算内核(所有这些都在运行时)。

我在Boost.Compute中采用了一种类似的基于表达式模板的方法,它允许库通过将编译类型的C ++表达式转换为OpenCL内核代码(这是C的方言)来支持C ++模板和泛型算法。

答案 1 :(得分:0)

VexCL最初是作为OpenCL的表达式模板库,但从v1.0开始它也支持CUDA。它对CUDA的作用恰恰是对CUDA源的JIT编译。在后台调用nvcc编译器,编译的PTX存储在脱机缓存中,并在后续启动程序时加载。有关如何执行此操作,请参阅CUDA backend sourcescompiler.hpp应该是你最感兴趣的。