<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Eurypterid的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Eurypterid</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Eurypterid]]></copyright><item><title><![CDATA[TVM Relay softmax算子调度分析]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/126187418</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/126187418</guid><author>Eurypterid</author><pubDate>Fri, 05 Aug 2022 23:32:24 +0800</pubDate><description><![CDATA[tvm relay 算子调度分析]]></description><category></category></item><item><title><![CDATA[[TVM PR 开发随笔] quantized::leakyrelu]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/125859678</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/125859678</guid><author>Eurypterid</author><pubDate>Mon, 18 Jul 2022 20:33:12 +0800</pubDate><description><![CDATA[TVM PR 11729开发思路和代码实现]]></description><category></category></item><item><title><![CDATA[TVM AVX512-VNNI原语手工调度matmul]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/125730046</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/125730046</guid><author>Eurypterid</author><pubDate>Mon, 11 Jul 2022 20:53:16 +0800</pubDate><description><![CDATA[TVM vnni tensorization]]></description><category></category></item><item><title><![CDATA[TVM TIR 各种Node类型举例]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/123767428</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/123767428</guid><author>Eurypterid</author><pubDate>Sun, 27 Mar 2022 02:05:46 +0800</pubDate><description><![CDATA[TVM TIR中有很多类型的Node。这里收录了全部可打印的类型：

StmtNode
AnyNode
PrimExprNode
TypeNode
PrimFuncNode
IRModuleNode
ArrayNode
IterVarNode
RangeNode
BufferNode
DataProducerNode
StringObj
BufferRegionNode
TargetNode

为了更好地理解这些Node。一方面可以去看它的数据结构，另一方面，也希望可以把它们和TIR代码对应起来。
例1:
]]></description><category></category></item><item><title><![CDATA[TVM (Typed)PackedFunc 作用]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/123650816</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/123650816</guid><author>Eurypterid</author><pubDate>Tue, 22 Mar 2022 05:26:59 +0800</pubDate><description><![CDATA[解析
TVM源码中经常会看到PackedFunc，PackedFunc是为了支持多语言（Python，C++等）设计的封装结构。它使得某个C++的函数可以在注册后由Python调用，反之亦然。定义在tvm/runtime/packed_func.h下。
TypedPackedFunc，顾名思义就是注明类型的封装函数。

A PackedFunc wrapper to provide typed function signature. It is backed by a PackedFunc internal]]></description><category></category></item><item><title><![CDATA[TVM TIR Pass - Lower Intrin/legalization 优化原理和代码解析]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/123343738</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/123343738</guid><author>Eurypterid</author><pubDate>Sat, 19 Mar 2022 21:13:59 +0800</pubDate><description><![CDATA[理论
预备知识

LLVM。LLVM是一个后端编译器组件，支持ARM/x86。在目标平台上，TVM生成的代码会交给LLVM继续编译和优化。
LLVM Instrinsic function（LLVM内置函数），简单来说就是LLVM的函数API。一般来讲性能良好。llvm official doc
Lower（我翻译成“下译”），指将IR映射成更偏硬件的过程。

是什么
Lower Intrin(sic)是TIR的Pass之一。它将TIR函数映射映射到LLVM的内置函数。
Lower Intrin和legal]]></description><category></category></item><item><title><![CDATA[TVM TIR Pass - Loop Unroll 优化原理和代码解析]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/123283449</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/123283449</guid><author>Eurypterid</author><pubDate>Sat, 05 Mar 2022 00:55:20 +0800</pubDate><description><![CDATA[理论
预备知识

ForNode对象的数据结构

class ForNode : public StmtNode {
 public:
  /*! \brief The loop variable. */
  Var loop_var;
  /*! \brief The minimum value of iteration. */
  PrimExpr min;
  /*! \brief The extent of the iteration. */
  PrimExpr extent;
  /*! \br]]></description><category></category></item><item><title><![CDATA[TVM Codegen概述]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/123093476</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/123093476</guid><author>Eurypterid</author><pubDate>Tue, 01 Mar 2022 17:17:56 +0800</pubDate><description><![CDATA[为什么
不同硬件后端厂商提供不同的库，使得用户需要学习很多不同的编程范式。比如MKLDNN，cuDNN，TensorRT，因此需要一个统一的编程接口去调用这些库，从而让TVM可以正确依赖于这些后端库生成对应的代码。
是什么


let all users and hardware backend providers stand on the same page
provide a feasible solution to allow specialized hardware or library to on]]></description><category></category></item><item><title><![CDATA[TVM Pass概述]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/123073596</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/123073596</guid><author>Eurypterid</author><pubDate>Mon, 28 Feb 2022 18:19:52 +0800</pubDate><description><![CDATA[use pass infra
Design and Architecture
Pass又称transform，每一个transform要么把现有程序转换并优化为一个等价的程序，要么把程序lower到下层。relay/transform包括很多优化模型用的pass，包括常量折叠（constant folding）和死代码删除（dead-code elimination）等。
这里拿tests/python/relay/test_pass_fold_constant.py里的单测作为例子：
import num]]></description><category></category></item><item><title><![CDATA[TVM TIR Pass - CSE (Common Subexpression Elimination) 优化原理和代码解析 PR#9482]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/123118666</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/123118666</guid><author>Eurypterid</author><pubDate>Thu, 24 Feb 2022 22:24:03 +0800</pubDate><description><![CDATA[预备知识

TIR Let Binding

Let (var, value, body) 将value求值赋给var，然后返回body的求值结果。let将表达式 Expr 绑定到局部作用域的不可变 var 中。


scope：作用域/代码块。 TVM AST将作用域组建为树形结构。外侧作用域包含内侧作用域的关系被表示为父节点和子节点。父节点的变量对子节点可见但反之不然。判断变量是否在某个作用域内是CSE算法的一个重要的部分。

是什么
TIR代码来源于relay和其他Pass。生成TIR代码的过程是自动]]></description><category></category></item><item><title><![CDATA[机器学习技术栈]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/115652101</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/115652101</guid><author>Eurypterid</author><pubDate>Tue, 04 May 2021 02:50:59 +0800</pubDate><description><![CDATA[机器学习小结前言决策树熵熵的性质非参数概率密度统计模型HistogramParzen KernelNadaraya-Watson高斯过程算法目的算法理论要点实验附：高斯函数的基本性质
前言
本文旨在整理一些博主学习中零散的知识点。
决策树
熵

熵最好理解为不确定性的量度而不是确定性的量度，因为越随机的信源的熵越大。

H(p)=−∑k=1npklog2pk
H(p) = -\sum_{k=1}^np_klog_2p_k
H(p)=−k=1∑n​pk​log2​pk​
设独立掷出nnn次骰子，每个面的概率彼]]></description><category></category></item><item><title><![CDATA[【新手向】后缀数组（Suffix Array），二分查找字符串（Binary Search）和lower_bound+comparator的深入理解]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/106795322</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/106795322</guid><author>Eurypterid</author><pubDate>Tue, 16 Jun 2020 22:46:14 +0800</pubDate><description><![CDATA[定义

一个通过对字符串的所有后缀经过排序后得到的数组。此数据结构被运用于全文索引、数据压缩算法、以及生物信息学。

简单来说，对于一个给定字符串strstrstr, 我们拥有一个数组SA（Suffix Array的缩写），数组对于每个索引 i=[0,1,2,...strlen(str)−1]i = [0, 1,2,...strlen(str) - 1]i=[0,1,2,...strlen(str)−1], SA[i]SA[i]SA[i]表示将所有后缀排序后第 iii 小的后缀的编号。举个栗子：str = ]]></description><category></category></item><item><title><![CDATA[【C++】 位运算小结]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/106723704</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/106723704</guid><author>Eurypterid</author><pubDate>Fri, 12 Jun 2020 22:15:17 +0800</pubDate><description><![CDATA[取最靠右的1
1. 移位遍历
1 &lt;&lt; i 在这里充当了一个指针。
    int right_most_setbit(int num) { 
        for (int i = 0; i &lt; 32; i++) { 
            if (!(num &amp; (1 &lt;&lt; i))) 
                return 1 &lt;&lt; i; 
        }
        return 0; 
    }

2. 利用特性
利用负数的bi]]></description><category></category></item><item><title><![CDATA[【二叉树】【经典例题及解答】用栈（Stack）对二叉树（Binary Tree）进行前序（Pre）、中序（In）、后序（Post）非递归遍历]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/106589626</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/106589626</guid><author>Eurypterid</author><pubDate>Sat, 06 Jun 2020 16:44:41 +0800</pubDate><description><![CDATA[定义

在计算机科学中，二叉树（英语：Binary tree）是每个节点最多只有两个分支（即不存在分支度大于2的节点）的树结构。通常分支被称作“左子树”或“右子树”。


堆栈（英语：stack）又称为栈或堆叠，是计算机科学中的一种抽象数据类型，只允许在有序的线性数据集合的一端（称为堆栈顶端，英语：top）进行加入数据（英语：push）和移除数据（英语：pop）的运算。因而按照后进先出（LIFO, Last In First Out）的原理运作。


Inorder/中序遍历 (Left, Root, Ri]]></description><category></category></item><item><title><![CDATA[【深度优先搜索】递归、穷举与优化（Memorization）经典题目与C++解答]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/106578018</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/106578018</guid><author>Eurypterid</author><pubDate>Fri, 05 Jun 2020 21:07:57 +0800</pubDate><description><![CDATA[概念

深度优先搜索算法（Depth-First-Search，DFS）是一种用于遍历或搜索树或图的算法。 这个算法会尽可能深的搜索树的分支。 当节点v的所在边都己被探寻过，搜索将回溯到发现节点v的那条边的起始节点。 这一过程一直进行到已发现从源节点可达的所有节点为止。

DFS，根据题目的要求，适用于需要穷举所有可能性的情况。一般来说比较易于理解但是算法速度较慢，一般为指数时间，但加以合理的缓存优化（Memorization）可以以牺牲内存为代价提高速度。
题目
题目来源于LeetCode
494. Ta]]></description><category></category></item><item><title><![CDATA[【常数时间】LFU（Least Frequently Used）基于频次的缓存淘汰算法C++实现]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/106111302</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/106111302</guid><author>Eurypterid</author><pubDate>Thu, 14 May 2020 03:07:44 +0800</pubDate><description><![CDATA[struct LFUNode
{
	int freq;
	list&lt;pair&lt;int, int&gt;&gt; vals;
	LFUNode(int f = 0) : freq(f) { }
};

typedef list&lt;LFUNode&gt;::iterator iptr;
typedef list&lt;pair&lt;int, int&gt;&gt;::iterator jptr;
class LFUCache {
public:

	
	LFUCache(int capacit]]></description><category></category></item><item><title><![CDATA[【常数时间】LRU（Least Recently Used）最近最少使用算法设计C++实现]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/106111299</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/106111299</guid><author>Eurypterid</author><pubDate>Thu, 14 May 2020 03:03:50 +0800</pubDate><description><![CDATA[#include&lt;vector&gt;
#include&lt;unordered_map&gt;
#include&lt;string&gt;
#include&lt;unordered_set&gt;
#include&lt;map&gt;
#include&lt;iostream&gt;
using namespace std;

class LRUCache {
public:
	LRUCache(int capacity) {
		cap = capacity;
	}

	int get(i]]></description><category></category></item><item><title><![CDATA[Heap（栈、priority_queue、优先队列）原理、C++实现及应用]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/106040124</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/106040124</guid><author>Eurypterid</author><pubDate>Sun, 10 May 2020 19:19:38 +0800</pubDate><description><![CDATA[原理
定义

A heap is a specialized tree-based data structure which is essentially an almost complete tree that satisfies the heap property: in a max heap, for any given node C, if P is a parent node of C, then the key (the value) of P is greater than or equal ]]></description><category></category></item><item><title><![CDATA[Trie( prefix tree ) 原理、C++实现及应用]]></title><link>https://blog.youkuaiyun.com/Eurypterid/article/details/106005856</link><guid>https://blog.youkuaiyun.com/Eurypterid/article/details/106005856</guid><author>Eurypterid</author><pubDate>Fri, 08 May 2020 20:45:57 +0800</pubDate><description><![CDATA[Trie( prefix tree ) C++ 实现
题目来源于LeetCode, 代码上传后测试通过
使用shared_ptr,构建数据结构，在一定程度上减少memory leak
#include "stdafx.h"
#include&lt;iostream&gt;
#include&lt;memory&gt;
#include&lt;algorithm&gt;
#define ALPHABET_SIZE 26

class Trie {

public:
	bool isEnd;
	unique_p]]></description><category></category></item></channel></rss>