自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(208)
  • 收藏
  • 关注

原创 stl库的容器Container和迭代器iterator

container容器就是STL库里面的数据结构,一般的实现方式是类模版。目前STL库里面提供四种类别的容器,这四种类别的容器如下所示。iterator迭代器专门是为了容器服务的,是为了访问容器里面的元素。迭代器按照类别进行分类,分为五种。所有的迭代器都需要被构造、被销毁、被拷贝、复制拷贝。...

2021-07-21 11:50:54 291

原创 动态链接和静态链接

链接链接就是把其他第三方库和自己源代码生成的二进制目标文件融合在一起的过程。链接分为静态链接和动态链接两种。静态链接静态链接在链接的时候把所依赖的第三方库函数都打包到了一起,想用的时候直接使用就好了,这就导致了其实打包的东西很多,这导致最终的可执行文件非常大。同时程序的执行速度也很慢。一般情况下,静态链接的文件的结尾都是.a结尾的。动态链接动态链接不将所有的第三方库都打包到最终的可执行文件上,而是只记录用到了哪些动态链接库,在运行时才将那些第三方库装载进来,也就是将磁盘上的程序和数据加载到内存上。

2021-07-19 19:55:17 443

原创 AutoSchedule和AutoTVM

简介AutoTVM用户自己手写一个模版,在模版里面自己定义一下tune的参数,例如tile size等。给定一个模版,在这个模版里面去搜索参数,使得可以达到一组最好的参数使得张量计算的结果最好。但是,它是一种基于模板的方法,因此仍然需要领域专家为每个平台上的每个算子实现一个性能比较好的模板。今天,TVM 代码库中有超过 15,000 行这些模板的代码。除了非常难以开发之外,这些模板通常效率低下且搜索空间有限,无法实现最佳性能。Auto Schedule : Template-free Auto Sch

2021-07-19 17:00:46 1186

原创 堆和栈的区别

分类c++的内存管理:栈上的空间、堆上new的空间、全局变量区。对于一个普通的进程来说,它的内存空间的分布分为:堆区、栈区、BSS、代码段、数据段。BSS(Block started by symbol):存放没有被初始化的全局变量、静态变量。数据区:放的是已经初始化全局变量、常量(const)、静态变量等。代码区:放的是可以执行的机器码。堆:从低位往高位进行空间的扩充,容量是大于栈的。栈:从高位往地位进行空间的扩充,程序中的局部变量、函数的参数值、返回变、函数等存在这个区域。堆和栈的区

2021-07-19 12:33:16 113

原创 c++智能指针

背景一般情况下内存空间分为下面几个部分:堆:这一部分一般是暴露给程序员,程序员可以通过new来申请底层的空间的。堆的空间一般是通过new来申请的。堆上面的空间会比较大,但是在申请的过程中可能会出现碎片的问题。栈:这一部分是留给程序的,一般情况下局部变量会放在这一部分空间。堆的空间一般是通过堆帧来进行管理的,这一部分的空间比较小。数据区:放被初始化的局部变量、全局变量等。这里就会发生一个问题,就是程序员在写程序的过程中选择使用new进行堆空间的申请,返回了一个指针,但是这个指针在程序返回的时候,

2021-07-19 12:26:48 197

原创 Winograd(二)实测

测试环境说明:我测试了TVM里面默认的Winograd和卷积的模版。分别记录了他们运行的时间,发现在TVM没有优化的版本下,Winograd就是个笑话,就跑出来的时间就很坑,感觉winograd没有被广泛应用就是会存在加速其实没有很好的。测试例子输入的参数的说明batch,in_channel,in_size,num_filter,kernel,stride,padding,测试结果这测试结果,跑不过普通的卷积。还有很大的优化空间的。...

2021-06-30 17:02:55 255

原创 Winograd(一):背景知识介绍

背景winograd是针对卷积做的特定的卷积加速的算法。一维卷积对于输入是一维的In来说,当卷积核是F,输出是Out.其中y0和y1的计算公式如下所示:y0=z0x0+z1x1+z2x2y1=z1x0+z2x1+z3x2上面是针对的是正常卷积的计算过程,对于这种正常的卷积计算来说,我们是需要6次乘法和四次加法。为了加速计算,我们希望减少乘法的次数,用加法来代替乘法。因此winograd使用四个变量m1,m2,m3,m4来代替中间的计算。在这种情况下,将乘法减少到4次。因此我们将上述的计算

2021-06-28 18:39:10 1389 1

原创 149. 直线上最多的点数

题目给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。思路暴搜代码class Solution {public: int maxPoints(vector<vector<int>>& points) { int n = points.size(); if(n < 3) return n; int maxx = 0

2021-06-24 15:43:25 67

原创 剑指 Offer 34. 二叉树中和为某一值的路径

题目输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例代码class Solution {public: int target; vector<vector<int>> ans; void getPath(TreeNode * cur, vector<int> path, int curSum){ if(cur == NULL) retu

2021-06-23 17:08:49 70

原创 2021-06-22

题目给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路典型的dp代码class Solution {public: int translateNum(int num) { string str = to_string(num); int n = str.size();

2021-06-22 20:27:47 55

原创 剑指 Offer 55 - II. 平衡二叉树

题目输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}

2021-06-22 20:07:50 62

原创 剑指 Offer 28. 对称的二叉树

题目思路如果对称,对于一个节点来说,假设这个节点非空,那么必须满足:cur->left和cur->right首先数值相同cur->left->left和cur->right->right相同cur->left->right和cur->right->left相同代码/** * Definition for a binary tree node. * struct TreeNode { * int val; *

2021-06-22 19:42:26 59

原创 剑指 Offer 27. 二叉树的镜像

题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。思路就是交换每个节点的左右节点的指针指向。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class

2021-06-22 19:10:29 65

原创 剑指 Offer 55 - I. 二叉树的深度

题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {

2021-06-22 17:56:02 54

原创 leecode.从上到下打印二叉树系列

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {

2021-06-22 17:36:51 77

原创 剑指 Offer 38. 字符串的排列

题目输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例一输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]代码class Solution {public: int n; vector<string> ans; void DFS(int cur, string str, vector<bool> & vis, string

2021-06-22 17:20:42 62

原创 剑指 Offer 54. 二叉搜索树的第k大节点

题目给定一棵二叉搜索树,请找出其中第k大的节点。示例思路中序遍历代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {pu

2021-06-21 16:30:20 70

原创 剑指 Offer 30. 包含min函数的栈

题目定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回 0.m

2021-06-21 16:17:06 70

原创 剑指 Offer 58 - I. 翻转单词顺序

题目输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例一输入: “the sky is blue”输出: “blue is sky the”代码class Solution {public: string reverseWords(string s) { int n = s.size(); int l =

2021-06-21 15:50:04 53

原创 剑指 Offer 05. 替换空格

题目请实现一个函数,把字符串 s 中的每个空格替换成"%20"。实例一输入:s = “We are happy.”输出:“We%20are%20happy.”代码class Solution {public: string replaceSpace(string s) { string a = "%20"; string ans; for(auto d : s){ if(isspace(d)){

2021-06-21 15:24:44 82

原创 剑指 Offer 66. 构建乘积数组

题目给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。思路用两个dp数组记录,第一个dp记录从头的连乘,第二个dp记录从后面的连乘。代码class Solution {public: vector<int> constructArr(vector<int>& a)

2021-06-21 15:13:15 69

原创 剑指 Offer 44. 数字序列中某一位的数字

题目数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。思路归纳数学规律的题目从1-9有9个数字,每个数字1位从10-99有90个数字,每个数字2位。。。代码typedef long long ll;class Solution {public: int findNthDigit(int n) { int bit

2021-06-21 12:29:13 57

原创 剑指 Offer 09. 用两个栈实现队列

题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例一输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出:[null,null,3,-1]代码class CQueue {public: stack<int> s

2021-06-21 12:05:26 63

原创 剑指 Offer 61. 扑克牌中的顺子

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。代码class Solution {public: bool isStraight(vector<int>& nums) { bool vis[14]; for(int i = 0;i < 14;i++) vis[i] = false; i

2021-06-20 18:06:21 59

原创 剑指 Offer 26. 树的子结构

题目输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。思路一本来想着的是找到中序遍历的结果,如果后面的中序遍历是前面的中序遍历的子串,这样一定结构是相同的。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;

2021-06-20 16:10:57 59

原创 剑指 Offer 48. 最长不含重复字符的子字符串

题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度示例一输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。思路用一个hash来存储已经访问过得字母,然后使用双向指针来记录此时的右边界和左边界。本质上就是求两个相同字母之间的距离的最大值。代码class Solution {public: int lengthOfLongestSubstring(string s) { int n =

2021-06-20 14:45:39 62

原创 剑指 Offer 43. 1~n 整数中 1 出现的次数

题目输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。思路分析统计每一位出现1的次数,累加。对于数据12来说,当个位是2,我们要统计小于等于12的个位数上出现1的个数,01和11两个。若为10,只会有01.若为11,有11和01.代码typedef long long ll;class Solution {public: int countDigitOne(int n)

2021-06-20 13:23:25 56

原创 剑指 Offer 13. 机器人的运动范围

题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?思路用广度优先搜索代码class Solution {public: int

2021-06-16 21:09:52 57

原创 剑指 Offer 63. 股票的最大利润

题目假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?思路分析因为数据限制所以必须采用O(n)的复杂度。因此有点单调栈的感觉,就是每次找左边的最小值。代码class Solution {public: int maxProfit(vector<int>& prices) { int n = prices.size(); if(n < 2) return 0; int l =

2021-06-16 20:36:42 54

原创 剑指offer07.重构二叉树

题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:限制:0 <= 节点个数 <= 5000代码class Solution {public: unordered_map<int, int> index; int n; TreeNod

2021-06-16 17:46:45 56

原创 im2col的卷积操作

对于一个卷积操作来说,输入有两个:四维tensor的输入[N,C,H,W],首先需要将四维向量变成一个二维的向量四维tensor的权重[OC,C,KH,KW],首先需要将四维向量变成一个二维的向量.输出是一个四维的向量[N, OC, OH, OW]变输入首先为了矩阵乘法,我们要把输入[N,C,H,W]的输入变成[NxOHxOW, CxKHxKW]的二维向量,此时的存储空间变为原来的OHxOW倍。这个变输入实际上是每次将卷积运算需要的数据展成行向量。def im2col(input_dat

2021-06-16 15:50:46 426

原创 论文Taichi: A Language

论文:Taichi: A Language for High-Performance Computation on SpatiallySparse Data Structures背景图形领域中,输入数据都是高度不规则且稀疏的。例如,在一个3D空间里面,只有一小部分空间的点是有数据的,其他空间是没有数据的。例如下面这个图。为了表达输入数据的形式,一般采用的是hierarchical sparse data structures。例如multilevel sparse voxel gridsp

2021-05-26 14:49:29 468

原创 多面体模型系列二

数据依赖关系多面体模型在上面的系列一已经介绍过了,然后我们现在需要来优化for循环之间的数据依赖关系。数据依赖关系可以分为3个基本的部分.对于我们例子中的二维矩阵的乘法来说,存在的三个数据依赖关系如下:Read dependence: the read-only data之间的流动。例如计算C[i][j]和C[i][j+1]都需要A[i][k] 。Flow dependence: transferring the intermediate results,例如C[i][j]的计算是不断累加中间变

2021-05-18 19:18:16 611

原创 多面体模型系列一

Polyhedral Model基本概念多面体模型是用于循环优化的数学模型,我们把满足多面体模型的循环称为static control part(SCoP)。在多面体模型中,一个循环由三个基本的组件组成:iteration domains, access relations, schedule.iteration domains由循环过程中访问的数据的下标组成。access relations标记访问的映射关系。schedule标记loop执行的过程针对上面的二维的矩阵乘法来说,iterat

2021-05-18 18:23:03 2315 3

原创 acm分类题目

2021-05-16 22:40:28 52

原创 神经网络编译器图层面IR

图形IR图形IR,也被称为高级IR,代表计算流和控制流,并且与硬件无关。 高级IR的设计挑战是对计算流和控制流的进行抽象的能力,要能够表达出各种深度学习模型。 高级IR的目标是建立控制流以及算子与数据之间的依赖关系,并为图层面的优化提供接口。 它还包含丰富的语义信息以进行编译,并为自定义算子提供了可扩展性。分类DAG-based IR(a directed acyclic graph)有向无环图。其节点和边组织为有向无环图(DAG)。 计算图IR是一种以有向无环图(Directed Acyclic

2021-05-10 19:29:44 2564

原创 代码优化-loop transformation(unroll,fusion,skew等)

loop transformation:模型的并行和局部性(时间和空间)loop fusion循环融合,就是将多个循环融合在一起。融合在一起的好处包括充分利用数据的局部性,同时利用一些pipeline/multithread的技术可以减少计算时间。例如对于下面的循环:在没有融合之前,我们得先访问A[i],然后串行访问B[i]。我们得launch两个kernel,也就是每个kernel都得处理一个for循环,这种增加了局部性。将一个整体的for循环拆成多个for循环称为loop fission.我

2021-05-10 19:19:09 1241

原创 Halide-based IR和 Polyhedral-based IR

背景编译器后端的第一步是生成低级IR。低级IR可以理解为实现单个算子的算法的抽象表达形式。编译器后端的第二步是后端优化。针对不同的硬件架构,不同的算法实现方式有不同的性能。后端优化的目的就是希望能找到算子的最优实现方式,达到最优的性能。编译器后端优化是AI编译器的核心内容。编译器后端的第三步是代码生成。代码生成即把优化后的低级IR转化成机器指令,这一步通常会借助其他成熟的编译工具来实现,不是AI编译器的核心内容。常用的编译工具包括跨平台的LLVM、Nvidia GPU的编译工具NVCC等等。AI编译器会

2021-05-10 18:33:50 2377

原创 神经网络的加速

背景目前神经网络应用在大多数的场景,包括计算机视觉(包括目标识别、检测),推荐系统,大型的科学计算等。神经网络的计算本质上是张量计算(tensor),因此为了加速神经网络的计算,我们就需要进行张量的加速计算。为了加速张量计算,我们需要软硬件协调。张量计算有两个特征计算密集(compute-intensive)访存受限(memory-bound)目前现存的一些技术算法层面稀疏性所谓的稀疏,就是利用神经网络计算过程中的零值元素。提出的要求就是只取出非零数值送到PE中,然后进行运算。包括的方面

2021-05-08 15:03:19 2018

原创 神经网络编译器的Tensor优化:auto tune和auto schedule

一般情况下,深度神经网络的计算本质上是一对tensor的计算,例如常见的conv2d的计算本质上是一个7层的for循环,那么底层的硬件,例如内存大小,SM的数量,threads和blocks等都会对最终的for循环造成影响。现存的深度学习框架(例如Tensorflow,PyTorch ,MXNet)会将DNN中的计算映射到其底层提供的向量计算内核库(例如cuDNN,MKL-DNN)来实现高性能。 但是,这些内核库存在以下几个问题:现存的加速库cuDnn,MKL-DNN针对Tensor的优化是需要耗费大

2021-04-28 18:03:57 1892

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除