AI 时代下组织如何快速变革?如何提升全员 AI 技能?戳> 了解详情
写点什么

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

评论

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

2022Nginx实战教程,由浅入深

LoneWalker、

nginx

阿里云架构师金云龙:基于云XR平台的视觉计算应用部署

阿里云弹性计算

视觉计算 计算巢 云XR平台 GPU实例

大型分布式存储方案MinIO介绍,看完你就懂了!

天使不哭

存储 MINO #开源 8月月更

为什么数字钱包需要引入小程序生态

Speedoooo

小程序 第三方支付 小程序容器 移动钱包

“稚晖君”为2022昇腾AI创新大赛打call 期待广大开发者加入

Geek_2d6073

2022 首期线下 Workshop!面向应用开发者们的数据应用体验日来了 | TiDB Workshop Day

TiDB 社区干货传送门

小程序+自定义插件的关键性

Geek_99967b

小程序

上海一科技公司刷单被罚22万,揭露网络刷单灰色产业链

石头IT视角

跨端技术方案选什么好?

Geek_99967b

跨端

开发者必备:一文快速熟记【数据库系统】和【软件开发模型】常用知识点

小阿杰

软件开发流程 软件开发原则 数据库系统 签约计划第三季

shell之变量详解,让你秒懂!

Albert Edison

Linux centos 运维 shell脚本编程 8月月更

10个 Istio 流量管理 最常用的例子,你知道几个?

万猫学社

云原生 istio envoy Istio流量管理

十步以内,用小程序快速生成App!

Geek_99967b

小程序

“车家互联”新态势,小程序实现物联网多场景互通

Speedoooo

小程序 智能家居 小程序容器 电动车

README_Albumentations

G_Meteor

Java技术:SpringBoot实现邮件发送功能

天使不哭

Java email #开源 8月月更

带着昇腾去旅行:一日看尽金陵城里的AI胜景

脑极体

5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?

万猫学社

云原生 istio envoy Istio流量管理

开源一夏 | 对于Angular表达式以及重要指令的研究心得【前端实战Angular框架】

恒山其若陋兮

开源 8月月更

FileZilla搭建FTP服务器图解教程

天使不哭

#开源 8月月更

全面解析FPGA基础知识

芯动大师

签约计划第三季

双屏协作更高效,华硕灵耀X 双屏Pro 2022创作体验再升级

科技热闻

图解VirtualBox安装CentOS 7

万猫学社

Centos 7 virtualbox

在“企业通讯录”的盲区,融云的边界与分寸

融云 RongCloud

企业 IM im开发

SRv6性能测量

穿过生命散发芬芳

8月月更 SRv6

ebook下载 | 《 企业高管IT战略指南——企业为何要落地DevOps》

York

云计算 DevOps 云原生 数字化转型 降本增效

重要的不是成为海贼王,而是像路飞一样去冒险

沃德

SpringMVC(三、JDBCTemplate)

开源 springmvc 8月月更

分享 6 个 Vue3 开发必备的 VSCode 插件

Geek_z9ygea

vue.js 前端 vscode vuejs

操作系统:SSH协议知识介绍

天使不哭

Linux SSH #开源 8月月更

每日一R「02」所有权与 Move 语义

Samson

签约计划第三季 8月月更 ​Rust

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