指令集,其实就是一系列指令的集合。例如我们需要给一个局部变量赋予1这个值,即这个动作:int a = 1; 在我们看来,这很简单,但对于机器来说需要很多个动作。所以Java虚拟机指令集就是将这些常用的动作集中起来,定义成一系列指令,方便我么能使用。
https://github.com/hunterzju/llvm-tutorial
习惯在Windows下开发数据库、熟悉ADO、ADO.NET的朋友,一定对ADOConnection/ADODataSet/ADOTable等类耳熟能详。DBI的接口与之类似,但在操作方法上又有不同,对ADO熟悉的朋友不妨比较一下异同。一般来说,数据库操作由以下几个步骤组成一个常见的流程:
上篇文章为Toy添加了一个新Op(toy.or)表示逻辑或。本文介绍如何将OrOp降低到其他方言对应的Op,主要用到了RewritePattern和ConversionPattern相关的内容。
UniformGrid 控件是一个响应式的布局控件,允许把 items 排列在一组均匀分布的行或列中,以填充整体的可用显示空间,形成均匀的多个网格。默认情况下,网格中的每个单元格大小相同。
昨天在群里闲聊技术,提到了反编译和指令码。对于反编译和 JVM 的几个指令我解释了它们的各自所包含的意义。有人就问我,我是如何记住的。其实我也没记住这些指令,只不过,我总结了一个 JVM 常用指令速查手册,今天分享给大家!
在【从零开始学深度学习编译器】十二,MLIR Toy Tutorials学习笔记一 中提到MLIR是通过Dialect来统一各种不同级别的IR,即负责定义各种Operation(算子)。然后对Dialect和Operation的定义又是通过TabelGen规范构造的,通过TableGen驱动MLIR的Operation定义也被称作ODS( Operation Definition Specification) 。我们目前只是简单认识了Toy Tutorials的Dialect和Operation是如何通过ODS定义的,但对ODS本身的语法以及一些限制都没有太多了解,这就导致在看一些相关工程的Operation定义时时常陷入迷惑,不知道某个字段是什么含义,或者说自定义Op的时候的应当如何声明操作数和Attr(举个例子,要将卷积的groups参数设置为可选的属性,应该怎么做)。
现在,我们渴望生成实际的代码,并看到我们的Toy语言诞生。我们将使用LLVM生成代码,但是在这里仅仅显示LLVM构建器接口不会非常令人兴奋。取而代之的是,我们将展示如何通过在同一函数中共存的混合方言来执行渐进式降级。
页面浏览量(Page View,PV)和访客数(Unique Visitors,UV)
这篇笔记是阅读Toy Tutorials的第五章之后总结的,这一节主要讲的是将Toy Dialect Lowering的部分Operation Lowering到Affine Dialect,MemRef Dialect和Standard Dialect,而toy.print操作保持不变,所以又被叫作部分Lowering。通过这个Lowering可以将Toy Dialect的Operation更底层的实现逻辑表达出来,以寻求更多的优化机会,得到更好的MLIR表达式。
作为客户端开发者,我们每天都在接触编译器带来的便利,避免了手写机器码的麻烦,但是,某些情况下,编译器也会代码很多负面的作用。
最近在做一次MySQL数据迁移的时候,突然发现自己遗漏了一个地方,那就是权限信息没有导出,如果我们使用mysqldump --all-databases的时候没有添加--flush-privileges的时候,导出的数据中是不会包含mysql数据库的。 而我其实是比较懒的,不想因为这个重新导出一次,那么我就有几种方式选择。 如果在MySQL 5.5,5.6的版本中,我可以直接导出mysql.user的数据即可。 如果使用脚本化完成,基本是这样的形式即可,本意其实就是show gr
之前的文章基于MLIR中的Toy教程添加了操作OrOp,并从Toy Dialect降级到了Standard Op。本文主要记录了最终降级到LLVM Dialect并调用LLVM JIT执行的过程。
前面的文章中以Review一段MLIR相关的Pass代码为例子,对比了ChatGPT3.5,Claude,NewBing在该任务上的理解能力。我得出的结论是在该MLIR的相关任务上,Claude>ChatGPT3.5>>Newbing,评论区有人指出GPT4 >> Clude。我感觉上次的任务设计得不是特别好,并没有充分考察ChatGPT和Claude对MLIR的一些核心概念的理解。然后我今天借到了一个GPT4的官方账号 (daquexian 大老师提供的),我打算更全面的对比一下GPT4和Claude在对MLIR的掌握能力。接下来将从MLIR基础概念以及一个OneFlow IR转换为TOSA IR的任务出发,更全面的评价GPT4和Claude对于MLIR的掌握能力。
这一节在【从零开始学深度学习编译器】十六,MLIR ODS要点总结上篇 的基础上补充完整了ODS的要点。约束和属性的定义都是MLIR中相当重要的元素,至于类型的定义个人认为了解即可,等到我们需要自定义类型的时候再仔细研究。最后MLIR的语法比较晦涩,初学者可以借助mlir-tblgen来辅助debug。
这篇文章对MLIR的Pattern Rewrite机制进行翻译和总结。这几篇文档分别是https://mlir.llvm.org/docs/PatternRewriter/ 和 https://mlir.llvm.org/docs/Rationale/RationaleGenericDAGRewriter/ 和 https://mlir.llvm.org/docs/Canonicalization/。下面的第一节是阅读并翻译了这三篇文档之后的要点总结,方便读者可以快速把握这三篇文档的核心内容。
通过方言,MLIR允许表示许多不同的抽象级别;我们之前定义的toy方言就是这样一个例子。尽管这些不同的方言可能代表不同的抽象,但我们通常想要执行一组共同的转换和分析。出现的问题是,为每种方言原生实现每个转换都会导致大量代码重复,因为内部算法通常非常相似(如果不是相同的话)。我们希望为转换提供不透明地挂钩到像toy这样的方言的能力,以获得他们需要的信息。
【GiantPandaCV导语】这篇文章是学习了比较久然后按照自己的理解步骤重新总结了下来,主要是MLIR Toy Tutorials第3,4篇文章的内容。这里主要讲解了如何在MLIR中自定义Pass,这里主要以消除连续的Transpose操作和Reshape操作,内联优化Pass,形状推导Pass 4个例子来介绍了在MLIR中定义Pass的各种技巧,实际上也并不难理解。但要入门MLIR掌握这些Pass实现的技巧是有必要的。「我在从零开始学习深度学习编译器的过程中维护了一个project:https://github.com/BBuf/tvm_mlir_learn ,主要是记录学习笔记以及一些实验性代码,目前已经获得了150+ star,对深度学习编译器感兴趣的小伙伴可以看一下,能点个star就更受宠若惊了。」
这一期我们来做一下之前遗漏的AM和PM的对比分析、新的PM机制相比legacy PM做了哪些改进以及LLVM中PM的现状
在刚刚过去的 2023 年,WebAssembly 技术发展态势喜人,多项关键性提议都进入了新阶段,并且获得了社区与工具链的广泛深入支持。同时,其应用场景呈现出蓬勃扩展的态势,吸引着越来越多组织和个人开发者群体投入 WebAssembly 的开发之中。下文我们将首先回溯 WebAssembly 在 2023 年各项关键技术特性的进展,继而前瞻探讨新的一年它有望展现的发展趋势和前景。本文是 “2023 InfoQ 年度技术盘点与展望” 系列文章之一,由 InfoQ 编辑部制作呈现。
在前面几期中我们讲了新Pass,PassManager,Analysis是怎么样的,这期我们来讲一下PassBuilder以及实际许多Pass是如何组织起来的。
自从在 搜狐技术产品 公众号看过 一文看破Swift枚举本质 后,就一直计划在该文章的基础更加深入地挖掘一下 Swift 枚举的内存布局。但是,Swift 枚举的内存布局 涉及的内容比较多。所以,就先把 Swift 的 MemoryLayout 是如何工作的 部分拆出来单独写两篇文章。
最近在整理先前实习做的一些工作,主要是对AI compiler做基于mlir的重构,以下是之前写的compiler frontend的一个比较基础的pass,针对自定义的IR Dialect做bufferization。
在过去的几章中,我们已经构建了许多对我们的项目至关重要的系统。我们开始加载数据,构建和改进结节候选的分类器,训练分割模型以找到这些候选,处理训练和评估这些模型所需的支持基础设施,并开始将我们的训练结果保存到磁盘。现在是时候将我们拥有的组件统一起来,以便实现我们项目的完整目标:是时候自动检测癌症了。
前文我们给出了分布式autograd的设计思路,本文开始,我们进行具体源码分析。因为无论是前向传播还是反向传播,都需要依赖 RPC 来完成,所以我们先看看封装于 RPC 之上的一些基本功能,比如初始化,代理(RPC 相关功能都是基于代理完成),消息接受,发送等等。
前言 Mirror是Swift中的反射机制,对于C#和Java开发人员来说,应该很熟悉反射这个概念。反射就是可以动态的获取类型以及成员信息,同时也可以在运行时动态的调用方法和属性等。
前文我们对DDP的一些支撑模块已经做了介绍,这为本文做了必要的铺垫,本文就开始介绍Python世界代码和C++世界的初始化部分。下文介绍C++世界的核心代码。
2000年,伊利诺伊大学厄巴纳-香槟分校(University of Illinois at Urbana-Champaign 简称UIUC)这所享有世界声望的一流公立研究型大学的 Chris Lattner(他的 twitter @clattner_llvm ) 开发了一个叫作 Low Level Virtual Machine 的编译器开发工具套件,后来涉及范围越来越大,可以用于常规编译器,JIT编译器,汇编器,调试器,静态分析工具等一系列跟编程语言相关的工作,于是就把简称 LLVM 这个简称作为了正式的名字。Chris Lattner 后来又开发了 Clang,使得 LLVM 直接挑战 GCC 的地位。2012年,LLVM 获得美国计算机学会 ACM 的软件系统大奖,和 UNIX,WWW,TCP/IP,Tex,JAVA 等齐名。
领取专属 10元无门槛券
手把手带您无忧上云