- 博客(253)
- 问答 (1)
- 收藏
- 关注
原创 信号处理新书推荐-MATLAB信号处理从入门到精通
新书出版,欢迎信号处理相关的小伙伴们去看!花了很长时间写出来的,内容基本涵盖了信号处理所有的内容,函数基本上都是自己实现的,很详细,不单单是MATLAB工具本身,而是从底层介绍了算法的原理和实现过程,最后一章,进一步介绍了芯片级仿真和实现,有很多工程落地的实例。
2026-04-20 10:35:22
273
原创 C++的Concept/Model模式
在 C++ 中提及 Concept/Model,通常指的是这两种语境:*C++20 现代语境:用来给模板参数“立规矩”(Concept),看某个具体类型(Model)符不符合要求。它是编译期的,用来替代复杂的 std::enable_if。经典设计模式语境:用来做类型擦除。通过在包装类内部构建 Concept 基类和 Model<T> 模板子类,实现非侵入式的运行时多态。std::function 和 std::any 都是这种模式的工业级实现。
2026-06-15 20:13:43
169
原创 MLIR专题11:自定义类型和内联
/ 生成 materializeConstant 声明// 生成 parseType/printType 声明hasConstantMaterializer :让 ODS 生成 materializeConstant 方法声明,方言需要实现它来支持常量折叠useDefaultTypePrinterParser :让 ODS 生成 parseType / printType 方法声明,方言需要实现它们来支持自定义类型的文本表示设计模式体现CRTP。
2026-06-14 21:37:09
350
原创 MLIR专题4:常用数据结构
核心作用:向全局注册你方言独有的编译期常量/配置标签格式(Custom Attribute)。工业级应用场景:在为 NPU 算子编写硬件指令发射 Pass 时,算子往往带有很多专有的静态配置。比如一个卷积算子,它的padding策略是SAME还是VALID?它的硬件流水线切片模式(Tiling Strategy)是按 X 轴切还是按 Y 轴切?你可以把这些复杂的配置信息定义为方言特有的Attribute(如!通过注册后,这个属性格式就被框架正式承认,并开始享受和原生属性一样的编译期哈希去重待遇。
2026-06-08 19:35:47
145
原创 MLIR专题3:MLIR的CRTP原理
你可能会问:“当我(或者框架)手里只有一个通用的Operation*,我想调用它的verify()(校验)或者fold()(常量折叠)函数,但我又不想做dyn_cast穷举,框架是怎么知道该用哪个函数的?MLIR 没有用虚函数表,而是自己维护了一个轻量级的全局元信息表(注册表)。当 MLIR 上下文()初始化时,每个 Dialect 会注册自己的 Op。注册时,会为每个 Op 创建一个全局唯一的// 框架为每种 Op 注册的全局元信息(每种 Op 在内存中只有一份)// 例如 "arith.addi"
2026-06-08 14:53:49
278
1
原创 MLIR专题2:MLIR运算和算子
文件路径定义内容Operation 类(运行时通用操作)Op<> 模板(编译期类型安全包装)TableGen 中 Op 的蓝图定义具体操作类(如 AddOp、ConstantOp)
2026-06-05 19:52:02
264
原创 MLIR专题1:创建方言流程(使用ODS)
这段代码用 TableGen 语法定义了一个名为 Toy 的 MLIR 方言(Dialect),逐行解释:- def :TableGen 关键字,定义一个 具体的实例 (与 class 定义模板不同)- Toy_Dialect :实例名称,后续代码通过这个名字引用该方言- : Dialect :继承自 DialectBase.td 中的 class Dialect 模板- 设置方言的 命名空间名称 为 "toy"
2026-06-05 16:33:25
298
原创 NVDLA专题18:时钟门控
这里TE | E表示只要常规使能E或者测试使能TE有一个有效(为 1),整个时钟使能就有效。设计的关键是CPTE | Eqd在CP的期间,无论E信号怎么抖动、延迟有多大,qd的状态都保持不变。在CP的期间,qd也已经稳定。最后。qd必须等到CP的下降沿,qd才会变成 0。此时CP本身就是 0,所以与门输出Q优雅地保持在 0,不会产生下冲毛刺。qd也是在CP的下降沿,qd变成 1。此时CP是 0,与门输出Q仍然是 0。直到下一个CP的到来,CP变为 1,Q才随着CP变成 1。
2026-05-26 16:59:50
320
原创 LLVM后端入门9:JIT支持
目标机器的实现可以选择性地包含一个即时(JIT)代码生成器,该生成器会将机器码和辅助结构作为二进制输出进行生成,这些输出可直接写入内存。要实现这一点,可通过执行以下步骤来实现 JIT 代码生成:编写 XXXCodeEmitter.cpp 文件,其中包含一个机器函数 pass,用于将目标机器指令转换为可重定位机器码。编写 XXXJITInfo.cpp 文件,为目标特定的代码生成活动(如生成机器码和存根)实现 JIT 接口。
2026-01-17 11:24:01
762
原创 LLVM后端入门7:指令选择器(Instruction Selector)
LLVM后端入门7:指令转换和指令选择器(Instruction Selector)
2026-01-07 20:31:58
1029
原创 LLVM后端入门2:目标机器
CodeGenTargetMachineImpl 被设计为一个基类,用于那些使用 LLVM 目标无关代码生成器(target-independent code generator)实现的目标平台。类应当由一个具体目标类(concrete target class)来特化(specialized),这个具体目标类会实现各种虚方法(virtual methods)。在文件中被定义为的子类。类的实现(位于)同样处理许多命令行选项(command-line options)。要创建一个。
2025-11-29 12:16:04
998
原创 LLVM的Value
在 LLVM 中,Value是所有可以作为表达式操作数的 IR(中间表示)实体的基类,是 LLVM IR 类型系统和指令系统的核心概念。它代表了一个 “值”,可以是常量、变量、指令结果、函数参数等,几乎所有在 IR 中参与计算或被引用的实体都继承自Value。
2025-08-13 00:18:35
427
原创 LLVM的FunctionPassManager
在 LLVM 中,FunctionPassManager 是用于管理和运行函数级 Pass(FunctionPass)的核心组件。它负责组织一系列针对单个函数进行分析或优化的 Pass,并按特定顺序执行这些 Pass,是 LLVM 中间代码(IR)优化 pipeline 的重要组成部分。
2025-08-12 00:53:16
806
空空如也
gpu安装后和集显无法显示
2017-03-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅