<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Puff&apos;s Blog</title><description>Sometimes I like to imagine.</description><link>https://astro-pure.js.org</link><item><title>在 WSL 2 中配置 Synopsys 工具</title><link>https://astro-pure.js.org/blog/wsl2-synopsys/wsl2synopsys</link><guid isPermaLink="true">https://astro-pure.js.org/blog/wsl2-synopsys/wsl2synopsys</guid><description>详细介绍在 WSL 2 环境中配置和使用 Synopsys 工具的步骤和注意事项</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import {
Aside, Tabs, TabItem, Steps, MdxRepl, Card, Collapse, CardList, Timeline,
Button, Spoiler, FormattedDate, Label, Svg, Icon
} from &apos;astro-pure/user&apos;
import { Quote, GithubCard, LinkPreview, QRCode, MediumZoom } from &apos;astro-pure/advanced&apos;
import { Icons as allIcons } from &apos;astro-pure/libs&apos;
import { Comment } from &apos;@/components/waline&apos;
import { Code } from &apos;astro:components&apos;
import { Image } from &apos;astro:assets&apos;
import myImage from &apos;./WSL2Synopsys.jpg&apos;&lt;/p&gt;
&lt;p&gt;export const cardListData = [
{ title: &apos;文档链接&apos;, link: &apos;/docs&apos; },
{ title: &apos;二级目录&apos;, children: [{ title: &apos;子项&apos;, link: &apos;/docs/integrations/components&apos; }] }
]&lt;/p&gt;
&lt;p&gt;export const timelineData = [
{ date: &apos;2026-05-17&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-05-17&apos;, content: &apos;发布文章&apos; }
]&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;由于没有商用的Synopsys的license，在之前的使用中都是使用预装Synopsys的虚拟机进行仿真和综合。然而问题是，虚拟机的性能利用非常低，同样一个项目，对比在windows系统下使用vivado等工具进行仿真或综合，虚拟机的需要耗费的时间极多，而且虚拟机的GUI大多非常难看，不如VSCode。因此打算在WSL 2中进行Synopsys工具的配置。&lt;/p&gt;
&lt;h2&gt;选型&lt;/h2&gt;
&lt;p&gt;我的想法是需要有一个能用VSCode中Romote - WSL插件连接到的Linux发行版，查阅&lt;a href=&quot;https://code.visualstudio.com/docs/remote/linux&quot;&gt;VSCode文档&lt;/a&gt;得知对版本有一定的限制。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./fig1.png&quot; alt=&quot;文档&quot;&gt;&lt;/p&gt;
&lt;p&gt;对EDA工具来说，支持比较好的一般是CentOS。然而听说Synopsys的较旧版本（我手头能拿到的版本）往往对CentOS有一些限制（而且我也不熟悉这个），因此我选择了Ubuntu20.04。&lt;/p&gt;
&lt;p&gt;下面附上完整的各种版本&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Windows 11
WSL2
Ubuntu 20.04.6 LTS
VS Code Remote - WSL
Synopsys 2018:
  SCL 2018.06
  VCS O-2018.09-SP2
  Verdi O-2018.09-SP2
  Design Compiler O-2018.06-SP1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;WSL 2 安装&lt;/h2&gt;
&lt;p&gt;Windows11似乎不能直接下载20.04的版本，且下载后也需要迁移盘不然C盘会被占满，因此选择&lt;a href=&quot;https://releases.ubuntu.com/focal/&quot;&gt;下载镜像&lt;/a&gt;然后安装的方式。
x86_64选择&lt;a href=&quot;https://releases.ubuntu.com/focal/ubuntu-20.04.6-wsl-amd64.wsl&quot;&gt;ubuntu-20.04.6-wsl-amd64.wsl&lt;/a&gt;即可&lt;/p&gt;
&lt;p&gt;在安装时，我的习惯是把镜像和系统分开装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;EDA-Tools
	- images
	- OS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装命令如下&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wsl --import [取一个WSL2名字] [OS文件夹路径] [镜像文件路径] --version 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后启动，我的叫Ubuntu20.04-EDA&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wsl -d Ubuntu20.04-EDA
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;初步配置&lt;/h2&gt;
&lt;p&gt;首先换apt源，当然也可以给虚拟机换一个代理。&lt;/p&gt;
&lt;p&gt;换源的方法参考&lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/&quot;&gt;清华大学开源软件镜像站&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这里面没有20.04的版本了，这边贴出我的配置&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;# Ubuntu 20.04 LTS
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse  
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse  
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse  
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse  
  
# 源码包，一般不用，先注释掉  
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse  
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse  
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse  
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后更新下就行&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;source ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;换源后就可以安装依赖&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y \
  build-essential make gcc g++ gcc-multilib g++-multilib \
  vim nano wget curl unzip tar gzip bzip2 file \
  csh ksh tcsh net-tools iproute2 lsb-release \
  x11-apps mesa-utils \
  libx11-6 libxext6 libxi6 libxrender1 libxtst6 libxss1 \
  libxft2 libxmu6 libxpm4 libxrandr2 libgtk2.0-0 \
  libncurses5 libtinfo5 \
  libcanberra-gtk-module libcanberra-gtk3-module \
  fontconfig xfonts-base xfonts-75dpi xfonts-100dpi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在其他教程中需要的&lt;code&gt;libnsl2&lt;/code&gt;这个库可能无法安装，因此后面的图形化界面也无法安装，但是后续发现这个库不影响的&lt;/p&gt;
&lt;p&gt;接着安装图形化界面库&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y x11-apps mesa-utils xterm
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;修改dash&lt;/h2&gt;
&lt;p&gt;Ubuntu默认的terminal行为是dash，但是Synopsys需要接近bash的行为，因此需要修改&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;dash dash/sh boolean false&quot; | sudo debconf-set-selections
sudo DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证一下&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ls -l /bin/sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;期望会输出&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/bin/sh -&gt; bash
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装MobaXterm&lt;/h2&gt;
&lt;p&gt;Synopsys的安装是GUI界面的，然而VSCode对虚拟环境GUI的支持是个老毛病了，因此这里选择使用&lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;。随后GUI的安装界面都用这个执行。&lt;/p&gt;
&lt;h2&gt;安装包准备&lt;/h2&gt;
&lt;p&gt;到这里 WSL2 的环境基本配置完成，接下来开始准备Synopsys的安装包。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/332589990&quot;&gt;这篇文章&lt;/a&gt;里有Synopsys2018的安装包。&lt;/p&gt;
&lt;p&gt;下载解压后，把安装包迁移到WSL 2中，对于WSL 2，windows端的磁盘对它是一个挂载路径，例如&lt;code&gt;/mnt/f/Synopsys/Synopsys2018/synopsysinstaller_v5.0.rar&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;几个软件分别是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下载器：synopsysinstaller_v5.0.rar&lt;/li&gt;
&lt;li&gt;vcs：vcs_vO-2018.09-SP2&lt;/li&gt;
&lt;li&gt;dc：syn_vO-2018.06-SP1&lt;/li&gt;
&lt;li&gt;verdi：verdi-2018.09&lt;/li&gt;
&lt;li&gt;scl：scl_v2018.06&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用&lt;code&gt;cp -av&lt;/code&gt;指令复制到虚拟机的路径下。推荐所有安装包在&lt;code&gt;~/&lt;/code&gt;目录下，安装的软件在&lt;code&gt;/opt/synopsys&lt;/code&gt;目录下。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir -p ~/eda/synopsys/installer
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mkdir -p /opt/synopsys
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;运行 Synopsys Installer&lt;/h2&gt;
&lt;p&gt;解压installer后，cd进目录后，给权限进行安装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd ~/eda/synopsys/installer/synopsysinstaller_v5.0
chmod +x SynopsysInstaller_v5.0.run
./SynopsysInstaller_v5.0.run
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;chmod +x setup.sh
./setup.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最好按这个顺序进行安装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;1. SCL 2018.06
2. VCS O-2018.09-SP2
3. Verdi O-2018.09-SP2
4. DC O-2018.06-SP1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体安装的流程，怎么选择路径参考这篇文章，其中需要选择的第一个路径是安装包路径，第二个是软件安装目录，就是opt那个&lt;/p&gt;
&lt;h2&gt;配置license&lt;/h2&gt;
&lt;p&gt;依旧参考&lt;a href=&quot;https://zhuanlan.zhihu.com/p/332589990&quot;&gt;这篇文章&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其中需要注意的是，用户名一般会发生变化，不是文中说的&lt;code&gt;localhost.localdomain&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这一步我也不是很确定，建议配置一下IP文件，否则后面license很可能对不上&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cp /etc/hosts /etc/hosts.bak
sudo nano /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置成类似如下形式&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;127.0.0.1       localhost localhost.localdomain
127.0.1.1       Puff Puff.localdomain

# The following lines are desirable for IPv6 capable hosts
::1             localhost ip6-localhost ip6-loopback
fe00::0         ip6-localnet
ff00::0         ip6-mcastprefix
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;替换下用户名即可，但是这样替换后可能会导致VSCode的WSL服务连不上，为此需要shutdown一个开机服务&lt;/p&gt;
&lt;p&gt;编辑&lt;code&gt;/etc/wsl.conf&lt;/code&gt;文件，将其中内容改为&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;[network]
generateHosts = false

[user]
default = puff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即删除systemd服务，随后按照文中内容生成license即可&lt;/p&gt;
&lt;h2&gt;配置环境变量&lt;/h2&gt;
&lt;p&gt;这一步的目的是为了让系统知道软件在哪，并且配置license启动&lt;/p&gt;
&lt;p&gt;编辑&lt;code&gt;~/.bashrc&lt;/code&gt;，在里面添加如下内容&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# ================= Synopsys 2018 =================

export SYNOPSYS_ROOT=/opt/synopsys

# VCS / DVE
export VCS_HOME=$SYNOPSYS_ROOT/vcs/O-2018.09-SP2
export VCS_MX_HOME=$SYNOPSYS_ROOT/vcs-mx/O-2018.09-SP2
export DVE_HOME=$VCS_HOME

# Verdi
export VERDI_HOME=$SYNOPSYS_ROOT/verdi/Verdi_O-2018.09-SP2

# SCL
export SCL_HOME=$SYNOPSYS_ROOT/scl/2018.06

# Design Compiler
export DC_HOME=$SYNOPSYS_ROOT/syn/O-2018.06-SP1

# PATH
export PATH=$SCL_HOME/linux64/bin:$VCS_HOME/bin:$VCS_HOME/gui/dve/bin:$VERDI_HOME/bin:$DC_HOME/bin:$PATH

# Library path
export LD_LIBRARY_PATH=$VERDI_HOME/share/PLI/VCS/LINUX64:$VCS_HOME/linux64/lib:$LD_LIBRARY_PATH

# Compatibility
export VCS_ARCH_OVERRIDE=linux

# License
export LM_LICENSE_FILE=27000@Puff
export SNPSLMD_LICENSE_FILE=$LM_LICENSE_FILE

# Manual license control
alias start-eda=&apos;lmgrd -c /opt/synopsys/scl/2018.06/admin/license/Synopsys.dat -l ~/lmgrd.log&apos;
alias lms_synopsys=&apos;lmstat -a -c 27000@Puff&apos;
alias lmk_synopsys=&apos;pkill -f lmgrd; pkill -f snpslmd&apos;

# =================================================
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中&lt;code&gt;start-eda&lt;/code&gt;是我启动license的命令，可以修改&lt;/p&gt;
&lt;p&gt;以后启动时只需要在terminal输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;start-eda
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即可挂起license进行启动&lt;/p&gt;
&lt;h2&gt;Toolchain依赖&lt;/h2&gt;
&lt;p&gt;VCS和DC在使用时会缺一些库，且是老版本的（没办法，系统和软件不兼容的老问题了），但是可以通过一些方法解决&lt;/p&gt;
&lt;h3&gt;VCS&lt;/h3&gt;
&lt;p&gt;vcs初次启动遇到这个问题&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/opt/synopsys/vcs/O-2018.09-SP2/bin/vcs: line 3312: dc: command not found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解决&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y dc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时在日志中会出现大量&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/usr/bin/ld: ... undefined reference to ...
collect2: error: ld returned 1 exit status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是Ubuntu 20.04无法链接simv，在编译时加一些编译选项即可&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;-LDFLAGS &quot;-Wl,--no-as-needed&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Verdi&lt;/h3&gt;
&lt;p&gt;Verdi缺一个库&lt;code&gt;libpng12.so.0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;使用如下命令安装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /tmp
wget http://security.ubuntu.com/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1.1_amd64.deb
sudo dpkg -i libpng12-0_1.2.54-1ubuntu1.1_amd64.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;DC&lt;/h3&gt;
&lt;p&gt;DC缺库&lt;code&gt;libtiff.so.3&lt;/code&gt;和&lt;code&gt;libmng.so.1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;分别使用如下解决，简历软链接&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y libtiff5
sudo ln -sf /usr/lib/x86_64-linux-gnu/libtiff.so.5 /usr/lib/x86_64-linux-gnu/libtiff.so.3
sudo ldconfig
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y libmng2
sudo ln -sf /usr/lib/x86_64-linux-gnu/libmng.so.2 /usr/lib/x86_64-linux-gnu/libmng.so.1
sudo ldconfig
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;开始使用&lt;/h2&gt;
&lt;p&gt;所有安装步骤都已经完成了，检查下vcs，dc和verdi是否能正常使用&lt;/p&gt;
&lt;p&gt;推荐安装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Digital HDL 插件，用于代码高亮&lt;/li&gt;
&lt;li&gt;Codex/Copilot，帮助你解决本文中可能没有提到的问题&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="/_astro/WSL2Synopsys.CePaky3v.jpg"/><enclosure url="/_astro/WSL2Synopsys.CePaky3v.jpg"/></item><item><title>初探CUDA (1)</title><link>https://astro-pure.js.org/blog/%E5%88%9D%E6%8E%A2cuda-1/%E5%88%9D%E6%8E%A2cuda1</link><guid isPermaLink="true">https://astro-pure.js.org/blog/%E5%88%9D%E6%8E%A2cuda-1/%E5%88%9D%E6%8E%A2cuda1</guid><description>最近想学习一下CUDA，这篇文章作为一个开头。</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import {
Aside, Tabs, TabItem, Steps, MdxRepl, Card, Collapse, CardList, Timeline,
Button, Spoiler, FormattedDate, Label, Svg, Icon
} from &apos;astro-pure/user&apos;
import { Quote, GithubCard, LinkPreview, QRCode, MediumZoom } from &apos;astro-pure/advanced&apos;
import { Icons as allIcons } from &apos;astro-pure/libs&apos;
import { Comment } from &apos;@/components/waline&apos;
import { Code } from &apos;astro:components&apos;
import { Image } from &apos;astro:assets&apos;
import myImage from &apos;./rossy.png&apos;&lt;/p&gt;
&lt;p&gt;export const cardListData = [
{ title: &apos;文档链接&apos;, link: &apos;/docs&apos; },
{ title: &apos;二级目录&apos;, children: [{ title: &apos;子项&apos;, link: &apos;/docs/integrations/components&apos; }] }
]&lt;/p&gt;
&lt;p&gt;export const timelineData = [
{ date: &apos;2026-05-05&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-05-05&apos;, content: &apos;发布文章&apos; }
]&lt;/p&gt;
&lt;h2&gt;整体架构&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./1.png&quot; alt=&quot;1&quot;&gt;&lt;/p&gt;
&lt;p&gt;与CPU不同，GPU的控制逻辑较少，GPU的一行可以看作一个单元，这个单元叫做SM（Streaming Multiprocessor，流式多处理器）。
一个SM基本由以下几个单元构成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CUDA Core：负责MAC计算，可以理解为GPU中的ALU&lt;/li&gt;
&lt;li&gt;SFU：负责进行特殊运算，如三角运算等&lt;/li&gt;
&lt;li&gt;LD/ST（Load/Store）单元：负责内存加载和存储&lt;/li&gt;
&lt;li&gt;Warp Scheduler：warp是线程的集合，通常是一组32个。在一个SM中，通常驻留了很多warp，Warp Scheduler复杂挑选出可以执行的Warp，交给Dispatch Unit&lt;/li&gt;
&lt;li&gt;Dispatch Unit：负责将一个Warp分给具体的单元（CUDA Cores、LD/ST 或 SFU）执行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./5.png&quot; alt=&quot;2&quot;&gt;&lt;/p&gt;
&lt;h2&gt;自底向上&lt;/h2&gt;
&lt;p&gt;一般来说，非CPU的加速计算资源，都有一套配套的运行环境。自底向上，分别是&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;硬件本身 --&gt; Driver --&gt; Runtime --&gt; Libraries
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一般来说暴露给开发人员的都是Runtime和Libraries这两层&lt;/p&gt;
&lt;h2&gt;线程的分层与管理&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./4.png&quot; alt=&quot;3&quot;&gt;&lt;/p&gt;
&lt;p&gt;在GPU中，由于运用了超线程技术，需要对大量的线程进行管理，因此在启动一个kernel的时候，会对其中的thread进行分层&lt;/p&gt;
&lt;p&gt;具体而言，多个threads组成一个线程块（Thread Block），然后多个线程块组成一个网格（Grid）&lt;/p&gt;
&lt;p&gt;需要注意的是，在执行过程中，同一个Thread内的线程，都会在同一个SM上执行。&lt;/p&gt;
&lt;p&gt;分好Thread Block后，会像之前说到的，一个Thread Block内的线程按照线程束（warp）分块，统一移到一个单元内执行，这时所有的线程执行的都是相同的指令
由于线程很多，调度器可以保证每个时刻，都有warp送到相应的资源中去计算或者访存，因此可以实现GPU的不空闲&lt;/p&gt;
&lt;h2&gt;内存层级&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./3.png&quot; alt=&quot;4&quot;&gt;&lt;/p&gt;
&lt;p&gt;具体而言，可以主要分为三类&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Register File：由每个Thread拥有，线程结束后寄存器中的数据就会消失&lt;/li&gt;
&lt;li&gt;Shared Memory：由一个Thread Block所共享的资源&lt;/li&gt;
&lt;li&gt;Global Memory：片外，显卡的显存，整个Grid均可访问&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./2.png&quot; alt=&quot;5&quot;&gt;&lt;/p&gt;
&lt;p&gt;由于主机（Host）和从机（Device）相互的内存空间不共享，因此需要在GPU中先申请内存空间，然后再把CPU中的数据拷贝过去。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;cudaError_t cudaMalloc(void** devPtr, size_t count);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中devPtr在使用时，一般需要使用&lt;code&gt;void**&lt;/code&gt;的强制类型转换转换为对应的输入
如&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c++&quot;&gt;cudaMalloc((void **)&amp;#x26;d_a, size);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;双指针需要取指针的地址，因此是&lt;code&gt;&amp;#x26;d_a&lt;/code&gt;
这里申请&lt;code&gt;size_t&lt;/code&gt;个字节的全局显存&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;cudaError_t cudaFree(void* devPtr);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里释放显存&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里完成数据的拷贝
&lt;code&gt;cudaMemcpyKind kind&lt;/code&gt;一共有四种，分别是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cudaMemcpyHostToHost&lt;/code&gt;：主机 → 主机&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cudaMemcpyHostToDevice&lt;/code&gt;：主机 → 设备&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cudaMemcpyDeviceToDevice&lt;/code&gt;：设备 → 设备&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cudaMemcpyDeviceToHost&lt;/code&gt;：设备 → 主机&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;共享显存和全局显存的使用&lt;/h2&gt;
&lt;p&gt;若没有明确分配共享显存的空间，默认使用的是全局显存&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c++&quot;&gt;__shared__ int smem[256];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以使用该方式分配共享显存。需要注意的是，共享显存为一个SM处理器所占有，因此在运用时需要注意开的大小和Block内的线程数量需要进行对齐&lt;/p&gt;</content:encoded><h:img src="/_astro/rossy.DkvlX3gI.png"/><enclosure url="/_astro/rossy.DkvlX3gI.png"/></item><item><title>听点歌: KiraraMagic系列</title><link>https://astro-pure.js.org/blog/kirara_magic/kirara</link><guid isPermaLink="true">https://astro-pure.js.org/blog/kirara_magic/kirara</guid><description>Kirara Magic的一些好听的歌</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import {
Aside, Tabs, TabItem, Steps, MdxRepl, Card, Collapse, CardList, Timeline,
Button, Spoiler, FormattedDate, Label, Svg, Icon
} from &apos;astro-pure/user&apos;
import { Quote, GithubCard, LinkPreview, QRCode, MediumZoom } from &apos;astro-pure/advanced&apos;
import { Icons as allIcons } from &apos;astro-pure/libs&apos;
import { Comment } from &apos;@/components/waline&apos;
import { Code } from &apos;astro:components&apos;
import { Image } from &apos;astro:assets&apos;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;KiraraMagic&lt;/code&gt;是我非常喜欢的一位音乐人，他为&lt;code&gt;Arknights&lt;/code&gt;，&lt;code&gt;Endfield&lt;/code&gt;贡献了许多好听的歌曲。他本身在制作音乐时动辄上百条音轨为乐曲带来的丰富层次令我印象深刻&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Effervence&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./effervence.png&quot; alt=&quot;Effervence&quot;&gt;&lt;/p&gt;
&lt;p&gt;歌名翻译过来是“粉红色的蒸汽”。这首歌是2023年的夏天发布的，伴随着方舟的夏活。整首歌旋律非常甜美，充满了夏天的氛围。对我而言那也是一个梦幻般的夏天，高考完的暑假非常明媚，我也开始了一段恋爱。即使是现在听起这首歌，仍然可以回忆起那个梦幻般的夏天。&lt;/p&gt;
&lt;h2&gt;赴大荒&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./fdh.png&quot; alt=&quot;赴大荒&quot;&gt;&lt;/p&gt;
&lt;p&gt;这首歌在古风的氛围下，加入了快节奏的鼓点，很符合这段背景故事里重型科技与万物复苏相结合的氛围。听到这首歌时我正要前往西安开始我的新一段学业，作为南方人第一次来到西北，透过车窗看到磅礴豪迈的景象，配上这首歌逐渐增强的旋律直至高潮，确实是非常兴奋。结尾的旋律也很巧妙。&lt;/p&gt;
&lt;h2&gt;Summer Dream&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./summer.png&quot; alt=&quot;Summer Dream&quot;&gt;&lt;/p&gt;
&lt;p&gt;这首歌是和&lt;code&gt;Chevy&lt;/code&gt;合作的，也是一首循环了很多遍的歌。Chevy也是《在银河中孤独摇摆》这首歌的演唱者。&quot;Let&apos;s jump into the ocean&quot;配上简单温柔的旋律，绝对有夏天清爽的风吹过的感觉。&lt;/p&gt;
&lt;h2&gt;春景故人来&lt;/h2&gt;
&lt;p&gt;这首歌被称作是《赴大荒》的异格版本，是在终末地中初见武陵城时播放的，确实是惊鸿一瞥的感觉。歌曲中段的鼓点非常有节奏感也很有层次，衔接上最后的箫的怒音演奏，令我眼前一亮。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./wu.png&quot; alt=&quot;春景故人来&quot;&gt;&lt;/p&gt;
&lt;p&gt;{/* # 小组件&lt;/p&gt;
&lt;h2&gt;Github风格的框&lt;/h2&gt;
&lt;h2&gt;Card&lt;/h2&gt;
&lt;p&gt;你好啊&lt;/p&gt;
&lt;h2&gt;折叠标签&lt;/h2&gt;
&lt;h2&gt;标签页&lt;/h2&gt;
&lt;h2&gt;步骤&lt;/h2&gt;
&lt;h2&gt;时间轴&lt;/h2&gt;
&lt;p&gt;&amp;#x3C;Timeline
events={[
{ date: &apos;2026-02-20&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-02-27&apos;, content: &apos;发布文章&apos; }
]}
/&gt;&lt;/p&gt;
&lt;h2&gt;引用和批注&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;hello&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;按钮&lt;/h2&gt;
&lt;h2&gt;剧透&lt;/h2&gt;
&lt;p&gt;这是剧透文本&lt;/p&gt;
&lt;h2&gt;Advanced 组件&lt;/h2&gt;
&lt;p&gt;显示语录

展示Github的仓库

展示一个链接

展示二维码
&lt;/p&gt;
&lt;h2&gt;图片与代码&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./template.jpg&quot; alt=&quot;插入图片&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;#x3C;Code lang=&apos;bash&apos; code={&lt;code&gt;echo &quot;hello mdx&quot;&lt;/code&gt;} /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bun check
bun dev # [!code highlight]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;-bun run build # [!code --]
+bun format    # [!code ++]
``` */}
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/Kirara.B9H_v3ki.jpg"/><enclosure url="/_astro/Kirara.B9H_v3ki.jpg"/></item><item><title>CiM Overview: Basics</title><link>https://astro-pure.js.org/blog/cim_overview_basics/cimbasics</link><guid isPermaLink="true">https://astro-pure.js.org/blog/cim_overview_basics/cimbasics</guid><description>CiM是未来还是泡沫？</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import {
Aside, Tabs, TabItem, Steps, MdxRepl, Card, Collapse, CardList, Timeline,
Button, Spoiler, FormattedDate, Label, Svg, Icon
} from &apos;astro-pure/user&apos;
import { Quote, GithubCard, LinkPreview, QRCode, MediumZoom } from &apos;astro-pure/advanced&apos;
import { Icons as allIcons } from &apos;astro-pure/libs&apos;
import { Comment } from &apos;@/components/waline&apos;
import { Code } from &apos;astro:components&apos;
import { Image } from &apos;astro:assets&apos;
import myImage from &apos;./CiMBasics.jpg&apos;&lt;/p&gt;
&lt;p&gt;export const cardListData = [
{ title: &apos;文档链接&apos;, link: &apos;/docs&apos; },
{ title: &apos;二级目录&apos;, children: [{ title: &apos;子项&apos;, link: &apos;/docs/integrations/components&apos; }] }
]&lt;/p&gt;
&lt;p&gt;export const timelineData = [
{ date: &apos;2026-02-20&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-02-27&apos;, content: &apos;发布文章&apos; }
]&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./Overview.png&quot; alt=&quot;Overview&quot;&gt;&lt;/p&gt;
&lt;p&gt;CiM的整体架构，分为若干Level&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Circuit level：模拟的：基于电流/电压/Time，数字的&lt;/li&gt;
&lt;li&gt;Micro-architecture level&lt;/li&gt;
&lt;li&gt;Processor level：一个基本的CIM Processor如上图，可以看到Array负责大部分的计算，同时Buffer/Controller/Co-processors辅助进行计算进行数据的准备，以及完成一些Array无法完成的计算&lt;/li&gt;
&lt;li&gt;Toolchain Level：Simulators(性能/能耗/精度建模仿真)，Synthesis &amp;#x26; Mapping(将实际的运算映射到CiM阵列上)&lt;/li&gt;
&lt;li&gt;Application level&lt;/li&gt;
&lt;li&gt;Future Trends&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why CiM&lt;/h2&gt;
&lt;h3&gt;Memory/Bandwidth Wall(内存墙)&lt;/h3&gt;
&lt;p&gt;在传统的计算架构中，计算与存储一般是分开的。ALU运算得到的结果需要写回存储，同时ALU的数据也需要从存储中读取。&lt;/p&gt;
&lt;p&gt;随着处理器性能的不断提升，计算的速度大大增加，但是数据搬运的延迟与能耗问题没有得到解决，因此系统性能被数据搬运所拖累，这个问题称为内存墙。在AI的计算中，数据量显著增加，这个问题更加显著。&lt;/p&gt;
&lt;p&gt;CiM的核心思想就是把计算放在存储阵列中，在存储单元内部完成MAC.&lt;/p&gt;
&lt;p&gt;CiM不是通用的计算单元，需要和其他通用计算单元配合来实现更加复杂的运算。&lt;/p&gt;
&lt;h2&gt;Circuit level&lt;/h2&gt;
&lt;p&gt;物理层面的计算电路大致可以分为这几个原型&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Circuit.png&quot; alt=&quot;Circuit level&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Current-based&lt;/h3&gt;
&lt;p&gt;利用电流的KCL来实现累加，同时ADC完成模拟to数字的转换
这种结构的密度比较高，占的空间比较小，但是容易受器件性质与噪声的影响&lt;/p&gt;
&lt;h3&gt;Charge-based&lt;/h3&gt;
&lt;p&gt;电容可以累积电荷，电荷的累积产生电压变化，这个量再ADC成数字就完成了计算，这种结构占的面积比较大。&lt;/p&gt;
&lt;h3&gt;Time-based&lt;/h3&gt;
&lt;p&gt;电压越大需要累积的电荷也越多，积累的时间也越长，因此时间也可以作为一个测量的量。TDC是一种时延to数字的单元
这种方式受外界影响小，但是由于时延的存在导致效率较低&lt;/p&gt;
&lt;h3&gt;Digital&lt;/h3&gt;
&lt;p&gt;数字的方法精度较高，将计算结果在加法树中累加，但是由于前三者用的是物理规律，数字的方法相比而言功耗会高很多。&lt;/p&gt;
&lt;h2&gt;CiM Memory Circuits&lt;/h2&gt;
&lt;p&gt;做存算需要选择存算的存储介质，大体可分为易失性(SRAM,eDRAM)和非易失性(RRAM,MRAM,ROM)两类。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Memory.png&quot; alt=&quot;Memory Circuits&quot;&gt;&lt;/p&gt;
&lt;p&gt;它们有如下的特点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Volatile(SRAM/eDRAM)：SRAM的存算见(a)，其鲁棒性较高，易于继承，但单元面积较大导致CiM的效率不高。引入eDRAM后可以解决这个问题，但eDRAM的CiM需要定期刷新电容&lt;/li&gt;
&lt;li&gt;Non-volatile(RRAM/MRAM/ROM)：基于非易失性介质实现的存算具有较高的计算密度，然而其设计起来较为复杂，往往需要算法协同设计&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Micro-architecture level&lt;/h2&gt;
&lt;p&gt;CiM的Macro如图，其大致可分为CiM的计算阵列和外围的处理电路(ADC,DAC,累加电路)，其计算时的功耗也需要考虑CiM阵列和周围电路的总和&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Macro.png&quot; alt=&quot;Macro-architecture level&quot;&gt;&lt;/p&gt;
&lt;p&gt;基于这个模型，可以实验得到各种存算方式的Energy Efficiency和Latency.可以看到增加计算的并行度，会导致Efficiency提高但存在一个饱和，不能无限提高， 同时计算的Latency也会提高。在各种存算方式中，基于非易失性介质的延迟范围更加分散，基于SRAM的存算相对延迟往往较低，且基于SRAM的数字存算延迟是最低的，因为这种方式严格控制了时序，且可以流水化。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./compare.png&quot; alt=&quot;compare&quot;&gt;&lt;/p&gt;
&lt;p&gt;另外Analog和Digital CiM的性能上限有各自的约束。对于Analog，其功耗上限往往取决于ADC和DAC的能耗和速度。对于数字CiM，加法树的计算消耗较大，且加法树的大小基本决定了计算的并行度，若要追求很大的并行度则路径会很多，相应的布局布线的面积就会非常难以管理，还会带来时序收敛的问题。&lt;/p&gt;
&lt;h2&gt;Processor-level CiM Chips&lt;/h2&gt;
&lt;p&gt;基于之前提到的Macro，可以构成多种类型的CiM芯片，主要的有以下几种。&lt;/p&gt;
&lt;h3&gt;Single-core and pipeline CiM Architecture&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./1.png&quot; alt=&quot;1&quot;&gt;&lt;/p&gt;
&lt;p&gt;这种类型的电路是CiM芯片的最基础形态，通过CiM Arrays和Buffer交替构成，多个这种结构级联可以模拟基本的多个线性层堆叠的Neural Network运算，同时Buffer如果做成Ping-Pong的双缓冲结构，则可以实现流水功能，实现较高的运算效率&lt;/p&gt;
&lt;h3&gt;Homogeneous CiM Architecture&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./2.png&quot; alt=&quot;2&quot;&gt;&lt;/p&gt;
&lt;p&gt;这种结构引入了多个CiM阵列，并通过调度逻辑来控制不同的CiM来进行CiM的计算。这样一次性会产生很多数据，可以看到右下角的SIMD和累加，re-arrange逻辑对Array得到的结果进行了后处理，得到了最后的输出&lt;/p&gt;
&lt;h3&gt;Heterogeneous CiM Architecture&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./3.png&quot; alt=&quot;3&quot;&gt;&lt;/p&gt;
&lt;p&gt;相比于上面的同构计算逻辑，这个异构逻辑中CPU,Coprocessor更多地承担了计算任务，因此这三者的计算可以看作并行的，可以视作一种异构逻辑&lt;/p&gt;
&lt;h3&gt;Chiplet CiM Architecture&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./4.png&quot; alt=&quot;4&quot;&gt;&lt;/p&gt;
&lt;p&gt;如果单个CiM阵列做的过大，会导致许多的时序问题。为了解决这个问题人们提出了一种Chiplet片片互联的结构，每一块都是一个独立的CiM Chip，片与片之间进行数据交换来实现计算的拆解&lt;/p&gt;
&lt;p&gt;{/* # 小组件&lt;/p&gt;
&lt;h2&gt;Github风格的框&lt;/h2&gt;
&lt;h2&gt;Card&lt;/h2&gt;
&lt;p&gt;你好啊&lt;/p&gt;
&lt;h2&gt;折叠标签&lt;/h2&gt;
&lt;h2&gt;标签页&lt;/h2&gt;
&lt;h2&gt;步骤&lt;/h2&gt;
&lt;h2&gt;时间轴&lt;/h2&gt;
&lt;p&gt;&amp;#x3C;Timeline
events={[
{ date: &apos;2026-02-20&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-02-27&apos;, content: &apos;发布文章&apos; }
]}
/&gt;&lt;/p&gt;
&lt;h2&gt;引用和批注&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;hello&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;按钮&lt;/h2&gt;
&lt;h2&gt;剧透&lt;/h2&gt;
&lt;p&gt;这是剧透文本&lt;/p&gt;
&lt;h2&gt;Advanced 组件&lt;/h2&gt;
&lt;p&gt;显示语录

展示Github的仓库

展示一个链接

展示二维码
&lt;/p&gt;
&lt;h2&gt;图片与代码&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./CiMBasics.jpg&quot; alt=&quot;插入图片&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;#x3C;Code lang=&apos;bash&apos; code={&lt;code&gt;echo &quot;hello mdx&quot;&lt;/code&gt;} /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bun check
bun dev # [!code highlight]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;-bun run build # [!code --]
+bun format    # [!code ++] */}
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/CiMBasics.CqLvz7IS.jpg"/><enclosure url="/_astro/CiMBasics.CqLvz7IS.jpg"/></item><item><title>Paper Reading: Layer Fusion</title><link>https://astro-pure.js.org/blog/layer-fusion/layerfusion</link><guid isPermaLink="true">https://astro-pure.js.org/blog/layer-fusion/layerfusion</guid><description>Efficiency is all we need.</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import {
Aside, Tabs, TabItem, Steps, MdxRepl, Card, Collapse, CardList, Timeline,
Button, Spoiler, FormattedDate, Label, Svg, Icon
} from &apos;astro-pure/user&apos;
import { Quote, GithubCard, LinkPreview, QRCode, MediumZoom } from &apos;astro-pure/advanced&apos;
import { Icons as allIcons } from &apos;astro-pure/libs&apos;
import { Comment } from &apos;@/components/waline&apos;
import { Code } from &apos;astro:components&apos;
import { Image } from &apos;astro:assets&apos;
import myImage from &apos;./Layer_Fusion.jpg&apos;&lt;/p&gt;
&lt;p&gt;export const cardListData = [
{ title: &apos;文档链接&apos;, link: &apos;/docs&apos; },
{ title: &apos;二级目录&apos;, children: [{ title: &apos;子项&apos;, link: &apos;/docs/integrations/components&apos; }] }
]&lt;/p&gt;
&lt;p&gt;export const timelineData = [
{ date: &apos;2026-02-20&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-02-27&apos;, content: &apos;发布文章&apos; }
]&lt;/p&gt;
&lt;h2&gt;Fused-Layer CNN Accelerators&lt;/h2&gt;
&lt;h3&gt;Intro&lt;/h3&gt;
&lt;p&gt;这篇文章首次提出了Layer Fusion的概念。在进行Neural Network的计算时，由于深度模型的多个Layers，存在许多的中间计算结果，也就是所说的中间特征图。
在一层的Layer计算完成后，我们需要将计算得到的中间特征图写回内存。再计算下一个Layer时，我们又需要将中间特征图从内存中读出来进行计算。&lt;/p&gt;
&lt;p&gt;这种计算方式带来的问题是大部分计算时间被浪费在了数据在片上SRAM与内存DRAM中的传输中，也就是广为人知的内存墙问题。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，这篇文章首次提出了Layer Fusion的概念，希望能在SRAM中完成所有的计算，最后将结果一次写回内存。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Fused1.png&quot; alt=&quot;Layer Fusion&quot;&gt;&lt;/p&gt;
&lt;p&gt;由于片上SRAM有限的原因，对于数据我们希望能够得到最大程度的复用来减少对有限SRAM的占用，同时也可以达到提高计算效率的效果，因为数据复用减少了计算新数据的额外开销。&lt;/p&gt;
&lt;h3&gt;Tradeoff&lt;/h3&gt;
&lt;p&gt;这里也存在一个tradeoff.我们将进行一次Fusion后的单元称为一个&lt;code&gt;Pyramid&lt;/code&gt;.
对于多层的网络，在进行计算时如果进行多层的Fusion，也就是只需要一个Pyramid的情况下，则需要的片上SRAM空间会显著增大由于需要复用时存储的数据变多，
同样也会带来一些控制逻辑上的复杂性问题。如果考虑将一个网络的计算拆成多个Pyramid来计算，上述说的问题会显著改善，然后需要考虑的是两个Pyramid之间的数据交换仍要通过对内存的读写来进行，因此这部分的时间又增加了。这两者是设计时的一个tradeoff.&lt;/p&gt;
&lt;h3&gt;Limitations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;存储问题：细看我们可以知道这篇文章维护了BL和BT，也就是行复用和列复用。然而实际上列复用需要存储的数据远比行复用大很多，以至于对于是否需要列复用成为了一个问题。&lt;/li&gt;
&lt;li&gt;缺少设计空间探索：这个基座对于Fuse的具体执行方式还仅限于极少的网络模型，缺乏一种能够针对不同的网络执行不同Fuse方式的探索&lt;/li&gt;
&lt;li&gt;主要针对CNN的计算来进行，这些计算在经典的网络中大量出现，然而对于一些现代的网络涉及到的更加复杂的算子(Attention,depthwise,pointwise)这些计算往往不能用滑窗计算来替代&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Falcon&lt;/h2&gt;
&lt;p&gt;针对基座模型的存储问题，这篇文章再次放大了这个问题：如果片上存不了完成的输入特征图，此时存储问题会变得尤其严重。
&lt;img src=&quot;./Falcon.png&quot; alt=&quot;Falcon&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是因为，此时就需要以每一块patch的形式读入每个数据，此时会带来一个很大的问题就是如果再使用很多SRAM来存复用的数据，很可能导致片上无法容纳这么多数据。&lt;/p&gt;
&lt;h3&gt;Methods&lt;/h3&gt;
&lt;p&gt;这篇文章提出的方法，首先将几种方式分了一下类。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Falcon2.png&quot; alt=&quot;Falcon2&quot;&gt;&lt;/p&gt;
&lt;p&gt;其中Along可以理解成BL，Across可以理解成BT&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal reuse：存在片上复用&lt;/li&gt;
&lt;li&gt;External reuse：存在外部复用&lt;/li&gt;
&lt;li&gt;reCompute：重新计算
几种方式的结果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./Falcon3.png&quot; alt=&quot;Falcon3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Homogeneous代表整个计算过程中都使用某一种策略。Homogeneous-sel代表整个计算按照Layer分为一些阶段，不同阶段之间的策略不同，单个阶段之间用同一种策略。Layer-wise Hybrid则是每一个Layer都用不一样的策略，也就是这篇文章提出的。
可以看到，全部使用IC和IE都存在一些缺陷，EMA（访问外部存储）量过大或计算量过大。而Homogeneous-sel则gap太大，是粗粒度的，不适合做设计空间探索。本文提出的方法粒度较细，适合做设计空间探索。&lt;/p&gt;
&lt;h2&gt;ConvFusion&lt;/h2&gt;
&lt;h2&gt;Optimus&lt;/h2&gt;
&lt;h3&gt;Architecture&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./Optimus.png&quot; alt=&quot;Optimus&quot;&gt;&lt;/p&gt;
&lt;p&gt;这篇文章注重于Memory层次的优化，也就是最终目标是减少对于内存的访问。总体的Flow可以概括如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将模型描述成DAG&lt;/li&gt;
&lt;li&gt;DAG上先融合简单的Operators，减小后续的搜索空间&lt;/li&gt;
&lt;li&gt;在DAG上应用算法，侯选出可能的融合组&lt;/li&gt;
&lt;li&gt;应用Memory Cost Model计算出对应融合组的访存消耗&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Chimera&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./Chimera.png&quot; alt=&quot;Chimera&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Design Space&lt;/h3&gt;
&lt;p&gt;有三个值得探索的点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Block decomposition：同Optimus中提到的 Loop Tiling&lt;/li&gt;
&lt;li&gt;Inter-block reordering：融合后，仍然需要确定计算出来的数据是立即用于下一次计算还是存住，糟糕的oeder会导致SRAM和内存访问时间的极大浪费&lt;/li&gt;
&lt;li&gt;一种表示：对于异构资源，希望能有一种表示，随后把这个表示翻译成对应的硬件操作，这是一种可移植性的权衡&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./Chimera2.png&quot; alt=&quot;Chimera2&quot;&gt;&lt;/p&gt;
&lt;h2&gt;LoopTree&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./LoopTree.png&quot; alt=&quot;LoopTree&quot;&gt;&lt;/p&gt;
&lt;p&gt;这里首先提出几种范式
(a):传统的计算
(b):在channel维度做分块，这种方式最多fuse两层因为后面没算完
(c):二维的分块，可以fuse若干
(d):在(c)的基础上再加上drop，节省下片上SRAM资源，但是需要重算
(e):面对一些新算子（Pointwise，Depthwise）时，这些算子没有可复用的区域，因此对于这种混合结构，需要灵活抉择片上需要存哪些数据&lt;/p&gt;
&lt;h3&gt;Evaluation&lt;/h3&gt;
&lt;p&gt;有四个评价指标&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;latency：推理消耗的时间&lt;/li&gt;
&lt;li&gt;energy：推理消耗的能量&lt;/li&gt;
&lt;li&gt;buffer capacity：片上需要的总缓存&lt;/li&gt;
&lt;li&gt;bandwidth usage：完成任务需要多大的带宽需求&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;{/* # 小组件&lt;/p&gt;
&lt;h2&gt;Github风格的框&lt;/h2&gt;
&lt;h2&gt;Card&lt;/h2&gt;
&lt;p&gt;你好啊&lt;/p&gt;
&lt;h2&gt;折叠标签&lt;/h2&gt;
&lt;h2&gt;标签页&lt;/h2&gt;
&lt;h2&gt;步骤&lt;/h2&gt;
&lt;h2&gt;时间轴&lt;/h2&gt;
&lt;p&gt;&amp;#x3C;Timeline
events={[
{ date: &apos;2026-02-20&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-02-27&apos;, content: &apos;发布文章&apos; }
]}
/&gt;&lt;/p&gt;
&lt;h2&gt;引用和批注&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;hello&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;按钮&lt;/h2&gt;
&lt;h2&gt;剧透&lt;/h2&gt;
&lt;p&gt;这是剧透文本&lt;/p&gt;
&lt;h2&gt;Advanced 组件&lt;/h2&gt;
&lt;p&gt;显示语录

展示Github的仓库

展示一个链接

展示二维码
&lt;/p&gt;
&lt;h2&gt;图片与代码&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./Layer_Fusion.jpg&quot; alt=&quot;插入图片&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;#x3C;Code lang=&apos;bash&apos; code={&lt;code&gt;echo &quot;hello mdx&quot;&lt;/code&gt;} /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bun check
bun dev # [!code highlight]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;-bun run build # [!code --]
+bun format    # [!code ++]
``` */}
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/Layer_Fusion.BgfERvEh.jpg"/><enclosure url="/_astro/Layer_Fusion.BgfERvEh.jpg"/></item><item><title>Stay focused, Stay Alive</title><link>https://astro-pure.js.org/blog/stay-focusedstay-alive/stayfocused</link><guid isPermaLink="true">https://astro-pure.js.org/blog/stay-focusedstay-alive/stayfocused</guid><description>Sometimes I like to imagine.</description><pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import {
Aside, Tabs, TabItem, Steps, MdxRepl, Card, Collapse, CardList, Timeline,
Button, Spoiler, FormattedDate, Label, Svg, Icon
} from &apos;astro-pure/user&apos;
import { Quote, GithubCard, LinkPreview, QRCode, MediumZoom } from &apos;astro-pure/advanced&apos;
import { Icons as allIcons } from &apos;astro-pure/libs&apos;
import { Comment } from &apos;@/components/waline&apos;
import { Code } from &apos;astro:components&apos;
import { Image } from &apos;astro:assets&apos;
import myImage from &apos;./Stay.png&apos;&lt;/p&gt;
&lt;p&gt;export const cardListData = [
{ title: &apos;文档链接&apos;, link: &apos;/docs&apos; },
{ title: &apos;二级目录&apos;, children: [{ title: &apos;子项&apos;, link: &apos;/docs/integrations/components&apos; }] }
]&lt;/p&gt;
&lt;p&gt;export const timelineData = [
{ date: &apos;2026-02-20&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-02-27&apos;, content: &apos;发布文章&apos; }
]&lt;/p&gt;
&lt;h2&gt;写在前面&lt;/h2&gt;
&lt;p&gt;此时我正在前往西安的飞机上，一个新的学期又要开始。
最近有很多心烦的事情，即使回顾下整个假期，自己仍然难以找到学习的状态。
诚然某些新的学期确实会带来一些新的元素，给一些新的刺激，但是希望，自己仍然要保持专注，无论对于学习还是生活。&lt;/p&gt;
&lt;h2&gt;New Blog&lt;/h2&gt;
&lt;p&gt;上一个博客已经很久没有更新了。除去服务器价格比较贵的原因，很大一部分原因在于自己没有想清楚Blog需要一些意义来存在。
我们是希望自己写的内容能够被看到的，以此来寻找一些认同和满足，或者只是单纯地炫耀。
这会导致其实这种形式与在小红书或者抖音上发个视频并无不同，只是在互联网静谧的地方找到了一个相对不显眼的角落。
博客理应作为一个output的窗口。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我们接受的input已经足够多，processing的时间已经足够长，我们需要一些窗口来对外输出。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;很多时候别人说博客的观众大概率只是你自己，其实也未必是一件坏事。当你回顾下当时的心情，回忆起当时做的选择，它们是无法改变的，有时候会情不自禁感慨当时的幼稚。但是我们需要这样的回顾，需要这样的记录来充实自己的记忆。&lt;/p&gt;
&lt;h2&gt;Stay Focused&lt;/h2&gt;
&lt;p&gt;专注是一个非常重要的能力，我也非常缺乏这样的能力，或许只有在备考时有长时间专注的能力。我希望写博客能让我在生活中也保持一些专注。
我们是渴望刺激的，outbreaking的东西能给我足够的愉悦，但是也是对精力的极大消耗。&lt;/p&gt;
&lt;p&gt;更重要的是他们有时候并不能构成你记忆中重要的部分，这些零散的东西无法被我们会议起来。长此以往我们对生活的捕捉力会造成极大的丧失，因为这些内容极力引导我们关注那些东西。
在做一件事情时往往被自己打断，我觉得原因是与这个topic无关的想法比较多，这种短平快的想法会打断自己进入下一个无关紧要的问题。&lt;/p&gt;
&lt;p&gt;持续性是非常重要的，我需要这样的持续性来产生一些有意义的想法。&lt;/p&gt;
&lt;h2&gt;Stay alive&lt;/h2&gt;
&lt;p&gt;我们存在很多刻板印象，有时候我们认为写博客的都是所谓的程序员，我们认为从事科研工作在某些程度上就是所谓优秀。
实际上我们需要对一些概念祛魅，我们不能因为外界对我们身份的刻板印象而自己竖立起高墙，活在自己的楚门的世界中。&lt;/p&gt;
&lt;p&gt;我们需要对生活有基本的热爱与期待，
作为一个健全的人活着。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我们有时不需在意别人的一些评判，需要自己感受这个世界，产生一些活着的实感。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最近看了很多的一些访谈节目，我希望从中塑造起一些正确的对于生活的态度。&lt;/p&gt;
&lt;p&gt;现在想来其实很多事情没必要急于求成，最开始我们对于事物的观念基本都来自于自己的欲望，克服自己的欲望也是一件挺难的事情。有时候我们可以迈出那一步，为了某些别人看来成熟的概念来约束自己的行为，当然结果可能并非是好的。
但是这个过程是重要的，我们需要这样的过程来形成自己的态度。
{/* 
跳转到文章开头的卡片
&lt;/p&gt;
&lt;p&gt;你好啊&lt;/p&gt;
&lt;h2&gt;折叠标签&lt;/h2&gt;
&lt;h2&gt;标签页&lt;/h2&gt;
&lt;h2&gt;步骤&lt;/h2&gt;
&lt;h2&gt;时间轴&lt;/h2&gt;
&lt;p&gt;&amp;#x3C;Timeline
events={[
{ date: &apos;2026-02-20&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-02-27&apos;, content: &apos;发布文章&apos; }
]}
/&gt;&lt;/p&gt;
&lt;h2&gt;引用和批注&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;hello&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;按钮&lt;/h2&gt;
&lt;h2&gt;剧透&lt;/h2&gt;
&lt;p&gt;这是剧透文本&lt;/p&gt;
&lt;h2&gt;Advanced 组件&lt;/h2&gt;
&lt;p&gt;显示语录

展示Github的仓库

展示一个链接

展示二维码
&lt;/p&gt;
&lt;h2&gt;图片与代码&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./Stay.png&quot; alt=&quot;插入图片&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;#x3C;Code lang=&apos;bash&apos; code={&lt;code&gt;echo &quot;hello mdx&quot;&lt;/code&gt;} /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bun check
bun dev # [!code highlight]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;-bun run build # [!code --]
+bun format    # [!code ++]
``` */}
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/Stay.DAmUNWmT.png"/><enclosure url="/_astro/Stay.DAmUNWmT.png"/></item><item><title>mdx 模板</title><link>https://astro-pure.js.org/blog/templatemdx/template</link><guid isPermaLink="true">https://astro-pure.js.org/blog/templatemdx/template</guid><description>这是一个 mdx 模板示例，展示了如何使用 Astro Pure 组件和一些常见的 mdx 功能。</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import {
Aside, Tabs, TabItem, Steps, MdxRepl, Card, Collapse, CardList, Timeline,
Button, Spoiler, FormattedDate, Label, Svg, Icon
} from &apos;astro-pure/user&apos;
import { Quote, GithubCard, LinkPreview, QRCode, MediumZoom } from &apos;astro-pure/advanced&apos;
import { Icons as allIcons } from &apos;astro-pure/libs&apos;
import { Comment } from &apos;@/components/waline&apos;
import { Code } from &apos;astro:components&apos;
import { Image } from &apos;astro:assets&apos;
import myImage from &apos;./template.jpg&apos;&lt;/p&gt;
&lt;p&gt;export const cardListData = [
{ title: &apos;文档链接&apos;, link: &apos;/docs&apos; },
{ title: &apos;二级目录&apos;, children: [{ title: &apos;子项&apos;, link: &apos;/docs/integrations/components&apos; }] }
]&lt;/p&gt;
&lt;p&gt;export const timelineData = [
{ date: &apos;2026-02-20&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-02-27&apos;, content: &apos;发布文章&apos; }
]&lt;/p&gt;
&lt;h1&gt;小组件&lt;/h1&gt;
&lt;h2&gt;Github风格的框&lt;/h2&gt;
&lt;h2&gt;Card&lt;/h2&gt;
&lt;p&gt;你好啊&lt;/p&gt;
&lt;h2&gt;折叠标签&lt;/h2&gt;
&lt;h2&gt;标签页&lt;/h2&gt;
&lt;h2&gt;步骤&lt;/h2&gt;
&lt;h2&gt;时间轴&lt;/h2&gt;
&lt;p&gt;&amp;#x3C;Timeline
events={[
{ date: &apos;2026-02-20&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-02-27&apos;, content: &apos;发布文章&apos; }
]}
/&gt;&lt;/p&gt;
&lt;h2&gt;引用和批注&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;hello&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;按钮&lt;/h2&gt;
&lt;h2&gt;剧透&lt;/h2&gt;
&lt;p&gt;这是剧透文本&lt;/p&gt;
&lt;h2&gt;Advanced 组件&lt;/h2&gt;
&lt;p&gt;显示语录

展示Github的仓库

展示一个链接

展示二维码
&lt;/p&gt;
&lt;h2&gt;图片与代码&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./template.jpg&quot; alt=&quot;插入图片&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;#x3C;Code lang=&apos;bash&apos; code={&lt;code&gt;echo &quot;hello mdx&quot;&lt;/code&gt;} /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bun check
bun dev # [!code highlight]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;-bun run build # [!code --]
+bun format    # [!code ++]
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/template.CvWSP5Sg.jpg"/><enclosure url="/_astro/template.CvWSP5Sg.jpg"/></item><item><title>2026 绝区零音乐会</title><link>https://astro-pure.js.org/blog/zzz/zzz</link><guid isPermaLink="true">https://astro-pure.js.org/blog/zzz/zzz</guid><description>记录下2026年初的绝区零音乐会</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import {
Aside, Tabs, TabItem, Steps, MdxRepl, Card, Collapse, CardList, Timeline,
Button, Spoiler, FormattedDate, Label, Svg, Icon
} from &apos;astro-pure/user&apos;
import { Quote, GithubCard, LinkPreview, QRCode, MediumZoom } from &apos;astro-pure/advanced&apos;
import { Icons as allIcons } from &apos;astro-pure/libs&apos;
import { Comment } from &apos;@/components/waline&apos;
import { Code } from &apos;astro:components&apos;
import { Image } from &apos;astro:assets&apos;
import myImage from &apos;./ZZZ.jpg&apos;&lt;/p&gt;
&lt;p&gt;export const cardListData = [
{ title: &apos;文档链接&apos;, link: &apos;/docs&apos; },
{ title: &apos;二级目录&apos;, children: [{ title: &apos;子项&apos;, link: &apos;/docs/integrations/components&apos; }] }
]&lt;/p&gt;
&lt;p&gt;export const timelineData = [
{ date: &apos;2026-02-20&apos;, content: &apos;开始写作&apos; },
{ date: &apos;2026-02-27&apos;, content: &apos;发布文章&apos; }
]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这是我第一次去听音乐会，之前我也有一些很想去的，比如音律联觉等等，但都因为一些原因没去成，因此这次趁着寒假回家爽听。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;场馆和入场前&lt;/h2&gt;
&lt;p&gt;这次是在浦发银行东方体育中心，交通来说不算非常偏，坐地铁就能直达。&lt;/p&gt;
&lt;p&gt;下面是场馆，应援棒和舞台。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1.jpg&quot; alt=&quot;1&quot;&gt;
&lt;img src=&quot;./2.jpg&quot; alt=&quot;2&quot;&gt;&lt;/p&gt;
&lt;h2&gt;节目&lt;/h2&gt;
&lt;p&gt;这次因为一些原因任何外国的歌手都没来，Damidami这样的歌甚至只是在大屏幕上放了个视频和舞蹈表演，感觉有点可惜。(不如FES)&lt;/p&gt;
&lt;p&gt;我基本都是在听，拍的比较少，下面是一些照片。&lt;/p&gt;
&lt;h3&gt;法厄同之歌&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./3.jpg&quot; alt=&quot;3&quot;&gt;&lt;/p&gt;
&lt;h3&gt;艾莲EP&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./4.jpg&quot; alt=&quot;4&quot;&gt;&lt;/p&gt;
&lt;h3&gt;三小只&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./5.jpg&quot; alt=&quot;5&quot;&gt;&lt;/p&gt;
&lt;h3&gt;配音的节目&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./6.jpg&quot; alt=&quot;6&quot;&gt;&lt;/p&gt;
&lt;h2&gt;谢幕&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./7.jpg&quot; alt=&quot;7&quot;&gt;&lt;/p&gt;
&lt;h2&gt;个人感受&lt;/h2&gt;
&lt;p&gt;这次很多节目没听到比较可惜，但是演出质量还是不错的。于梓贝老师是唱了三首歌，第二天的状态非常稳。青衣的EP歌手也非常厉害！和FES相比，观众的热情可能没那么高但是也很顶了，
大家都在玩梗，氛围还是很不错的。&lt;/p&gt;</content:encoded><h:img src="/_astro/ZZZ.Bxn6ZxlH.jpg"/><enclosure url="/_astro/ZZZ.Bxn6ZxlH.jpg"/></item><item><title>Markdown 模板</title><link>https://astro-pure.js.org/blog/templatemd/template</link><guid isPermaLink="true">https://astro-pure.js.org/blog/templatemd/template</guid><description>这里需要写文章描述</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;一级标题&lt;/h1&gt;
&lt;h2&gt;二级标题&lt;/h2&gt;
&lt;p&gt;这是一个markdown的模板&lt;/p&gt;
&lt;h2&gt;代码块&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bun check
bun dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;行内代码&lt;/h2&gt;
&lt;p&gt;今天是&lt;code&gt;Fri&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;加入一些批注&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="/_astro/template.gsB9ysZ5.jpg"/><enclosure url="/_astro/template.gsB9ysZ5.jpg"/></item></channel></rss>