- 博客(81)
- 资源 (5)
- 收藏
- 关注
原创 OpenCV 2.4.13.16 + cuda 9 + centos7 编译
OpenCV 2.4.13.16 + cuda 9 + centos7 编译获取源码 wget https://github.com/opencv/opencv/archive/2.4.13.6.tar.gz解压 tar xvf 2.4.13.6.tar.gz && cd opencv-2.4.13.6/构建编译脚本 mkdir ...
2018-03-22 15:58:42
1895
1
原创 基于CuDNN如何实现自动选取最优卷积算法?
何为最优最优并不是绝对的,而是需要针对具体的应用场景而言.在深度学习应用中,训练时我们往往对训练速度有要求,希望越快越好,也就意味着能够在更短的时间训练完我们的模型,更小的调整参数的成本;而对于随着网络模型的深度加大,模型本身训练时所占用的显存空间很大,这时候就要求我们的选取的卷积算法能够竟可能的少占用临时显存空间.综上,这是一个时间与空间的权衡,本文会结合当前最新的CuDNN分析如何实现...
2018-02-23 16:35:25
2421
原创 Mixed-precision(混合精度训练)
混合精度训练最近刚好在做相关工作,所以花点时间对混合精度进行模型训练进行一下理解与总结.详细数据请参考百度与nvidia联合放在arxiv上的论文:https://arxiv.org/pdf/1710.03740.pdf 概述深度学习模型的计算任务分为训练和推理.训练往往是放在云端或者超算集群中,利用GPU强大的浮点计算能力,来完成网络模型参数的学习过程.一般来说训练时,计算资源往...
2018-02-12 19:59:56
11564
1
原创 tensorflow内存分配器剖析
tensorflow基于Doug Lea的malloc实现了自己的一套内存分配器.(简易版本的dlmalloc)通过合并的方式减少内存碎片.前提是假设使用这个分配器的进程拥有很大的内存,并且所有的内存分配请求都是通过这个接口. 代码路径: core/common_runtime/bfc_allocator.h关键数据结构以及变量含义: Chunk:指向一块内存,prev/next指针组成了一个
2017-11-24 14:59:46
1207
1
原创 tensorflow分布式运行时组件剖析
本节主要研读core/distributed_runtime目录.集中为分布式多节点之间通信,全局资源分配/管理,资源调度等问题.mgr: base_rendezvous_mgr: rendezvous_mgr_interface.h cluster_function_library_runtimegraph_mgr partial_run_mgr session_mgrmaster_se
2017-11-23 20:31:43
1881
原创 slurm提交Tensorflow任务实现
主要目的目前tensorflow单机多卡模式可以参考tutorial很容易使用,但是如果想在集群多节点搭建分布式tensorflow训练任务部署,官方没有一个很好的示例代码,只能通过很naive的方法,指定ps node/worker node,在不同的节点分别执行对应的程序来实现多机协同训练模型的效果.这种方式对于集群环境,存在大量节点的情况就显得非常的不方便.本文是基于slurm集群资源管理工具
2017-11-21 14:07:34
3130
原创 TensorFlow计算图优化代码剖析
代码路径:tensorflow/core/grappler/optimizers 其中meta_optimizer.cc中的RunMetaOptimizer方法的调用触发对图的不同类型的优化操作.优化操作分为一下几类: 1. pruning.裁剪,比如移除一些无用的操作(一旦图建立之后不再使用的stop gradient节点以及Identity节点),优化梯度计算. 2. constfo
2017-11-20 16:52:05
4748
原创 Tensorflow中Device实例的生成和管理
关键术语描述kernel在神经网络模型中,每个node都定义了自己需要完成的操作,比如要做卷积、矩阵相乘等。而实现这个操作的算法,我们单独抽象出来,叫做kernel。 可以将kernel看做是一段能够跑在具体硬件设备上的算法程序,所以即使同样的2D卷积算法,我们有基于gpu的Convolution 2D kernel实例、基于cpu的Convolution 2D kernel实例。device负
2017-11-15 19:55:42
2501
原创 Tensorflow MPI Enable Intro
TensorFlow MPI Enable Intro如何编译并使用支持MPI的tensorflow官方提供的readme.md中说只需要执行configure时选择MPI Support.但是笔者通过配置openmpi-1.8.15-cuda-8.0也就是cuda aware的mpi,编译过程并不顺利,会出现"fatal error: openmpi/ompi/mpi/cxx/mpicxx.h:
2017-10-13 18:05:54
3181
1
原创 Cudnn v5.1与V 6.0的特性
V5.1新增特性针对3*3以及5*5de 卷积核,添加了新的Winograd卷积算法,提供前向和后向计算。可以通过使用CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD_NONFUSED,CUDNN_CONVOLUTION_BWD_DATA_ALGO_WINOGRAD_NONFUSED以及CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD_NO
2017-07-13 17:02:20
5365
原创 TensorFlow 1.0源码编译安装
CUDA/cudnn安装pythonTF源码下载bazel安装bazel是通过自行在github上下载release的zip源码包然后编译,将生成的二进制文件拷贝到PATH路径上即可。 注意:tensorflow配置时会提示找不到bazel这个命令,而实际上我们已经编译并配置到PATH,需要在/usr/bin/目录中新建一个指向bazel的软连接bazel-real在安装的cuda 8.0, te
2017-07-04 11:38:20
1412
转载 Swig实现将C、C++编译成Python动态链接库
转载:http://cering.github.io/2015/12/08/%E4%BD%BF%E7%94%A8SWIG%E5%AE%9E%E7%8E%B0Python%E8%B0%83%E7%94%A8C-C-%E4%BB%A3%E7%A0%81/
2017-03-13 13:46:59
492
1
转载 GPU以及CUDA的几个基本概念理解
参考:blog.sina.com.cn/s/blog_80ce3a550101lntp.htmlGPU的硬件结构中与CUDA相关的几个概念:thread block grid warp sp sm streaming processor(sp): 最基本的处理单元,streaming processor 最后具体的指令和任务都是在sp上处理的。GPU进行并行计算,也就是很多个sp同时做处理。现在S
2016-12-30 10:48:50
8831
原创 深度学习caffe编译安装记录
从官方GitHub中下载Caffe源码。提前安装Caffe的相关依赖。大部分都能够通过yum安装。blas,cblas需要下载源码进行编译安装。修改Makefile.in文件中的选项进入build,执行cmake ..,然后make all -j4.安装完成
2016-12-28 23:20:29
482
原创 最长锯齿序列 Leetcode
题意给定一个序列,求最长锯齿序列的长度,所谓锯齿,就是子序列中不断的增大然后减小或间接的减小然后增大。分析一开始是没有啥思路的,感觉应该要使用DP,那么关键就是找到子问题。首先,结果子序列可以是先递减在递增,也可以是先递增再递减,求解的过长都是一样的,假设d[i]为先递减再递增类型序列以第i个位最后一个数的最长子序列长度,f[i]为递增再递减以第i个位置为最后一个数的最长子序列长度,那么就有下面的公
2016-09-22 22:19:55
1072
原创 Largest Divisible Subset
这道题挺有意思的,就是给定一个序列的整数,然后让找出最大的子集,这子集中的任何两个元素能够互相整除(i%j==0或者j%i==0).思路子集中两个元素能够保证能够整除,那么如果再加入一个整数,判断的条件就是这个整数能够整除子集中最小的数或在能够被其中最大的数整除,当然,这个说法仅仅是针对题目解答的一个途径。我们将序列排序,然后使用动态规划来求解,如何使用动态规划呢,设 T[n]为第n个整数为最大时
2016-07-03 22:03:19
396
原创 Distinct Subsequences
这道题是有一定的规律的,同样类型的题就是给定的两个字符串,问经过最少的字符删除或者替换能够将两个字符串变成一样。看过比较好的解法,都是通过动态规划。构建一个二维矩阵d[i][j] 然后,代表两个字符串中的第i,和第j。class Solution {public: int numDistinct(string s, string t) { int ns=s.size();
2016-06-26 22:27:34
275
原创 Count Numbers with Unique Digits
看到这道题一开始还真是有点蒙 ,想着找出1,2,3位数之间重复数字个数的规律。发现其实3位也就是0<=x<1000,要向统计存在重复的数字就已经很困难了,很难找出规律。那么我们就反过来直接求符合条件的数。首先除了第一位是从1~9中选取,后面的其他位都是从0~9中选取,所以其实就是一个排列组合问题,第一位有9种选择,第二种就不能和第一位重复,那么10-1,剩下9种选择,第三位由于不能和前面两位重复,1
2016-06-22 21:43:17
361
原创 Regular Expression Match
记录这道题主要是为了加深自己的理解,虽然代码AC了。 这是正则匹配,也就是和我们正常的字符串匹配有一点差别。对于,它可能代表前一个字符,0个或者多个,所以这个问题主要就会围绕当前字符的下一个字符是否为’‘来讨论。如果pattern的长度为空,那么源字符串如果不为空,肯定就返回false. 如果pattern的长度为1,那么源字符串长度如果不为1,那么肯定也为false.因为无论pattern这一
2016-06-18 22:30:39
512
原创 Data Stream as Disjoint Interval | leetcode
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */class Sum
2016-06-08 10:44:39
345
翻译 Redis 延迟产生的主要原因分析
题主写这篇文件主要是想让自己能够在遇到Redis延迟问题时能够有效的查找原因。这里所提到的延迟指的是客户端发送一个命令,到收到该命令回复的最大延迟时间。一般来说,Redis处理的时间是非常的低的,都是微秒级别,但是也存在一些情况会导致很高的延迟。低延迟使用Redis的几点Tips下面的内容对于低延迟使用Redis是非常重要的。不过先给出几点手段,使得能够获取最大低延迟效益。 1. 确保你不使用会造
2016-05-23 18:06:18
2398
原创 Longest Increasing Path in a Matrix | leetcode
题意题目的意思就是在一个矩阵中找出一个最长的递增序列思路这个题目是很明显的需要使用深度优先搜索方法的。矩阵中的每个位置都可能是序列的起点,所以需要遍历所有的位置,在搜索路径上的一个位置时,如果周围的数字不比自己大,这时候就返回,当前路径搜索结束。这里会存在可以优化的空间,就是搜索路径中会存在很多的重复,所以我们可以使用额外的空间存放每个位置为起点的最长序列。实现代码如下:class Solution
2016-05-21 20:16:51
403
原创 Product of Array except self | leetcode
思路simple的方法就是使用除法,先得出整个数组的元素乘积(注意越界),然后每位除以该位元素,就能够得到结果。但是题目要求是不能使用除法,而且复杂度要求为O(N). 那么我们可以这么做,先从头到尾扫一边,得到前面所有元素的乘积,第一位设置为1,这样,最后一个数是满足题意的。其他还需要继续相乘,所以我们这次从尾开始扫一边,这样就能得到题的结果了。下面是实现代码:vector<int> product
2016-05-14 22:12:49
238
原创 单链表是否有环,环的大小,第一个连接点,有环的单链表长度
给定一个单链表,只给出头指针h: 1、如何判断是否存在环? 2、如何知道环的长度? 3、如何找出环的连接点在哪里? 4、带环链表的长度是多少? 下面是实现,可以相互检查一下是否不正确。/* 2 Here we discuss four question about single list 3 1. isCircle(ListNode* head) 4 2
2016-04-24 20:06:19
403
原创 Integer Break | leetcode
原题 Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get. For example, given n =
2016-04-20 09:53:47
286
原创 Linux/Windows 环境下openGL开发环境问题集锦
Linux: GCC编译: gcc transformation.c -lglut -lGL -lGLUwindows VS2015
2016-04-18 20:18:29
667
原创 GPU初始化和启动流程(r600)
本文是分析了显卡初始化和启动的函数调用以及每个函数的功能。初始化显卡int r600_init(struct radeon_device *rdev) //debuffs r600_debugfs_mc_info_init(rdev) *********************BIOS***************************
2016-04-05 15:29:05
5651
原创 DRM初始化过程
先问一个问题,DRM模块如何初始化,在哪个节点初始化,初始化又完成了哪些方面的工作?drm_core_init 这个函数是通过module(drm_core_init)明确在系统启动时进行调用.指定设备的major号,linux中默认为226. 创建并初始化一个idr机制,这个机制其实原理上就是一个哈希表,由内核系统维护,能够快速的查找。调用 register_chrdev(DRM_MAJOR,
2016-04-05 15:26:28
3695
原创 VxBus设备驱动模型
VxBus简介VxBus是指在VxWorks中用于支持设备驱动的特有的架构,这种架构包含对minimal BSP的支持。 它包括以下功能:①允许设备驱动匹配对应设备;②提供驱动程序访问硬件的机制;③软件其他部分访问设备功能;④在VxWorks系统中,实现设备驱动的模块化。 VxBus在总线控制器驱动程序服务的支持下,能在总线上发现设备,并执行一些初始化工作,使驱动与硬件设备之间正常的通讯。O
2016-03-30 17:23:07
1803
原创 设备驱动模型
在linux代码中,其实很大部分都是驱动代码,真正的kernel代码并不大。因为研究课题的原因,说一下自己对设备驱动模型的理解。系统中的每个逻辑设备都应该有一个与其相对应的、明确定义了设备号的设备文件。设备文件被分配一次且永远保存在/dev目录中。可以把设备文件的每个系统调用都转换成与设备相关的函数的调用,而不是对主文件系统相应函数的调用。与设备相关的函数对硬件设备进行操作完成进程所请求的操作。
2016-03-29 16:26:41
622
原创 LRU Cache算法实现(leetcode)
题意实现一个LRU cache类,使得在我们需要获取一个key的值时,如果cache中有,那么直接返回值,否则就返回-1;同时我们还可以设置一个cache的值,这个主要是在我们出现cache miss的时候,我们需要替换其中的项或者需要从主存中载入对应的项。思路LRU,最近最少使用,也就说在出现cache满的时候,替换原则就是替换最近最少使用的项。类中必须体现出这个原则,那么我们应该如何来做呢?首先
2016-03-28 20:40:59
802
原创 编程珠玑之左旋转一个字符串
描述将一个n元一维向量向左旋转i个位置。例如,n=8,i=3,向量abcdefgh旋转结果为defghabc. 要求是使用数十个额外字节的存储空间,在正比于n的时间内完成向量的旋转??思路简答的代码就是存储前i个,然后将后面n-i依次向前挪动。这样的使用的i个额外空间就是过大的存储空间的消耗。另外一个方法就是递归调用,每次旋转一个,然后调用i次。还一个方法就是按照第i个划分,分别将两部分翻转,然后再
2016-03-21 18:10:45
548
原创 如何确定栈的增长方向地址是递增还是递减
#include<stdio.h> static int stack_dir; static void find_stack_direction (void) { static char *addr = NULL; /* address of first `dummy', once known *
2016-03-20 21:43:11
3782
原创 判断一个机器是大端序还是小端序
大小端其实指的就是CPU对数据存放的字节顺序。如果高位放在高地址,低位放在低地址,那么就是小端;反之,高位放在低地址,低位放在高地址,那么就是大端。问题是,如何通过程序判断机器是大端还是小端呢,其实很简单,使用union这个结构类型就可以很容易的解决。static union{ char c[4]; unsigned long endlian;}my_test = {{'l','x
2016-03-20 21:34:52
668
原创 深入探索C++对象模型笔记
一开始对C++primer plus都没看完的是我就下载了深入探索C++对象模型,当时看了就觉得绝望,因为实在看不懂,天书。不过经过一段时间的使用,尤其是放在Effictive c++后面再来看,就很有感触了。题主比较健忘,决定把一些关键点记录下来,方便没时间的时候能够快速翻阅。为什么抽象基类必须定义一个纯虚函数的析构函数,pure virtual destructor,class设计者一定得定义
2016-03-20 20:17:33
501
原创 DRM security
http://www.x.org/wiki/Events/XDC2013/XDC2013DavidHerrmannDRMSecurity/DRM_SECURITY
2016-03-17 21:11:31
597
原创 IO多路复用之select、poll以及epoll
进程的阻塞处理运行态的进程(获得CPU资源),由于需要等待一些事件的发送而不能继续执行时,就会祖东的转为阻塞状态,这是,他是不占用CPU资源的。因此也只有处于运行态的进程,才能够转为阻塞状态。这时候调度器会切换到其他进程,一旦这个进程等待的事件发生了,那么就会重新唤醒这个进程,重新等待被调度。一旦被调度器调度,那么就会恢复到切换之前的状态,继续执行,由阻塞状态切换到运行态。文件描述符一个用于对文件引
2016-03-17 14:56:06
372
原创 树中节点最低公共祖先
给定两个树节点,返回这两个节点最近的一个公共父节点。二叉搜索树struct BinaryTreeNode{ int val; BinaryTreeNode* left; BinaryTreeNode* right; BinaryTreeNode(int num):val(num),left(NULL),right(NULL){}}BinaryTreeNode* F
2016-03-16 11:08:47
385
1
原创 深入理解Linux内核之内存管理
我们的物理内存中的某些部分永久的分配给内核,并用来存放内核代码以及静态的内核数据结构。其余的部分我们称为动态内存,这不仅是进程所需要的宝贵资源,也是内核本身所需要的宝贵资源。下面通过三部分来描述内核如何给自己分配动态内存,尽可能做到当需要时分配,不需要时释放。页框管理采用4KB页框大小作为标准的内存分配单元。 在以下情况下页框是不空闲的:包含用户态进程的数据,某个软件高速缓存的数据,动态分配的内核
2016-03-16 10:51:37
1283
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人