【论文研读】Better Together:Unifying Datalog and Equality Saturation

news2024/11/19 4:21:46

最近研究ReassociatePass整的头大,翻两篇Datalog的论文看看。
今天看的一篇是比较新的文章,23年4月贴到arxiv上的。
本文的主要贡献是提出了egglog,将Datalog和Eqsat结合起来,继承了Datalog的efficient incremental execution, cooperating analysis and lattice

目录

  • Introduction部分
  • BackGround
    • Datalog
    • extend Datalog with lattice
    • EqSat介绍
  • Egglog
    • Sorts and Equality
  • Semantic
    • Syntax
    • Semantics
  • IMPLEMENTATION
    • Components
  • CASE STUDIES
    • Herbie

本文的主要评估方式是针对一些其中一方无法执行的例子,发现这些project在egglog中能够更快,更简单,且解决了Datalog中发现的bug。
本文的代码库 链接附上。

Introduction部分

Datalog主要研究方向:database community practitioners use modern implementations to build program analysis。
附了三篇参考文献:
George Balatsouras and Yannis Smaragdakis. 2016. Structure-Sensitive Points-To Analysis for C and C++. In Static Analysis

  • 23rd International Symposium, SAS 2016, Edinburgh, UK, September 8-10, 2016, Proceedings (Lecture Notes in Computer
    Science, Vol. 9837), Xavier Rival (Ed.). Springer, 84–104. https://doi.org/10.1007/978-3-662-53413-7_5

Langston Barrett and Scott Moore. 2022. cclyzer++: Scalable and Precise Pointer Analysis for LLVM. https://galois.com/
blog/2022/08/cclyzer-scalable-and-precise-pointer-analysis-for-llvm/.

Yannis Smaragdakis and Martin Bravenboer. 2010. Using Datalog for Fast and Easy Program Analysis. In Proceedings of
the First International Conference on Datalog Reloaded (Oxford, UK) (Datalog’10). Springer-Verlag, Berlin, Heidelberg,
245–251. https://doi.org/10.1007/978-3-642-24206-9_14

Herbie [Panchekha et al. 2015], a tool that uses EqSat to optimize
floating-point accuracy, relies on unsound rewrites because it lacks the analyses to prove that
certain rewrites are safe (e.g. 𝑥/𝑥 → 1 only if 𝑥 ≠ 0). To combat the unsoundness, Herbie must
validate the results of EqSat and discard them if unsoundness was detected.
上文似乎解决了浮点数的sound问题,以后可以看。

On the Datalog side,
cclyzer++ [Barrett and Moore 2022], a recent points-to analysis system implemented in Datalog
that supports Steensgaard analyses [Steensgaard 1996] for LLVM [Lattner and Adve 2004] resorted
to an ad-hoc implementation of union-find, because the provided implementation of equivalence
relations was too slow.
LLVM中的Steensgaard analyses。

上述分析的目的:Datalog和Eqsat两边各有问题。
Our key insight is that the efficient equational reasoning of EqSat and the rich, composable semantic analyses of Datalog make up for each other’s weaknesses, and unifying the two paradigms brings together—and goes beyond—the best of both worlds.

In fact, spontaneous developments in both communities have already begun converging towards each other: Datalog tools have added efficient
equivalence relations [Nappa et al. 2019], lattices [Madsen et al. 2016; Sahebolamri et al. 2022], and some support for datatypes [Developers [n.d.]], while the EqSat community has recently developed support for conditional rewriting, lattice-based analyses [Cheli 2021; Willsey et al. 2021], and relational pattern matching [Zhang et al. 2022]. We bring this trend to completion and close the gap between EqSat and Datalog.
大把文献,看到头秃。上述论文都是在某个系统上面做扩充,问题在于这些扩充能否解决本文所解决的问题?效果如何?

本文的评估办法:

  1. 用egglog实现Steensgaard-style points-to analyses faster and easier to write and compare to Souffle with 4.96x
  2. egglog 能够实现一个更新的更完善的Herbie的EqSat过程。在给定的错误容忍度下能够实现更快的给出结果(未给出倍率)

BackGround

egglog扩充了Datalog以纳入EqSat,我想这就是作者为什么将其命名为egglog而不是eggSat。

Datalog

Each rule is a conjunctive query of the form 𝑄(x) :- 𝑅1(x1), 𝑅2(x2), . . . , 𝑅𝑛(x𝑛) where each x and x𝑖 is a tuple of variables or constants. The atom 𝑄(x) is called the head of the rule, and the atoms 𝑅𝑖 (x𝑖) comprise the body.
定义了连接查询和查询头、查询体。
在这里插入图片描述
介绍Datalog时给了一个很经典的图,这个图和Souffle官方教程中的path很类似,用过Souffle的很熟悉。
定义了ICO(Immediate consequence operator)函数,其实就是一个推导的过程。这个过程其实就是找fixpoint的过程。

extend Datalog with lattice

在这里插入图片描述
把Datalog扩充到支持格的水平,这三篇论文也可以以后阅读。
实质就是将原来的针对变量或常量的函数扩充到针对格映射的函数。
在这里插入图片描述
此处介绍了EqSat的优势,也即能够解决上述的因为rewrite造成优化机会丢失的例子。

EqSat介绍

EqSat本质上是将Rewrite和history同时保存然后获得二者的好处。
文章还介绍了一些EqSat的扩展,例如,支持语义分析以增加Soundness。
Multi-pattern,看起来是将pattern的过程并行了,有两篇文章是这方面的工作,但还没有达到更优。
提高e-matching的效率,最近的技术是relational e-matching。
论文:
Yihong Zhang, Yisu Remy Wang, Max Willsey, and Zachary Tatlock. 2022. Relational E-Matching. Proc. ACM Program.
Lang. 6, POPL, Article 35 (jan 2022), 22 pages. https://doi.org/10.1145/3498696
这个技术的问题在于会出现dual representation问题,也即引擎会在e-graph和相关的database representation之间往复。
(需要在相关论文中看这个问题的例子)

Egglog

在这里插入图片描述
egglog看起来好抽象,尤其是括号的使用,看起来是使用了前缀表达式的形式,运算符出现在括号的第一个元素,操作数出现在括号的第二个和第三个元素。
egglog还引用了function。
在这里插入图片描述
从前缀表达式角度理解上述代码就不会被复杂的嵌套括号困住。
作者解释了:merge的作用,也即处理格的交会功能,例如此处从1到3有两个路径,一种是1直接到3的边30,一种是1到2到3的路径,长度为20,所以需要定义两种情况的取舍,也即join operator。

上述一段代码,无法直接在egglog中运行,因为支持的指令需要改为(run 1) repeat指运行次数,可以多次验证是否匹配。

Sorts and Equality

unification操作,看起来就是将两个点统一成一个点,然后进行分析。
opaque integer values,这里的opaque很有意思,有晦涩的意思,其实相等变量的识别一直不是显而易见的(不同于常量识别)。

Semantic

Syntax

此部分介绍egglog core,不包含那些例如:merge的语法糖。
·在这里插入图片描述
结合论文中的文字看这个语法还是比较简单的。
uninterpreted constant 和 interpreted constant的区别:
These uninterpreted constants play a similar role as e-class ids in EqSat or labelled nulls in the chase from the database
literature.

在EqSat中,e-class id(等价类标识符)用于标识相同的表达式或值的等价类。
此处uninterpreted constant看起来像类似于值编号中的编号。

Semantics

首先给出模式的定义:
A schema 𝑆 is a collection of function symbols and their function signatures, where the types range over
{𝑁 , 𝐶}.
其中N和C分别是uninterpreted constant和interpreted constant的集合。S其实是表示某一类符合同一模式的函数的集合。
在这里插入图片描述S的一个元素定义为I,其中既包含一个函数集合,又包含一个等价关系。
在这里插入图片描述此处定义了另一种judgement符号表示某个atom在一个database中。
理解了一系列定义之后,上面三个推理过程就显而易见了,首先要明确的是对于两种符号,带箭头的符号优先级比不带箭头的符号高。
第一个:对于每个i都满足ti和vi的函数关系,且这些函数关系同属于一个database,那么将DB中的函数参数从vi换成ti依旧能满足上述关系。
第二个:对于任何一个Database,都存在变量到自身的函数。
第三个:对于任何函数都能退出v,那么该函数本身也是成立的。

定义了pre-instance和valid instance以及转换函数rebuilding operator。
在这里插入图片描述根据上述函数的定义给出了semi-naive evaluation algorithm.

IMPLEMENTATION

用Rust实现的。。。不是很熟悉。

Components

egglog’s rebuilding procedure is based on the rebuilding procedure from
egg [Willsey et al. 2021], which is in turn based on the congruence closure algorithm from Downey
et al. [1980].
上述两篇对理解Rebuilding operator会有帮助。
在这里插入图片描述结合此处的例子更好理解Rebuilding operator的作用,首先有一个函数f对两个不同的输入有不同的输出,现在将a和c进行union操作,会出现对a的输出同时为b和d,这就出现了冲突(类似于常量折叠中出现了某个变量可能对应两个常量)。因此需要进行merge,获得统一的结果,但这种merge又可能会造成更多的union,最终程序要一直运行到固定点。
问题在于?如何确保程序一定能够结束。

CASE STUDIES

[Balatsouras and Smaragdakis 2016; Bravenboer and Smaragdakis
2009; Whaley et al. 2005]
一些程序分析工具。
文中将指针分析工具分为两类,一类是基于subset的例如Anderson类型的,一类是基于unification的,例如Steensgaard类型的,前者精确但是二次复杂度的,后者是线性复杂度的但不够精确。

Herbie

Herbie是一个是浮点数程序更精确的工具,可以根据一个输入返回一个更精确的浮点数实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1435036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CISCRISC? CPU架构有哪些? x86 ARM?

编者按:鉴于笔者水平有限,文中难免有不当之处,还请各位读者海涵。 是为序 我猜,常年混迹CSDN的同学应该不会没听说过CPU吧? 但你真的了解CPU吗?那笔者问你CPU有哪些架构呢? 如果你对你的答案…

MC34063异常发热分析

问题描述: 工程现场反馈若干电源转换模块损坏,没有输出。拿到问题模块后,查看有一个MC34063周围的PCB有比较明显的高温痕迹,配套的电感也有明显的高温过热痕迹。 问题调查: MC34063的电路非常经典(虽然自…

npm 上传一个自己的应用(3) 在项目中导入及使用自己上传到NPM的工具

上文 npm 上传一个自己的应用(2) 创建一个JavaScript函数 并发布到NPM 我们创建了一个函数 并发上了npm 最后 我们这里 我们可以看到它的安装指令 这里 我们可以打开一个vue项目 终端输入 我们的安装指令 npm i 自己的包 如下代码 npm i grtest我们在 node_modules目录 下…

《爬虫职海录》卷二 • 爬在广州

HI,朋友们好,「爬虫职海录」第二期更新啦! 本栏目的内容方向会以爬虫相关的“岗位分析”和“职场访谈”为主,方便大家了解一下当下的市场行情。 本栏目持续更新,暂定收集国内主要城市的爬虫岗位相关招聘信息&#xf…

BUUCTF-Real-[ThinkPHP]IN SQL INJECTION

目录 漏洞描述 漏洞分析 漏洞复现 漏洞描述 漏洞发现时间&#xff1a; 2018-09-04 CVE 参考&#xff1a;CVE-2018-16385 最高严重级别&#xff1a;低风险 受影响的系统&#xff1a;ThinkPHP < 5.1.23 漏洞描述&#xff1a; ThinkPHP是一款快速、兼容、简单的轻量级国产P…

React 实现表单组件

表单是html的基础元素&#xff0c;接下来我会用React实现一个表单组件。支持包括输入状态管理&#xff0c;表单验证&#xff0c;错误信息展示&#xff0c;表单提交&#xff0c;动态表单元素等功能。 数据状态 表单元素的输入状态管理&#xff0c;可以基于react state 实现。 …

ubuntu22.04@laptop OpenCV Get Started: 000_hello_opencv

ubuntu22.04laptop OpenCV Get Started: 000_hello_opencv 1. 源由2. Hello OpenCV2.1 C应用Demo2.2 Python应用Demo 3. 参考资料 1. 源由 之前&#xff0c;通过敲门砖已经砸开了OpenCV的大门&#xff0c;接下来是体验下“Hello World&#xff01;”程序。 2. Hello OpenCV …

LeetCode:13.罗马数字转整数

13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 目录 思路&#xff1a; 官解代码&#xff1a; 作者辣眼代码: 每日表情包&#xff1a; 思路&#xff1a; 思路已经很明了了&#xff0c;题目已经给出一般规则和特殊规则&#xff08;而且题目确保给定的是正确的…

Node.js JSON Schema Ajv依赖库逐步介绍验证类型和中文错误提示

在构建应用程序时&#xff0c;数据的有效性是至关重要的。为了确保传入的数据符合预期的格式和规范&#xff0c;我们可以使用 Ajv&#xff08;Another JSON Schema Validator&#xff09;进行验证。在这篇博文中&#xff0c;我们将从头开始学习 Ajv&#xff0c;逐步介绍验证类型…

使用webstorm调试vue 2 项目

学习目标&#xff1a; 使用webstorm调试vue 2 项目 笔者环境&#xff1a; npm 6.14.12 webstorm 2023.1 vue 2 学习内容&#xff1a; 例如&#xff1a; 正常启动npm 项目 配置javaScruot dubug 配置你的项目地址就好 使用dubug运行你配置的调式页 问题 如果进入了js页无…

模拟被观察物体的位置和方向

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题&#xff1a;模拟被观察物体的位置和方向&#xff0c;以帮助用户理解相机在观察特定对象时的位置和朝向。vtkCameraOrientationWidget 模拟的是被观察…

【Iceberg学习四】Evolution和Maintenance在Iceberg的实现

Evolution Iceberg 支持就底表演化。您可以像 SQL 一样演化表结构——即使是嵌套结构——或者当数据量变化时改变分区布局。Iceberg 不需要像重写表数据或迁移到新表这样耗费资源的操作。 例如&#xff0c;Hive 表的分区布局无法更改&#xff0c;因此从每日分区布局变更到每小…

MySQL查询优化技巧和10个案例展示

优化MySQL查询的实战技巧&#xff1a; **避免使用SELECT ***&#xff1a;只获取需要的列&#xff0c;这样可以减少数据传输量&#xff0c;提高查询效率。使用索引&#xff1a;为查询频繁的列创建索引&#xff0c;可以显著提高查询速度。但请注意&#xff0c;索引并非万能&…

Docker下安装GitLab

极狐GitLab Docker 镜像 | 极狐GitLab 安装所需最小配置 内存至少4G 系统内核至少3.10以上 uname -r 命令可以查看系统内核版本 安装Docker 1.更新 yum源 yum update 2.安装依赖(如果在操作第三步的时候提示yum-config-manager 未找到命令 就安装下面依赖) yum instal…

Linux【docker 设置阿里源】

文章目录 一、查看本地docker的镜像配置二、配置阿里镜像三、检查配置 一、查看本地docker的镜像配置 docker info一般没有配置过是不会出现Registry字段的 二、配置阿里镜像 直接执行下面代码即可&#xff0c;安装1.10.0以上版本的Docker客户端都会有/etc/docker 1.建立配置…

从Kafka系统中读取消息数据——消费

从Kafka系统中读取消息数据——消费 消费 Kafka 集群中的主题消息检查消费者是不是单线程主题如何自动获取分区和手动分配分区subscribe实现订阅&#xff08;自动获取分区&#xff09;assign&#xff08;手动分配分区&#xff09; 反序列化主题消息反序列化一个类.演示 Kafka 自…

ubuntu22.04@laptop OpenCV Get Started: 001_reading_displaying_write_image

ubuntu22.04laptop OpenCV Get Started: 001_reading_displaying_write_image 1. 源由2. Read/Display/Write应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 过程分析3.1 导入OpenCV库3.2 读取图像文件3.3 显示图像3.4 保存图像文件 4. 总结5. 参考资料 1. 源由 读、写、显示图像…

annaconda如何切换当前python环境

annaconda默认的python环境是base&#xff1a; 把各种项目的依赖都安装到base环境中不是一个好的习惯&#xff0c;比如说我们做爬虫项目和做自动化测试项目等所需要的依赖是不一样的&#xff0c;我们可以将为每个项目创建自己的环境&#xff0c;在各自的环境中安装自己的依赖&…

javaEE - 23( 21000 字 Servlet 入门 -1 )

一&#xff1a;Servlet 1.1 Servlet 是什么 Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app. 构建动态页面的技术有很多, 每种语言都有一些相关的库/框架来做这件事&#xff0c;Servlet 就是 Tomcat 这个 HTTP…

IntelliJ IDE 插件开发 | (六)内部模式的使用

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听IntelliJ IDE 插件开发 |&#xff08;四&#xff09;来查收…