从 RNN 到 Transformer | 深度学习 本文不会涉及复杂的数学推导,也不涉及训练方面的原理,仅讲述算法基本原理与推理流程。 RNN 与 encoder-decoder 结构RNNCNN 中的权重会在空间域上移动以提取特征,RNN 的权重则会在时间域上移动以提取特征。所以 CNN 一般用于处理空间域上的特征(图片等),RNN 则用于处理时间域上的特征(文本、语音等)。 经典的 RNN 要求输⼊和输出序列必有相同的时间⻓度: 每个时刻的 2023-12-01 深度学习
Taichi Codegen 源码解读 | Taichi version: 1.2.0 commit id: f189fd791 git repo: https://code.byted.org/UGC-SDK/Rosetta-taichi/tree/dev/v1.2.0 Overview我们以一个简单的 demo 为例,从源码层面过一下整个代码生成的流程: import taichi as ti # 初始化环境 ti.init(arch=ti.v 2023-11-15 Taichi
08 中间代码优化 | 《编译原理》 这一系列是编译原理 (哈工大陈鄞、郭勇)视频课的课堂笔记,主要是课堂 PPT 和部分讲授内容的文字版,仅供参考。 流图 一个基本块中的代码要么全都执行,要么全都不执行。 指令 8 跳转到 指令 5,所以指令 5 和指令 9 都是首指令。同理指令 13 和指令 23 也是首指令。 常用的代码优化方法 复制传播本身不会优化代码,但是可以给删除无用代码带来机会。 2023-11-02 《编译原理》
06 中间代码生成 | 《编译原理》 这一系列是编译原理 (哈工大陈鄞、郭勇)视频课的课堂笔记,主要是课堂 PPT 和部分讲授内容的文字版,仅供参考。 类型表达式 声明语句的翻译 B:生成基本类型关键字 C:生成数组下标表达式序列 T:标识符类型,C 为空串时 T 生成的是基本变量,不为空串时 T 生成的是数组变量 D:声明序列 P:一个声明序列就可以构成一个程序 以上两个例子过程比较长,请参考原视频。 简单赋值语句的翻译 2023-10-29 《编译原理》
05 语法制导翻译 | 《编译原理》 这一系列是编译原理 (哈工大陈鄞、郭勇)视频课的课堂笔记,主要是课堂 PPT 和部分讲授内容的文字版,仅供参考。 语法制导翻译概述在语法分析的同时进行语义翻译,语法制导翻译即将两者放在一起实现的技术。语法制导翻译使用 CFG 来引导对语言的翻译,是一种面向文法的翻译技术。 比如一个变量,其属性就包括该变量是什么类型的,它的值是多少,存放在什么地方。类似地,表达式的属性也包括值、类型、地址等等。 2023-10-06 《编译原理》
04 语法分析 | 《编译原理》 这一系列是编译原理 (哈工大陈鄞、郭勇)视频课的课堂笔记,主要是课堂 PPT 和部分讲授内容的文字版,仅供参考。 自顶向下分析概述 对于每一棵分析树,其最左推导和最右推导都是唯一的,因为在推导的每一步,当前句型的最左非终结符和最右非终结符都是唯一的。 自顶向下的语法分析采用最左推导方式: 总是选择每个句型的最左非终结符进行替换 根据输入流中的下一个终结符,选择最左非终结符的一个候选式 2023-10-03 《编译原理》
03 词法分析 | 《编译原理》 这一系列是编译原理 (哈工大陈鄞、郭勇)视频课的课堂笔记,主要是课堂 PPT 和部分讲授内容的文字版,仅供参考。 正则表达式 正则定义 有穷自动机有穷自动机(finite automata, FA)具有一系列离散的输入输出信息和有穷数目的内部状态。 系统只需要根据当前所处的状态和当前面临的输入信息就可以决定系统的后继行为。每当系统处理了当前的输入后,系统的内部状态也将发生改变。 最 2023-09-26 《编译原理》
02 程序设计语言及其文法 | 《编译原理》 这一系列是编译原理 (哈工大陈鄞、郭勇)视频课的课堂笔记,主要是课堂 PPT 和部分讲授内容的文字版,仅供参考。 基本概念字母表 $\Sigma$ 是一个有穷符号集合,如二进制字母表(即 {0, 1})、ASCII 字符集、Unicode 字符集等。 字母表上的运算包含以下几种: 乘法: 幂运算: 正闭包(positive closure): 克林闭包(Kleene closure): 2023-09-24 《编译原理》
01 绪论 | 《编译原理》 这一系列是编译原理 (哈工大陈鄞、郭勇)视频课的课堂笔记,主要是课堂 PPT 和部分讲授内容的文字版,仅供参考。 什么是编译 编译系统的结构 词法分析概述 语法分析概述 D: declaration T: type IDS: identifier sequence 语义分析概述语义分析的主要任务: 收集标识符的属性信息 种属(kind):简单变量、复合变量(数组、记录等)、过程等 类型( 2023-09-24 《编译原理》
循环优化 | 编译器 本文是系列视频 循环优化 的笔记。 循环展开和压紧基础概念 减少循环分支指令执行的次数 获得了更多的指令级并行 增加了寄存器的重用 循环展开的合法性 循环展开需要在不影响原程序语义的情况下进行,上图中的展开就会改变原始语义。 循环完全展开 过度循环展开可能会增加寄存器的压力,引起指令缓冲区的溢出。 尾循环处理 编译器循环展开 依赖复杂的情况下编译器无法进行循环展开。 Clang 中和循环展 2023-08-30 编译器
LLVM 编译器入门 | 编译器 本文是系列视频 LLVM 编译器入门 的笔记。 项目概述项目组成CONTRIBUTING.md flang llvm-libgcc README.md libc mlir SECURITY.md libclc openmp bolt li 2023-08-27 编译器
家庭公网 IP 的配置与应用 | 玩机 本文首发于少数派:家庭公网 IP 的配置与应用。 本文主要记录了家庭公网 IP 的申请和配置(以上海电信为例),以及在 NAS 管理、远程观影和游戏机串流等场景的应用。 家庭公网 IP 的申请与配置1. 公网 IP 申请公网 IP 的申请比较方便,只需要打电话给客服说你需要公网 IP 就行,客服会直接帮你操作,一般来说 24 小时内就能搞定了。注意有时候客服会问你要公网 IP 做什么,你就回答 2023-05-10 玩机
CMake 合并静态库 | C & C++ 本文转载自《Cmake 静态库链接静态库》,原文有删改。 问题一个静态库 B 依赖了静态库 A,同时在 CMakeLists.txt 使用 target_link_libraries(B A) 设定了 B 链接 A,但是在使用 B 时,发现静态库 B 中并没有 A 的符号。也就是说,cmake 并没有帮我把静态库 A 的符号添加到静态库 B 中。 实际上,cmake 确实不会合并两个静态库,那 2023-03-05 C & C++
ranlib 的作用 | C & C++ 本文转载自《ar、ranlib、nm命令详解》,原文有删改。 前边提到过,静态库文件需要使用 ar 来创建和维护。当给静态库增建一个成员时(加入一个 .o 文件到静态库中),ar 可直接将需要增加的 .o 文件简单的追加到静态库的末尾。之后当我们使用这个库进行链接生成可执行文件时,链接器 ld 却提示错误,这可能是:主程序使用了之前加入到库中的 .o 文件中定义的一个函数或者全局变量,但链接器 2023-03-05 C & C++
修改 dyld 寻找路径 | C & C++ 将动态库 yyy.dylib 的依赖寻找路径从绝对路径改为相对路径: install_name_tool -change /absolute/path/to/lib/xxx.dylib @rpath/xxx.dylib yyy.dylib 给库 yyy.dylib 添加依赖寻找路径(即添加 @rpath 的值): install_name_tool -add_rpath /path/to/lib 2023-03-05 C & C++
如何使用 LLVM 优化器 | 编译器 本文转载自《LLVM 之 IR 篇(3):如何使用 LLVM IR 优化器》,原文有删改。 摘要本文基于 release/12.x 版本的 LLVM 源码,介绍了 LLVM IR 优化的基本概念以及 opt 工具的使用方法。从而,初步了解 LLVM IR 优化器以便更深入地研究相关内容。 LLVM IR 优化概述根据优化发生的时期,LLVM IR 层面的优化可以分为如下两种: 编译期优化。 2023-03-05 编译器
课程笔记:AI 编译器后端优化 | 编译器 本文是以下教学视频的笔记:【AI编译器】系列之后端优化 概述 前端优化与后端优化的区别前端优化:输入计算图,关注计算图整体拓扑结构,而不关心算子的具体实现。在 AI 编译器的前端优化,对算子节点进行融合、消除、化简等操作,使计算图的计算和存储开销最小。 后端优化:关注算子节点的内部具体实现,针对具体实现使得性能达到最优。重点关心节点的输入、输出、内存循环方式和计算的逻辑。 后端优化的流程 生成低 2023-01-02 编译器
课程笔记:AI 编译器前端优化 | 编译器 本文是以下教学视频的笔记:【AI编译器】系列之前端优化 概述 算子融合(OP Fusion)融合方式 融合前:启动 CD 两个 kernel 融合后:启动 C+D 一个 kernel 融合前:启动 A 一个 kernel,并发 B/C 各自启动一个 kernel 融合后:并发 A+B/A+C 各自启动一个 kernel 融合前:启动 A 一个 kernel,并发 B/C 各自启动一个 2023-01-02 编译器
课程笔记:CHI Hierarchical Instructions | Taichi 本文是 Taichi 官方教学视频的笔记: Chi Hierarchical Instructions Overview“CHI” 含义是「气」。 Why CHI? Portability High performance Taichi features Sparse programming Differentiable programming Quantization …… Statem 2022-12-11 Taichi
课程笔记:SPIR-V 代码生成流程 | Taichi 本文是 Taichi 官方教学视频的笔记: 入门GPU编译,一堂课看懂SPIR-V | 快速上手Vulkan, OpenCL背后的技术 Compute ShadersResource Binding 对于参数和返回值,是特殊的数据结构,需要进行特殊处理。而对于其他普通的 buffer,则会先查找之前是否已经 bind 过,有的话就直接返回,否则生成一个新的 binding: 在访问完所有的 st 2022-12-11 Taichi
课程笔记:核函数执行流程 | Taichi 本文是 Taichi 官方教学视频的笔记: 入门必备|想要吃透 Taichi 代码库?快速区分 field 和 kernel,速览 Taichi 底层架构 原理解析 | Taichi 代码从编译到执行,都要经历哪些过程? Overview下面是一个简单的 Taichi 程序的示例: 数据容器的编译和指令的编译是分开的: Kernel Compilation在编译 kernel 时,经历 2022-12-10 Taichi
iCloud 上传卡住 | 玩机 macOS iCloud 上传卡住 的解决办法 MACOS ICloud同步上传或下载卡住/失败/正在上传xx个项目/断网/断链问题的临时解决方案 2022-11-25 玩机
TorchScript IR 中的类型体系 | PyTorch 之前的一篇翻译《JIT Technical Overview》简单介绍了 TorchScript IR 中涉及到的几个主要类,包括 Graph、Node、Block、Value、Type 等。本文主要是从 C++ 接口的角度梳理下这些类之间的关系。 Module::attributes()通过 torch::jit::Module::attributes() 方法可以获取到 module 中的所有 2022-10-14 PyTorch
使用任意字体 | 个人博客 在大多数 hexo 主题中,虽然可以指定自定义字体,但是如果这个字体在阅读者的电脑上并没有安装,还是会用回默认的系统字体,这就大大限制了自定义字体的范围。本文则介绍一种可以让 hexo 博客使用任意字体展示的方法。 使用任意字体 将下载好的字体文件(ttf 格式)放到 ${blog_dir}/source/fonts 文件夹下(没有该文件夹就新建一个)。 新建 ${ 2022-09-24 个人博客
什么是闭包? | 计算机基础 转载自《如何通俗地解释闭包的概念?》 现在有一个函数 f(x) = a + x,这个函数是不完整的:a 是多少? 有两个方法回答这个问题,第一种叫“动态作用域”,a 的值决定于函数调用时上下文中 a 的值,比如: a = 1 v = f(1) # 这里 v 为 2 动态作用域的问题是,函数每一次调用相同的参数未必返回相同的值,其返回值还取决于上下文的某些值。 第二种是“词法作用域”,a 的值