论文阅读: CCF A 2021 PROGRAML:用于数据流分析和编译器优化的基于图的程序表示 (PMLR)
Motivation:
编译器实现是一项复杂而昂贵的活动。出于这个原因,人们对使用机器学习来自动化各种编译器任务产生了极大的兴趣,大多数工作都将注意力限制在选择编译器启发式或做出优化决策。现有的基于专家人工操作和基于机器学习的方法都不足以满足需求。(决策需要对程序及其行为进行推理。 专家决策通常依赖于数据流分析,工作量大,复杂且难以迁移;机器学习工作通常将程序的全部行为表示为一个固定长度、静态计算的特征向量。这类方法的明显弱点是,它们被添加的dead code所混淆,dead code改变了它们的特征向量,而不会改变程序的行为或对优化的响应。 这种学习算法无法学习它们自己对程序的抽象解释,因此无法解决这种情况。)所以需要一个程序表示,使机器学习算法能够通过开发自己的数据流分析来推理程序的执行。
Challenge:
- 输入的表示方式——如何把程序转换成图并尽可能多的涵盖数据流分析相关信息;
- 数据的处理方式——依赖关系等信息获取;
Contribution:
- 提出了一种可移植的、独立于语言的、由编译器IR派生的程序的图形表示——PROGRAML, 可以同时捕获指令和操作数之间的控制、数据和调用关系,以及它们的顺序和数据类型。 Programl是一个与编译器无关的设计,文章做了LLVM和XLA IRs下的实现。;
- 引入基准数据集DeepDataFlow(编译器分析任务,作为有监督的机器学习问题,多领域,多语言,共85亿个数据流分析分类标签);————这个后面可以去看一下,能不能用
- 模型选用Gated-Graph Neural Networks (GGNN) ,然后就是对比实验结果巴拉巴拉。。。
Methodllogy:
构图部分:
PROGRAML将程序转化为有向图,指令、变量、常量为节点。它们之间的关系为边,边被类型化以区分控件流、数据流和调用流。
图3b为full-flow graph,节点为指令,边为关系。——控制流部分
然后把常数和变量作为节点加入其中(图3c),产生数据流边(常量和变量与使用它们作为操作数的指令之间的关系和指令到产生的变量之间的关系)。——数据流部分
最后再插入调用边来表征调用函数的指令和被调用函数的入口指令之间的关系。——call-flow部分
生成的图是多个小图合成的一个大图。小图间由call边相连。
算法模型部分:
基于GGNN[1]改编;包括三个阶段:输入编码、消息传播和更新以及结果读出。
Experiment:
以sequential model 和graph model做baseline做对比实验。(基于Vocabulary Coverage, DDF-30: Testing on Limited Problem Size, DDF-60: Generalizing to Larger Problems和DDF: Scalability Challenges分析)
Reference:
[1] Li, Y., Zemel, R., Brockscmidt, M., and Tarlow, D. Gated Graph Sequence Neural Networks. arXiv:1511.05493,2015.