运算符优先级解析算法之优先级爬升法——算法原理与实现

在 LLVM 的官方入门教程 My First Language Frontend with LLVM Tutorial 的第二章构造 AST 时涉及到了对运算符优先级解析的内容,使用的算法为 优先级爬升法。尽管教程开篇称“不需要编译原理前置预备知识”,但直接理解代码仍有点吃力,本文为我个人对此方法的理解,难免存在错误,欢迎指正。 算法原理 约定和前置知识 在优先级爬升法中,中缀表达式被分解为主表达式(primary expression)和运算符(operator),例如在表达式 a+b*c-d 中,主表达式为 ['a', 'b', 'c', 'd'],运算符包括 ['+', '*', '-'],每个运算符都有与之对应的优先级和结合性,优先级使用正整数表示相对大小,四则运算中乘除优先级高于加减,均为左结合。在本例中,约定加减的优先级为 10,乘除的为 20。 ...

发表于10月29日 · 更新于10月30日 · 共2196字

Programming Massively Parallel Processors A Hands-on Approach 4th Edition 学习笔记 Part 2

若无另外声明,本文图片均截取自原书。 Chapter 07: Convolution 卷积 本章主要介绍 2D 卷积实现,从朴素版本开始,分别使用常量内存、分块共享内存和 cache 技术依次进行优化。 7.1 Background 背景 卷积的定义此处不再赘述,简单来说就是对某个元素及其相邻元素进行加权求和。 ...

发表于10月10日 · 更新于10月24日 · 共10662字

2d 卷积梯度推导与实现

符号说明 $$ \begin{align*} X &: 卷积输入,\text{shape} 为[b,h,w,c_{in}]\\ W &: 卷积核,\text{shape}为[a,a,c_{in},c_{out}]\\ s &: 步长\\ f &: 卷积结果,\text{shape}为[b,(h-k)/s+1,(w-k)/s+1,c_{out}]\\ loss &: 损失函数,loss = g(f) \end{align*} $$ 约定,所有张量下标从 0 开始。 ...

发表于9月11日 · 更新于9月14日 · 共2018字

常用软件换源和代理配置方法

本文记录了 Windows 和 Linux 平台上常用软件和开发工具的代理配置方法,镜像源优先使用中科大源,代理默认本地代理,端口号为 7890。 Windows Winget winget 使用中科大镜像 1,需要管理员权限: 1 2 winget source remove winget winget source add winget https://mirrors.ustc.edu.cn/winget-source --trust-level trusted git 1 2 git config --global https.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890 WSL wsl 的配置文件默认路径为 %userprofile/.wslconfig,修改该文件为以下内容,就可以在 wsl 中使用 Windows 代理。 ...

发表于8月31日 · 更新于9月3日 · 共396字

在VSCode中对CUDA和Python代码进行联合调试

在 cmu10414 hw3 的最后实现矩阵乘法的算子的时候靠肉眼和 printf 实在是调不通,研究了一下怎么在 VSCode 中联合调试 CUDA 和 Python 代码,特此记录。 项目准备 原项目中将 CUDA 代码编译为 so 动态链接库供 Python 调用,使用 cmake 进行构建。这里我们来构建一个最小样例进行调试。 ...

发表于8月24日 · 更新于8月24日 · 共1588字

Programming Massively Parallel Processors A Hands-on Approach 4th Edition 学习笔记 Part 1

本文为Programming Massively Parallel Processors A Hands-on Approach 4th Edition(中文名:大规模并行处理器编程实战)第一部分学习笔记,包括全书前六章。 全书第一部分主要内容有:CUDA 架构、CUDA C 编程入门、CUDA 优化技术简介。 ...

发表于8月12日 · 更新于10月10日 · 共12248字

LogSumExp梯度推导

前言 在 CMU 10-414/714 Deep Learning System 第二个 homework 有一个小任务要对数值稳定形式的 LogSumExp 的梯度进行推导,查阅了不少资料 1,琢磨好半天才搞懂,特此记录。 推导过程 符号说明 推导过程中使用的符号说明如下: $$ \begin{align*} z &\in \mathbb{R}^n\\ z_k &= \max{z}\\ \hat{z} &= z - \max{z}\\ f &= \log{\sum_{i=1}^n{\exp{(z_i - \max{z})}}+\max{z}}\\ &=\log{\sum_{i=1}^n\exp\hat{z}_i}+z_k \end{align*} $$ 非最大情况推导 当 $z_j\neq z_k$ 时,$\frac{\partial{f}}{\partial{z_j}}$ 推导如下: ...

发表于7月20日 · 更新于7月24日 · 共667字

使用ssh远程连接wsl2

概述 wsl2 使得 Windows 用户可以很方便地访问 Linux 环境,微软也在 vscode 中提供了相应的插件支持。但 wsl2 一般都是通过本地访问的,微软似乎没有直接提供远程访问 wsl2 的方式。 经过一番摸索,远程访问 wsl2 主要有以下几个步骤: ...

发表于7月17日 · 更新于9月2日 · 共1705字

CMU 10-414 Assignments 实验笔记

前言 本文记录了完成《CMU 10-414/714 Deep Learning System》配套 Assignments 的过程和对应笔记。共有 6 个 hw,循序渐进地从头实现了一个深度学习框架,并利用搭建 DL 中厂常见的网络模型,包括 CNN、RNN、Transformer 等。 ...

发表于6月6日 · 更新于9月15日 · 共27730字

在Hugo中使用KATEX渲染数学公式

前言 在博文中插入公式是个挺常见的需求,不知道为啥 Hugo 对于公式渲染没有原生支持😞。网络上能找到两种解决方案:KATEX 和 MathJax,据说前者性能更好一点。本博客使用 KATEX 进行渲染。 ...

发表于6月5日 · 更新于6月5日 · 共1114字