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

     2023-02-16     38

关键词:

【中文标题】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 应该是你最感兴趣的。

【讨论】:

转:什么是即时编译(jit)!?openjdkhotspotvm剖析

重点应用程序可以选择一个适当的即时编译器来进行接近机器级的性能优化。分层编译由五层编译构成。分层编译提供了极好的启动性能,并指导编译的下一层编译器提供高性能优化。提供即时编译相关诊断信息的JVM开关。像内... 查看详情

jit(上):tensorflow如何实现即时编译?

参考技术ATensorflow的JIT(just-in-time)是指在运行@tf.function修饰的python函数时,由jit、tf2xla和XLA一起完成一系列如子图构造、子图优化、图编译和图执行等操作。编译后的可执行程序--executable会存放到cache中,供再次调用时直接获... 查看详情

jit即时编译

...oogle+用电子邮件发送本页面JIT是justintime的缩写,也就是即时编译编译器。使用即时编译器技术,能够加速Java程序的执行速度。下面,就对该编译器技术做个简单的讲解。首先,我们大家都知道,通常通过javac将... 查看详情

jit即时编译

...文件   class文件有2种方式执行:解释执行、JIT即时编译后执行    通常情况下默认解释器边解释边运行,但对于一些热点代码会首先编译为机器码,缓存起来,后续执行执行缓存的机器码即可,提升执行... 查看详情

浅析jit即时编译技术

即时编译回顾HotSpot虚拟机执行Java程序时,先通过解释器对代码解释执行,发现某个方法或代码块执行比较频繁后,对热点代码进行编译,编译后生成与本地平台相关的机器码,再去执行机器码获得较高的运行效率。必要时,也... 查看详情

java即时编译jit

...可执行的代码(原生型指令码)JITCompiler(Just-in-timeCompiler)即时编译最早的Java建置方案是由一套转译程式(interpreter),将每个Java指令都转译成对等的微处理器指令,并根据转译后的指令先后次序依序执行,由于一个Java指令可能... 查看详情

java虚拟机即时编译器技术jit

...术用以提升速度,尤其是与加载器操作相关的,被称为“即时”(Just-In-Time,JIT)编译器的技术。这种技术可以把程序全部或部分翻译成本地机器码(这本来是JVM的工作),程序运行速度因此得以提升。当需要装载某个类时,编译器... 查看详情

javajava即时编译(jit)器原理解析及实践

1.概述转载:Java即时编译(JIT)器原理解析及实践一、导读常见的编译型语言如C++,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过... 查看详情

有没有像“编译时 JIT”这样的东西?

...样,据我了解,在这种情况下,编译器解释源代码以评估表达式(产生例如 查看详情

jit即时编译(史上最全)(代码片段)

...后面,水不知道有多深。首先,考察了大家对JVM即时编译组件的 查看详情

jit编译

...么是jit编译:为了提高热点代码的执行效率,在运行时,即时编译器(JIT)会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化,然后保存到内存中。在HotSpot虚拟机中,内置了两个JIT,分别为C1编译器和C2编译器... 查看详情

juc并发编程--jit即时编译器之锁清除(代码片段)

1.1锁消除导入相关依赖:因为JMH是JDK9自带的,如果是JDK9之前的版本需要加入如下依赖<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.23</version>&l 查看详情

java之jit(justintime)

...码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT编译器,不是Java虚拟机内必须的部分)。要了解HotSpot虚拟机内的即时编译器的运作过程,要解决几个 查看详情

jvm中的jit

...需要JIT编译呢?JIT编译器,是JustInTime编译的意思,又称即时编译。 Java程序是先从源代码编译到字节码,然后由Java虚拟机来解释执行字节码。当Java虚拟机在解释执行一个Java 查看详情

jit

...也就是JIT(justintimecompiler)  JIT的优化有:1.公共子表达式消除2.方法内联:JIT会将被调用的方法直接用方法体中的代码代替,减少了方法调用过程中的压栈出栈。3.jdk7后默认开启逃逸分析,逃逸是指当一个对象在方法中被定... 查看详情

dart的特性(jit与aot、内存分配与垃圾回收、单线程模型)

...先进的工具链和编译器,Dart是少数同时支持JIT(JustInTime,即时编译)和AOT(AheadofTime,运行前编译)的语言之一。JIT和AOT是最常见的两种编译模式。Dart是单线程模型,Dart中并没有多线程概念,只有Isolate(隔离区)。Isolates之间不会共享... 查看详情

javac编译与jit编译

...效率就显得很低。于是后来在虚拟机中引入了JIT编译器(即时编译器),当虚拟机发现某个方法或代码块运行特别频繁时,就会把这些代码认定为“Hot Spot Code”(热点代码),为了提高热点代码的执行效率,在运行时,... 查看详情

jvm--运行期优化;jit(代码片段)

一、即时编译(JIT)JIT:JustInTimeCompiler,即时编译器这是针对解释型语言而言的,而且并非虚拟机必须,是一种优化手段。Hotspot就有这种技术,Java虚拟机标准对JIT的存在没有作出任何规范,这是虚... 查看详情