CUDA 表达式模板和即时编译 (JIT)
Posted
技术标签:
【中文标题】CUDA 表达式模板和即时编译 (JIT)【英文标题】:CUDA Expression Templates and Just in Time Compilation (JIT) 【发布时间】:2013-04-08 14:41:16 【问题描述】:我对使用 CUDA 进行即时 (JIT) 编译有一些疑问。
我已经根据论文实现了一个基于表达式模板的库
J.M. Cohen,“使用 C++ 元编程处理设备阵列”,GPU 计算宝石 - Jade 版
它似乎工作得相当好。如果我比较矩阵元素运算的计算时间
D_D=A_D*B_D-sin(C_D)+3.;
使用特意开发的 CUDA 内核,我得到以下结果(括号中为矩阵大小):
time [ms] 手写内核:2.05 (1024x1024) 8.16 (2048x2048) 57.4 (4096*4096)
时间 [ms] 库:2.07 (1024x1024) 8.17 (2048x2048) 57.4 (4096*4096)
该库似乎需要与手写内核大致相同的计算时间。根据Expression templates: improving performance in evaluating expressions?,我还使用 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 kernel just-in-time (jit) compilation possible? 帖子中可以看到
cuda 代码可以编译为中间格式的 ptx 代码,然后在运行时将其 jit 编译为实际的设备架构机器代码
我有一个疑问,是否可以将上述内容应用于表达式模板库。我知道,由于实例化问题,CUDA/C++ 模板代码无法编译为 PTX。但也许如果我为一元和二元表达式实例化所有可能的类型/运算符组合,至少可以将部分实现编译(然后屏蔽给第三方用户)到 PTX,而 PTX 又可以通过 JIT 编译到手头的建筑。
【问题讨论】:
当你突然从 C++ 元编程跳到 PTX 程序集的即时编译时,我迷路了。两者之间似乎存在一些相当重要的缺失元素。如何将 C++ 模板代码 JIT 编译为 PTX? 感谢您的评论。我编辑了我的帖子,试图更好地解释这个问题。我的问题主要是隐藏实现(或部分实现)并提高性能。 【参考方案1】:我认为你应该调查一下OpenCL。它提供了一个类似 JIT 的编程模型,用于在 GPU 上创建、编译和执行计算内核(全部在运行时)。
我在Boost.Compute 中采用了类似的基于表达式模板的方法,它允许库通过将编译型 C++ 表达式转换为 OpenCL 内核代码(这是 C 的一种方言)来支持 C++ 模板和通用算法。
【讨论】:
非常感谢您的回答。但是,我可以将您的答案“移植”到 CUDA 吗?根据您的经验,JIT 是否会因运行时编译而提供更多好处或更多负担?【参考方案2】:VexCL 最初是作为 OpenCL 的表达式模板库,但从 v1.0 开始它也支持 CUDA。它对 CUDA 所做的正是 CUDA 源代码的 JIT 编译。 nvcc
编译器在后台调用,编译后的 PTX 存储在离线缓存中,并在程序后续启动时加载。请参阅CUDA backend sources 了解如何执行此操作。 compiler.hpp 应该是你最感兴趣的。
【讨论】:
以上是关于CUDA 表达式模板和即时编译 (JIT)的主要内容,如果未能解决你的问题,请参考以下文章