了解 LLVM

LLVM是一个免费的开源编译器基础架构,最初是为 C 和 C++ 构建的。虽然它的名字最初代表低级虚拟机,但现在 LLVM 是一种处理的不仅仅是虚拟机的技术。这个名字不再是正式的缩写。

LLVM 的核心组件是与语言无关的中间表示 (IR)。此 IR 用作编译器系统的中间层并产生较低级别的 IR。然后将低级 IR 简化为针对目标机器优化的汇编语言代码。或者,它可以在运行时进一步降低到二进制机器码的级别。

本文探讨了基于 LLVM 的编译器的优势及其跨架构功能,并提供了一些基于英特尔 LLVM 的 oneAPI 编译器的示例。

LLVM 的历史

LLVM 项目由 Vikram Adve 和 Chris Lattner 于 2000 年在伊利诺伊大学厄巴纳-香槟分校启动。它被设计成模块化的,可以快速适应不同的编译器前端和后端。

自成立以来,LLVM 已经从一个以研究为重点的项目发展成为当今许多行业标准商业编译器的基础。该项目已经用许多其他语言实现,例如 Go、Haskell、OCaml、Rust、Scala、Nimrod、JavaScript、Objective-C、C#、Fortran 和 Python。

LLVM 用于各种系统,包括链接器、汇编器、调试器和编译器,例如英特尔 oneAPI 上可用的系统。英特尔之前将这些编译器基于 Open64 基础架构。但是,英特尔已经采用 LLVM,现在使用该基础架构提供 C/C++ 和 Fortran 编译器。

基于 LLVM 的编译器的好处

基于 LLVM 的编译器在许多方面对开发人员和商业组织都很有价值。让我们考虑一些好处。

更短的构建时间

LLVM 是一个生产质量的编译器基础设施,它为不同的编译器提供了一个框架。我们可以在基于 LLVM 的编译器中使用 LLVM 社区已经编写和测试过的组件,而不是每次都从头开始编写相同的组件。这让我们可以花更多时间专注于项目的独特方面,而减少重新创建代码的时间。

易于维护和优化

LLVM 编译器是轻量级且易于维护的。他们将代码编译成虚拟机可以执行的本机目标文件或字节码。一些编译器还生成中间汇编代码或生成二进制可执行文件作为输出。这些编译器设计用于内存有限且性能至关重要的嵌入式系统。它们还成功地用于超级计算机,以优化大型工作负载的执行速度。

因为 LLVM 是一个模块化库,所以我们只能使用我们需要的 LLVM 部分。我们可以手动选择编译器中使用了哪些组件和优化。如果需要,我们还可以将自己的优化插入到管道中。

灵活性

LLVM 编译器足够灵活,可以支持具有低级(机器代码)和高级(人类可读代码)功能的编程语言。通过这种方式,我们可以创建自定义编程语言,而无需在我们想要添加新功能或对现有功能进行更改时从头开始创建自己的编译器。

我们可以轻松地为新语言和目标架构添加新的前端和后端。此外,我们可以使用 LLVM 编译器基础架构来构建测试和分析工具,而无需修改编译器本身。

可移植性

LLVM 旨在针对其他编译器后端,这意味着我们可以使用它为我们选择的平台生成机器代码。它还为动态编程语言提供汇编器、反汇编器、链接器和即时 (JIT) 编译器等功能。通过允许我们的编译器以 LLVM IR 代码而不是实际的机器代码为目标,与直接从编译器的前端生成机器代码相比,我们可以获得更好的可移植性。

因为编译器在许多不同的平台上运行,我们可以轻松地将我们用它开发的任何应用程序移植到新平台上。

英特尔 oneAPI 编译器选项

我们可以使用不同的编译器来影响代码生成和优化。基于 LLVM 的 oneAPI 编译器的两个示例是英特尔 oneAPI DPC++/C++ 编译器和英特尔 Fortran 编译器 (IFX)。

英特尔 oneAPI DPC++/C++ 编译器

oneAPI 的 Data Parallel C++ (DPC++) 是一个由 Intel 领导的项目,它让我们可以编写跨不同计算系统执行的程序,而无需进行重大、耗时的代码更改。英特尔 oneAPI DPC++/C++ 编译器是一种单一源解决方案,用于为 CPU、GPU、FPGA 和其他加速硬件编译数据并行 C++ 代码。该编译器支持 Windows 和 Linux 操作系统。它建立在 LLVM 之上,并使用 Clang 前端、SYCL 2020 标准通过相同的源文件支持 C++ 和 OpenCL 内核。

SYCL 是来自Khronos Group的开放标准。它为异构计算平台提供基于标准 C++ 的单源编程。

英特尔通过 DPC++ 实现 SYCL 规范(带有一些扩展)。DPC++ 编译器用于原型 SYCL 2020,以及其中的许多功能。这意味着对于任何从事 SYCL 2020 项目的程序员来说,DPC++ 编译器都是一个不错的选择。英特尔使用 DPC++ 来针对英特尔 GPU、CPU 和 FPGA。

借助基于 Clang 前端 LLVM 技术的 DPC++/C++ 编译器,我们可以使用通用编程标准编写适用于所有加速器平台的代码。这有助于通过消除维护多个开发路径的需要来降低开发成本。它还简化了跨硬件平台移植我们的代码。它支持将 OpenMP 5.0 和 5.1 TARGET 卸载到 Intel GPU 目标。

该编译器包含三个编译器驱动程序 — icx、icpx 和 dpcpp — 以进一步简化针对独特支持要求的定制代码。这些驱动程序分别用于编译和链接 C 程序、C++ 程序和具有 SYCL 扩展的 C++ 程序。对于 Windows 系统,dcpcpp SYCL 扩展支持驱动程序的命名约定略有不同:dpcpp-cl。使用 dcpcpp SYCL 扩展进行编译为未来的加速需求提供了额外的灵活性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值