写点什么

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

评论

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

client-go实战之五:DiscoveryClient

爱好编程进阶

Java 面试 后端开发

美区块链公司Espresso Systems口碑滑坡:知识产权、团队道德皆陷丑闻

西柚子

Pipy 性能基准测试的思考与实践

Flomesh

代理 benchmark Pipy

TiUP:TiDBAer 必备利器

PingCAP

TiDB

GPU底层技术、全球市场格局分析

Finovy Cloud

人工智能 云计算 云服务器 GPU服务器 GPU算力

Linux驱动开发-编写按键驱动

DS小龙哥

4月月更 Linux驱动

OpenHarmony 3.1 Release正式发布,标准系统全方位升级!

叶落便知秋

大数据培训经典SQL面试题解析

@零度

sql 大数据开发

大型IM系统有多难?万字长文,搞懂异地多活!

BeeWorks

找工作,你被“卷”到了吗?

InfoQ写作社区官方

招聘 就业 热门活动 拉勾招聘

助力 60+ 市区管理建设,TDengine 联手数字政通打造智慧城市平台

TDengine

数据库 tdengine 时序数据库

如何撰写出有效的帮助文档内容?

小炮

帮助文档

web前端培训如何使用CSS连接数据库

@零度

CSS 前端开发

CentOS 停止维护,一文看懂升级迁移路径

亚马逊云科技 (Amazon Web Services)

Tech 专栏

jackson学习之九:springboot整合(配置文件)

爱好编程进阶

Java 面试 后端开发

JAVA 最常用实用的正则表达式校验

爱好编程进阶

Java 面试 后端开发

Java集合框架(四)

爱好编程进阶

Java 面试 后端开发

源码级别的广播与监听实现

阿Q说代码

spring源码 实战 监听 4月月更 广播

【直播回顾】OpenHarmony 3.1 Release版本南北向关键能力解读

OpenHarmony开发者

OpenHarmony 直播回放

ZEGO 最后一公里网络传输的容灾及优化方案

ZEGO即构

后台开发 容灾 最后一公里

jackson学习之三:常用API操作

爱好编程进阶

Java 面试 后端开发

JAVA8之后的版本履历

爱好编程进阶

Java 面试 后端开发

大咖实战|Kubernetes自动伸缩实现指南分享

云智慧AIOps社区

Docker 云计算 Kubernetes 容器 云原生

API 分页探讨:offset 来分页真的有效率吗?

爱好编程进阶

Java 面试 后端开发

client-go实战之四:dynamicClient

爱好编程进阶

Java 面试 后端开发

Apache ShardingSphere 5.1.1 正式发布

SphereEx

Apache 数据库 开源 ShardingSphere SphereEx

Elasticsearch文档读写模型实现原理

爱好编程进阶

Java 面试 后端开发

java培训:java流中的异常处理方法分享

@零度

JAVA开发 java流

我,机器学习工程师,决定跑路了

OneFlow

机器学习 深度学习 AI 程序人生 MLOps

视频画质增强最优解:微帧科技视频超高清引擎

微帧Visionular

计算机视觉 视频增强 电影修复

最受欢迎的5种编程语言各有什么特点或优点?

源字节1号

软件开发 后端开发 编程语言、

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