我对使用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编译为手头的建筑。
答案 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 sources。 compiler.hpp应该是你最感兴趣的。