AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

麻省理工学院扩展 LLVM IR 使并行程序可得到更好的优化

  • 2017-02-19
  • 本文字数:1320 字

    阅读完需:约 4 分钟

麻省理工学院的研究人员过去一直致力于 LLVM 的 fork 的研究,以探索优化并行代码的新方式,该方式通过将 fork-join parallelism 直接嵌入编译器的中间表示(IR)中进行优化。这些研究人员认为,这使针对并行程序最大程度地利用IR 层进行串行优化成为可能。

Fork-join parallelism 是一种组织并行程序的方式,它特别适合于分而治之的算法,比如归并排序。 通过一组语言扩展,例如由 OpenMP (比如#pragma omp parallel 和#pragma omp parallel 等等)和 Cilk Plus (比如 cilk_spawn 和 cilk_sync)提供的扩展,GCC 和 LLVM 之类的主流编译器内均可支持 fork-join parallelism。这些编译器前端处理这些语言扩展到“较低层”并行结构到更原始的表示,然后转化成 IR。例如,以下代码片段使用 Cilk cilk_for 扩展使之可以并行运行该循环的每次迭代:

__attribute__((const)) double norm(const double *A, int n); void normalize(double *restrict out, const double *restrict in, int n) { cilk_for (int i = 0; i 这种方式的其中一个缺点是,虽然编译器中端再也看不到循环了,但运行期调用是不透明的,它提取自己函数内的代码块传入库函数,该库函数处理大量生成的循环迭代并随后同步。这实际上妨碍了中端针对循环在IR 层进行的各类优化,比如循环不变式代码调整、调度等。

Schardl、Moses 和 Leierson 的工作是通过一个扩展的 IR 直接将 fork-join 模型放入中端,这使之前需要由并行处理添加额外代码的代码可以应用所有各类优化策略了。这种方式本身并不新颖,几个特殊的 IR 已经特别设计以表示程序内的并行了,然而:

……在主流编译器中使用单独的 IR 一直以来都受非议,因为策划、开发和维护这个额外的 IR 到像编译器已有的串行 IR 同样的标准需要付出相当大的工作量。

关键是麻省理工学院的三位研究人员已经找到了扩展 LLVM 的 IR 的方法,即通过保留它们的串行语言去表示逻辑任务并行。他们新的 IR 被称为 Tapir,代表并行任务不对称,这表示并行任务必须在执行流程能被同步之前率先完成,从而使 LLVM 之类的串行中端可以去高效地优化并行代码,这些研究人员们说。

Tapir 通过增加三个新命令扩展 LLVM 的 IR:detach、reattach 和 sync。虽然 detach 大致相当于像 fork 一样的抽象,但是 reattach 和 sync 所代表的与 join 稍有不同。由于目的在于实现可串行化这一需求,所以并行计算必须确保分离锁在分支续延之前执行完成。因此,虽然 detach 和 reattach 表示一个并行任务的开发和结束,但是同步任务的同步是在其并行上下文内发生的。

为了评估他们这些新方法的好处,麻省理工学院的研究员们比较了 Cilk-enabled LLVM 编译器和 Tapir-enabled 的 LLVM 编译器,用它们同时去编译一组 20 个 Cilk 程序的套件。

在这 20 个程度中的 17 个,使用新 IR 的编译器产出了更高效的软件,其中三分之一提升了 10% 到 25%。而新编译器所产出的更低效率的软件,其下降幅度也仅低于 2%。

在 GitHub 上可以获得 Tapir ,可运行以下命令进行构建:

复制代码
git clone --recursive https://github.com/wsmoses/Tapir-Meta.git
cd Tapir-Meta/
./build.sh
source ./setup-env.sh

查看英文原文 MIT Extended LLVM IR to Enable Better Optimization of Parallel Programs

2017-02-19 18:002511

评论

发布
暂无评论
发现更多内容

【LeetCode】字母大小写全排列Java题解

Albert

算法 LeetCode 11月月更

双机热备软件原理简单说明以及品牌重点推荐

行云管家

高可用 ha 热备 双机热备

Webpack中的plugin插件机制

Geek_02d948

webpack

为什么vue3要选用proxy,好处是什么?

hellocoder2029

JavaScript

JavaScript刷LeetCode拿offer-双指针技巧(上)

Geek_07a724

JavaScript LeetCode

Vue3, setup语法糖、Composition API全方位解读

yyds2026

Vue

Java后端面试到底要如何准备?

钟奕礼

Java 程序员 java程序员 java面试 java编程

深聊Nodejs模块化

coder2028

node.js

技术公开课|深度剖析 Java 的依赖管理,快速生成项目 SBOM清单

墨菲安全

Java SBOM 软件供应链安全

用javascript分类刷leetcode3.动态规划(图文视频讲解)

Geek_07a724

JavaScript LeetCode

【11.11-11.18】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动

用javascript分类刷leetcode3.动态规划(图文视频讲解)

js2030code

JavaScript LeetCode

深度理解NodeJS事件循环

coder2028

node.js

阿里P8整理的新版手抄本,所有Java知识操作

钟奕礼

Java java程序员 java面试 java编程

深度阐述Nodejs模块机制

coder2028

node.js

前端懒加载和预加载

hellocoder2029

JavaScript

前端leetcde算法面试套路之堆

js2030code

JavaScript LeetCode

某邮储银行数据归集系统在HTAP场景下的选型与实践

OceanBase 数据库

前端leetcde算法面试套路之回溯

js2030code

JavaScript LeetCode

解读Vue3模板编译优化

yyds2026

Vue

深度解读Webpack中的loader原理

Geek_02d948

webpack

腾讯会议后台研发效能提升之路

博文视点Broadview

如何通过Java代码给Word文档添加水印?

在下毛毛雨

Java word 水印

Vue.nextTick核心原理

yyds2026

Vue

详解webpack构建优化

Geek_02d948

webpack

腾讯大神亲码Redis技术笔记,实战+原理双管齐下

小小怪下士

Java redis 程序员 腾讯

令人头疼的Javascript隐式&强制转换

hellocoder2029

JavaScript

汇总LED显示屏专业知识

Dylan

LED LED显示屏 led显示屏厂家

BI口碑分析,Quick BI何以连续入选魔力象限

巷子

JavaScript刷LeetCode拿offer-分治

Geek_07a724

JavaScript LeetCode

StartDT奇点云通过CMMI5全球软件领域最高级别成熟度认证

奇点云

CMMI 奇点云

麻省理工学院扩展LLVM IR使并行程序可得到更好的优化_语言 & 开发_Sergio De Simone_InfoQ精选文章