写点什么

麻省理工学院扩展 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:002721

评论

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

最近程序员频繁被抓,如何避免面向监狱编程!?

Java架构师迁哥

一文读懂GaussDB(openGauss) 的六大关键技术特性

华为云开发者联盟

数据库 数据 存储

Vidyo的技术特点都有哪些?

dwqcmo

音视频 集成架构 解决方案 智能硬件

阿里巴巴专属著作超赞,就是名字起得有点狂“成神之路”???

Java架构师迁哥

分布式文件存储QoS硬核黑科技,真香

焱融科技

高性能 存储 HPC 分布式文件存储 QoS

来自阿里面试官的Java面试连珠炮,让你自由发挥你能撑到哪一步?

Java架构之路

Java 程序员 架构 面试 编程语言

【JSRC小课堂】Web安全专题(一)认证缺失和认证缺陷漏洞

京东科技开发者

WEB安全

10 张图打开 CPU 缓存一致性的大门

小林coding

缓存 cpu 操作系统 计算机

大企程序员亲身经历告诉你,CRM系统,自己的才是最好的

Learun

敏捷开发

我服了,难倒无数程序员的源码面试,就这样被轻轻松松讲透彻

小Q

Java 学习 源码 架构 面试

uni-app支持PC宽屏适配

崔红保

uni-app 大前端

程序员不愿意说的秘密!Java进阶架构师必看:架构完美设计+程序员三门课+架构修炼之道

Java架构追梦

小程序云开发实战:从0搭建科技爱好者周刊小程序

薛定喵君

微信小程序 小程序云开发 云开发

MySql从青铜到王者晋级之路,阿里大牛经验总结让牛少走弯路!

Java架构之路

Java 程序员 架构 面试 编程语言

谈谈贪官污吏

空山

搜狗搜索或成为企鹅号流量入口:腾讯欲实现自己的流量闭环

石头IT视角

即构SDK10月迭代:新增多款语音音效、外部采集码流控制及Android SDK 最低支持操作系统版本调整

ZEGO即构

android RTC

30 岁的码农人生 ——人生至暗时,你依然能窥见光明

苹果看辽宁体育

程序员 程序人生 感悟

基于阿里云容器的CI/CD落地实践

LorraineLiu

阿里云 k8s Helm jenkins CI/CD

接口测试工具

测试人生路

接口文档 接口测试

实用!8个 chrome插件玩转GitHub,单个文件下载小意思

程序员小富

GitHub

什么是动态代理

Rayjun

Java 动态代理

以A.I.之力打破方言沟通障碍 科大讯飞重磅发布智慧翻译系统

Talk A.I.

如何生成 Flink 作业的交互式火焰图?

Apache Flink

flink

你有时间吗?

池建强

时间

爬虫“学前班”,记住这些不踩坑!

华为云开发者联盟

爬虫 数据 搜索

个人计算机、工作站、服务器的主要区别

德胜网络-阳

API生态的发展与机遇:从5000组数据看中国API生态与开发者现状

华为云开发者联盟

华为 API

求职时这样回答问题你就输了!来自IT类面试官视角的深度解读

华为云开发者联盟

面试 软件开发

WebSocket-技术专题-服务器端消息推送

码界西柚

「深度解析」告诉你如何选择容器存储

焱融科技

Kubernetes 容器 云原生 焱融科技 分布式文件存储

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