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



我对CUDA的JIT编译有一些疑问。

根据论文 ,我实现了一个基于表达式模板的库

J.M.Cohen,"用c++元编程处理设备数组",GPU计算宝石-翡翠版

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

D_D = A_D * B_D-sin(重金属镉)+ 3。

对于专门开发的CUDA内核,我有以下结果(括号中,矩阵大小):

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

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

库似乎需要与手写内核大致相同的计算时间。我还使用c++ 11关键字auto仅在实际需要时对表达式求值,根据表达式模板:提高表达式求值的性能?第一个问题是

1。JIT将为库提供哪些进一步的好处(就代码优化而言)?JIT会因为运行时编译而带来更多的负担吗?

众所周知,基于表达式模板的库不能放在.dll库中,例如http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/00edbe1d-4906-4d91-b710-825b503787e2。第二个问题是:

2。JIT是否有助于向第三方用户隐藏实现?如果是,怎么做?

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

3。在我的情况下,我应该如何实现JIT ?是否有在运行时使用PTX加载的JIT示例?

非常感谢你的帮助。

编辑Talonmies的注释

从Cuda内核的即时(jit)编译可能吗?Post,上面写着

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

我有一个疑问是,上述是否可以应用于表达式模板库。我知道,由于实例化问题,CUDA/c++模板代码无法编译为PTX。但是,如果我实例化一元和二元表达式的所有可能的类型/操作符组合,那么至少可以将实现的一部分编译(然后对第三方用户屏蔽)到PTX,而PTX可以反过来JIT编译到手头的体系结构。

我认为你应该看看OpenCL。它提供了一个类似jit的编程模型,用于在gpu上创建、编译和执行计算内核(全部在运行时)。

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

VexCL最初是作为OpenCL的表达式模板库,但从v1.0开始它也支持CUDA。它为CUDA所做的就是对CUDA源代码进行jit编译。nvcc编译器在后台被调用,编译后的PTX存储在离线缓存中,并在随后的程序启动时加载。有关如何做到这一点,请参阅CUDA后端源代码。您应该对Compiler.hpp最感兴趣。

最新更新