自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

softee的专栏

认真细致,持之以恒。

  • 博客(49)
  • 资源 (1)
  • 收藏
  • 关注

原创 Graph Compiler简介

Graph Compiler简介几种Graph CompilerTensor Comprehensions (TC)TVMONNXGLOWnGraphPlaidMLTensorRT几种测试基准程序MLPerfDAWNBenchDeepBenchDL的部署几种Graph CompilerTensor Comprehensions (TC)使用polyhedral编译技术以及autotuing,提高自定义算子的性能。支持Caffe2和PyTorch。TVM基于Halide的compute与sc

2020-10-14 11:46:43 853

原创 链式传播算法推导

链式传播算法推导一些符号的意义nnn:一个batch的大小x,yx,yx,y:神经网络的输入和输出CCC:代价函数aaa:激活函数wi,jlw^{l}_{i,j}wi,jl​:从l−1l-1l−1层到lll层的权重,iii表示在lll层的神经元,jjj表示在l−1l-1l−1层的神经元bilb^l_{i}bil​:lll层中神经元iii上的偏移公式的推导过程对于一个batch来说,代价函数被定义为:C=1/2Σj(yj−ajl)2C=1/2\Sigma_j{(y_j-a^l_{j})

2020-05-27 14:46:33 1248

原创 half和float两种数据类型之间的转换

half和float两种数据类型之间的转换Half是用16位表示浮点数的一种数据类型,在IEEE 754中也有规定,这种数据类型在深度学习系统中的应用比较广泛。但是在当前主流cpu上,不支持half类型数据的计算和输出,所以需要half和float两个数据类型之间的转换。 图1是16位浮点表示的标准,其中包括了1个符号位,5个指数位和10个尾数位。对于正常的数值,其结果如下表示。 val=...

2018-03-09 10:47:54 16680 1

原创 OpenCL面向存储结构优化的研究

OpenCL是一种面向多设备、多平台的编程语言,被多个设备生产厂家支持,具有良好的兼容性。但是,由于不同设备之间有很大的差异,在不同设备上针对OpenCL的调优手段也大不相同。这里主要针对两款GPU,分别是ARM公司的Mali-T860(以下简称为T860)和NVIDIA公司的GeForce GTX 950M(以下简称为950M),使用不同的内存优化策略,评估1024*1024规模的矩阵相乘的性能...

2018-03-03 20:53:03 1538

原创 ubuntu 14.04安装cuda

1. 首先得确定有nvidia卡。可以用lipci查看。2. 安装nvidia驱动。我的机器对应的文件是NVIDIA-Linux-x86_64-375.66.run。要到官网上根据型号下载。3. 安装cuda的仓库。我的机器对应的文件是cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64.deb.4. 应用更新。sudo apt-get u

2017-09-04 09:07:22 600

原创 Joint Face Detection and Alignment Using Multi-task Cascade Convolutional Networks笔记

人脸识别是当今人工智能中的一个研究热点。不同的姿势、光线以及遮挡物等,都会给人脸识别增加困难。这篇文章提出了一个基于深度CNN的,串联、多任务的框架,串联的方法利用了人脸检测(face detection)和人脸对齐(face alignment)之间的内在关系,以提高识别率。在保持算法实时反应的基础上,对FDDB和WIDER FACE等基准测试集的识别率都达到了超越当前最新水平的准确率。相关工作

2017-05-09 09:34:06 1432

原创 ubuntu上安装keras + tensorflow

keras最近很火,它是一个较高层次的深度学习框架,后端可以使用tensorflow或者theano。尝试着在ubuntu上面安装了keras和tensorflow,过程不算麻烦,但是还是有些小问题需要注意的。1. 安装tensorflow。tensorflow有很多种安装方式,参见网址:http://www.tensorfly.cn/tfdoc/get_started/os_setu

2017-04-21 15:04:04 16758 3

翻译 原子指令分析

本文摘译自维基百科。分析比较了在各种指令集体系结构上常见的两种原子指令:比较并交换(CAS:Compare And Swap)和锁读条件写(LL/SC:Load-Link/Store-Conditional)。比较并交换概述比较并交换是多线程中用来实现同步的原子指令,它需要三个参数:内存地址,旧值、新值。指令首先比较内存地址中保存的值与旧值,若相同,则把新值写入内存地址;若不同

2017-03-17 21:29:01 6389

原创 GCC中x86架构下simd intrinsic函数的实现的分析

intel提供了多种寄存器和指令来支持单指令多数据(simd)操作,按时间先后顺序包括MMX系列(支持128位寄存器),SSE系列(支持256位寄存器)和AVX系列(支持512位寄存器)。本文以AVX系列的寄存器和指令位例子,分析GCC编译其中如何以intrinsic函数的形式来为程序开发者提供simd操作的支持。数据类型512位寄存器的数据类型主要分为两类:一类是以“__v”

2017-03-01 21:09:08 6964 2

翻译 Intel应对ROP攻击的新技术

Intel长期与社区合作,以增强操作系统和软件的安全防护。但随着防护技术的增强,攻击者也相应地提高技术手段,JOP(Jump Oriented Programming)和ROP(Return Oriented Programming)就是被广泛采用的手段。因为使用的是内存中已有的代码,所以很难被发现。 Intel和Microsoft在过去的10年里,设计了十多种方案来解决这个问题,最后归结于x86

2017-02-19 21:57:57 4145

原创 intel向量化指令在矩阵乘应用中的评估

随着机器学习等人工智能技术的飞速发展,矩阵乘法的应用越来越多,intel芯片先后提供了不同系列的向量指令,包括mmx、sse、avx等,支持simd操作。后来为了更好地支持矩阵乘法,又增加了fma(Fused Multiply-Add)指令。fma指令需要三个向量参数va,vb,vcva, vb, vc,其效果等价于表达式(va∗vb)+vc(va * vb) + vc,其中的乘法和加法都是面向向量

2017-02-13 22:05:10 4131 1

原创 RNN LSTM与GRU深度学习模型学习笔记

RNN(Recurrent Neural Network), LSTM(Long Short-Term Memory)与GRU(Gated Recurrent Unit)都是自然语言处理领域常见的深度学习模型。本文是一个关于这些模型的笔记,依次简单介绍了RNN, LSTM和GRU。在学习了大量的语言样本,从而建立一个自然语言的模型之后,可以实现下列两种功能。可以为一个句子打分,通过分值来评估句子的

2017-01-09 20:39:48 21206

原创 softmax函数的定义及求导

softmax函数的定义及求导本文中(x0,x1,...,xm)(x_0, x_1, ..., x_m)代表一个向量,也就是一个mm行1列的矩阵。在监督式的深度学习中,输入通常是一个向量,用xx表示,输出yy则可以分为多种情况。布尔型标量。yy为0或者1表示输入xx是否属于某一类别。向量。此时输入xx可能属于多个类别。y=(y0,y1,...,yn)y=(y_0, y_1, ..., y_n)。

2017-01-05 22:06:02 9754 1

原创 受限波尔兹曼(Boltzmann)机简介

DBN(Deep Belief Network)是深度学习中的一个重要模型,受限波尔兹曼机(RBM: Restricted Boltzmann Machine)则是DBN的主要组成部件。而RBM的含义和训练比较难以理解。这里试图以直观明白的方式来解释RBM的模型及学习算法。RBM模型RBM是一个由神经元组成的两层模型,分别为显式层和隐藏层,层次之间全链接,层次之内无链接,“受限”的限制就是层次之间的

2016-11-10 21:50:00 2045

原创 GCC后端指令生成分析(2)

gencodesgencodes的功能是读取机器描述文件,选择其中为define_insn和define_expand的条目,生成insn_code枚举类型。枚举类型定义如下。 enum insn_code{ CODE_FOR_nothing = 0, CODE_FOR_%s, …… } 类型定义中的%s代表define_insn或者define_expand中的名字。

2016-10-31 21:13:15 2099 1

原创 GCC后端指令生成分析(1)

主要研究GCC指令生成阶段的各个步骤,重点在编译器代码与机器描述之间的接口函数和数据结构。以一小段代码片段为示例,逐步追溯直至汇编代码生成的整个过程。引言机器描述文件是形如*.md的文件,其核心部分是两类定义:“define_insn”和“define_expand”。 图1 md文件中define_insn模版示意图define_insn主要分为以下几个部分。名字,对应图1中的“addqi3_

2016-10-28 13:56:03 3508

翻译 GCC中的自动向量化(1)

GCC中的自动向量化(1) 本文是阅读Dorit Naishlos的文章“Autovectorization in GCC”时做的笔记。在使用了语法树上的静态单赋值(tree SSA)优化框架之后,GCC已经具备了支持自动向量化的能力。目前对向量化的一个限制是,向量化必须在不存在迭代间数据依赖的前提下才能实施。 SIMD的向量化与传统向量机的不同在于,SIMD每次向量化的数组元素较少,随着数

2016-08-18 17:00:07 8389 1

翻译 neural networks and deep learning(Michael Nielsen)笔记(1)

手写阿拉伯数字的识别,对于计算机来说,是个困难的问题,也是深度学习的研究内容之一。这本书就是以此为目标,逐步展开对于深度学习的不同架构和算法的介绍。感知器感知器是由一个神经元组成的模型,如图 1 所示。 感知器的主要组成如下:多个输入。图中是两个x1 x_1和x2x_2 ,可以用向量 xx 表示。权重。每个输入对以一个权重,标示在输入的边上,如w1w_1和w2w_2 ,可以用向量ww来表示

2016-06-18 10:43:54 1897

原创 斯坦福大学机器学习笔记(5)-logistic回归的优化

如前所述,回归是使用函数来模拟样本的。logistic回归,是对取值为0或1的布尔值的模拟。logistic回归中使用的函数的值域为[0, 1],可以视为布尔输出为1的一个概率值。 已知包含mm个元素的的训练集合被表示为{(x(1),y(1)),...,(x(m),y(m))}\{(x^{(1)},y^{(1)}), ..., (x^{(m)},y^{(m)})\}。样本元素中的x(i)x^{(i

2016-06-03 23:17:57 2047

原创 斯坦福大学机器学习笔记(4)-logistic回归

概念logistic回归,是输出为0或1的布尔值的回归,或者也可以为视为介于0和1之间的实数值的一个概率。 不能用线性的方式来表示logistic回归,因为很难用线性拟合,如下图所示,就很难用直线来拟合图中的采样点。 对于logistic回归,需要用一种不同于线性表达式的函数来拟合,而且函数的取值范围介于0和1之间。这样的函数定义如下。 g(z)=11+e−zg(z)=\frac{1}{1

2016-05-27 22:47:23 1168

原创 斯坦福大学机器学习笔记(3)--梯度下降及学习速度

线性回归中的梯度下降线性回归函数的形式如下: hθ=θ0+θ1x1+θ2x2h_{\theta}=\theta_0+\theta_1x_1+\theta_2x_2。 代价函数用方差来表示,被定义为: J(θ)=12mΣmi=1(θTx(i)−y(i))2J(\theta)=\frac{1}{2m}\Sigma_{i=1}^{m}(\theta^Tx^{(i)}-y^{(i)})^2。 式子中

2016-05-25 15:50:56 1739

原创 斯坦福大学机器学习笔记(2)

梯度下降(gradient descent)梯度下降利用迭代的方法,更新θ\theta参数,以提高回归问题中拟合的准确性。其步骤如下。以某个初值来初始化θ\theta,例如θ=(0.1,0.2,0.3)T\theta=(0.1, 0.2, 0.3)^T使用J(θ)J(\theta)来表示代价函数,不断更新其中θ\theta的值来最小化J(θ)J(\theta),对于θ\theta中的每个向量元素

2016-05-22 17:29:45 836

原创 斯坦福大学机器学习笔记(1)

斯坦福大学机器学习笔记:监督学习和线性回归。

2016-05-20 23:33:05 1497

原创 深度学习(1):纲要

概述AI的目标是创造出一种机器,能够象人一样感知、记忆、学习和识别。深度学习是近年来被开发的一个领域,它最大限度地模仿人脑:处理复杂的输入数据;智能快速地学习不同的知识;解决不同种类的复杂问题。带有优秀学习算法的深度架构,被认为是人工智能的新的方向。深度学习浅层架构通常只有少量的特征层以及一个权重层(通常是线性的)。直到最近,很多机器学习和信号处理系统仍然使用浅层架构,它们最多

2016-04-17 21:30:04 663

原创 数据挖掘系列笔记(2):机器学习的应用实例

机器学习的应用领域非常广泛,而且随着VLSI技术的发展和大规模并行计算的推广,机器学习机器相关的大数据领域,再次成为研究的热点。1. 学习关联性从样本的空间中学习各种事件之间的关联性。以超市购物为例,X代表客户购买尿布的事件,Y代表客户购买奶粉的事件,则P(Y|X)代笔客户在购买了尿布时,又购买了奶粉的概率。机器学习的一个人物就是,从一个大的样本空间之内,学习时间之间的关联性,以指导商业或

2016-04-10 22:32:53 1492

原创 数据挖掘系列笔记(1):概述

1. 什么是数据挖掘?数据挖掘是从已知的数据集合中发现各种模型、概要和导出值的过程。通俗地说,数据挖掘就是要从大量的数据中寻找有价值的、非同寻常的新信息。它的两个目标是预测和描述。预测是从已有的数据中推导出模型,从而对未来的情况进行预测。而描述则是从已知数据中找出可为人类解释的数据模式,对数据进行理解。2. 数据挖掘与传统的技术有和不同?一种传统的应用是使用了”首要原则模型”(firs

2016-04-09 22:58:53 999

翻译 ARM指令系统概述

摘译自Matteo Franchin的PPT《ARMv8-A A64 ISA Overview》。寄存器ARM共有31个通用寄存器和2个特殊寄存器,都是64位。31个通用寄存器用X0到X30来表示,两个特殊寄存器是SP和ZR。SP是栈指针,其内容是栈底的地址,必须满足16字节对齐的条件,否则无法使用。例如:ADD SP, SP, #8这种用法是错误的,因为所得到的SP不

2016-04-05 22:48:03 7746

原创 整数的补码表示及其运算分析

研究整数的补码表示方法及其在运算中的原理。重点在于负数的补码表示在运算时的符号位溢出和其他位的进位变化情况及其所代表的意义。

2016-04-04 21:22:37 1336

原创 ARMv8架构下程序运行时栈帧布局

结合ARM相关文档和在飞腾机器上使用gdb调试实际程序来研究ARM的指令和运行时栈帧布局。主要参考了三篇文档。1. Procedure Call Standard for the ARM 64-bit Architecture。参考其中的过程调用标准和运行时栈帧布局。2. ARMv8 Instruction Set Overview。参考其中的指令概述。3. ARM Com

2016-03-30 21:16:03 15046

原创 Huffman树的建立、字符界面下的显示及序列化(一)

本文主要是Clifford A. Shaffer所著的《Data Structures and Algorithm Analysis in C++》一书中项目设计习题5.7的实现。Huffman树是一种可以用来压缩文件的技术。为在计算机上存取文件,需要为文件中的每个字符分配一个编码,一般情况下,每个字符的编码长度相同。例如,每个ASCII字符的编码长度为8位。那么,保存一个有着1000个字符的

2016-03-09 23:15:23 1437

原创 GCC passes分析(一)

遍(passes)是GCC编译器源代码中的一个重要概念,对它们的理解是了解GCC源代码的架构的基础。本系列文章打算以此为契机,对GCC编译器源代码做一个概要性的分析,分析对象为GCC 4.9.1版本。源代码中,与Pass相关的文件有:  1. passes.c  2. passes.def  3. pass_manager.h  另外,安装编译器的过程中,还会生成一个与

2016-02-10 21:24:39 2159

原创 使用单指针实现双链表(C++语言)

链表是常见的数据结构,链表中的结点通常定义如下。template class Link {public: E element; // Value for this node Link *pt; // Pointer to next node in list // Constructors Link(const E& it, Link* prevp

2016-01-14 22:22:55 1491

原创 Linux下ELF格式可执行文件及动态链接相关部分的解析

Linux下面的ELF文件主要由ELF头、程序头和各个段组成。本文使用的示例程序如下。首先把它编译为可执行文件,再使用Linux下面的hexdump命令,把可执行文件完全转换为16进制的表示形式,然后分析这样的表示与ELF文件中各部分的对应关系。示例程序:#include int global_init_var = 84;int global_uninit_var;

2015-11-21 21:06:42 3593

原创 GCC -fpie选项生成文件分析

不同选项下的虚拟内存分布Linux系统下,ELF格式的可执行文件的各个段都会被分配到不同的虚拟内存空间中。在操作系统实现地址随机化机制(AddressSpace LayoutRandomization)之前,程序在任意一次执行下,所使用的虚拟空间的其实地址往往是相同的。这就给以下恶意攻击者的攻击行为提供了很大的便利(见StackSmashing for Fun and Prof

2015-08-28 23:21:45 9681

原创 GOT和PLT原理简析

GOT(Global Offset Table)和PLT(Procedure Linkage Table)是Linux系统下面ELF格式的可执行文件中,用于定位全局变量和过程的数据信息。以C程序为例,一个程序可能会包含多个文件,可执行文件的生成过程通常由以下几步组成。1. 编译器把每个.c文件编译成汇编(.s)文件。2. 汇编器把每个(.s)文件转换为(.o)文件。3. 链接器把多个.

2014-11-18 22:34:34 15922

原创 llvm各种格式文件转换图

llvm主要具有以下几种格式的文件。

2014-11-14 23:14:28 9829 1

原创 计算排列组合的C++程序

n个不同对象的排列组合一共有n!种。

2014-11-13 21:40:26 2202

原创 迪杰斯特拉(Dijkstra)算法描述及其正确性证明

Dijkstra算法描述及其正确性证明

2014-09-06 23:03:52 25921 5

原创 哲学家就餐问题及其一种java多线程实现

哲学家就餐问题,是并行程序中的一个经典问题,qi mian s

2014-04-08 21:14:53 1744

翻译 算法导论笔记(2):几种基本数据结构

1. 线性数据结构线性数据结构中最重要的是数组和链表。访问数组中任何一个元素所用的时间都是相同的,而链表不具备这样的属性。数组被用于实现其他重要的数据结构,例如字符串。对字符串的操作与对数组的操作大不相同,字符串的操作包括:计算长度、比较字符串的大小或者连接两个字符串等。对链表中不同元素的访问时间是不同的,因为任何访问必须从第一个元素开始。对链表的插入或删除操作要比数组简单一些。数组和链表

2014-02-09 21:51:17 1151

空空如也

空空如也

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

TA关注的人

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