从零开始山寨Caffe·贰:主存模型】的更多相关文章

你左手是内存,右手是显存,内存可以打死显存,显存也可以打死内存. —— 请协调好你的主存 从硬件说起 物理之觞 大部分Caffe源码解读都喜欢跳过这部分,我不知道他们是什么心态,因为这恰恰是最重要的一部分. 内存的管理不擅,不仅会导致程序的立即崩溃,还会导致内存的泄露,当然,这只针对传统CPU程序而言. 由于GPU的引入,我们需要同时操纵俩种不同的存储体: 一个受北桥控制,与CPU之间架起地址总线.控制总线.数据总线. 一个受南桥控制,与CPU之间仅仅是一条可怜的PCI总线. 一个传统的C++程…
消费者 回忆:生产者提供产品的接口 在第捌章,IO系统(二)中,生产者DataReader提供了外部消费接口: class DataReader { public: ......... BlockingQueue<Datum*>& free() const { return ptr_pair->free; } BlockingQueue<Datum*>& full() const { return ptr_pair->full; } .........…
你说你学过操作系统这门课?写个无Bug的生产者和消费者模型试试! ——你真的学好了操作系统这门课嘛? 在第壹章,展示过这样图: 其中,左半部分构成了新版Caffe最恼人.最庞大的IO系统. 也是历来最不重视的一部分. 第伍章又对左半部分的独立性进行了分析,我是这么描述到: Datum和Blob(Batch)不是上下文相关的. Blob包含着正向传播的shape信息,这些信息只有初始化网络在初始化时才能确定. 而Datum则只是与输入样本有关. 所以,Datum的读取工作可以在网络未初始化之前就开…
工作环境 巧妇有了米炊 众所周知,Caffe是在Linux下写的,所以长久以来,大家都认为跑Caffe,先装Linux. niuzhiheng大神发起了caffe-windows项目(解决了一些编译.API相异问题) 以及willyd大神发起的caffe-windows-dependencies项目(整理了依赖库,修正了LMDB在NTFS分区的Bug) 我们现在可以很欢乐地在Windows上研究Caffe源码,以及山寨它了. 编辑器 在Windows下涉及CUDA,Visual Studio必然…
请以“仰望星空与脚踏实地”作为题目,写一篇不少于800字的文章.除诗歌外,文体不限. ——2010·北京卷 仰望星空 规范性 Caffe诞生于12年末,如果偏要形容一下这个框架,可以用"须敬如师长". 这是一份相当规范的代码,这个规范,不应该是BAT规范,那得是Google规范. 很多自称码农的人应该好好学习这份代码,改改自己丑陋的C++编程习惯. 下面列出几条重要的规范准则: ★const 先说说const问题,Google为了增加代码的可读性,明确要求: 不做修改的量(涵盖函数体内…
生产者 双缓冲组与信号量机制 在第陆章中提到了,如何模拟,以及取代根本不存的Q.full()函数. 其本质是:除了为生产者提供一个成品缓冲队列,还提供一个零件缓冲队列. 当我们从外部给定了固定容量的零件之后,生产者的产能就受到了限制. 由两个阻塞队列组成的QueuePair,并不是Caffe的独创,它实际上是生产者与消费者的编程方式之一. 在大部分操作系统教材中,双缓冲区free.full通常由两个信号量empty.full实现. 信号量(Semaphore)由操作系统底层实现,并且几乎没有人会…
不精通多线程优化的程序员,不是好程序员,连码农都不是. ——并行计算时代掌握多线程的重要性 线程与操作系统 用户线程与内核线程 广义上线程分为用户线程和内核线程. 前者已经绝迹,它一般只存在于早期不支持多线程的系统中. 它用模拟的方式实现一个模拟的多线程系统,不支持异步. 即,一个线程被阻塞了,其它线程也会被阻塞. 当今的操作系统几乎都默认提供了内核线程API,底层由操作系统实现. 内核线程的好处在于,它们之间支持异步,是"真"多线程. 操作系统的流氓软件 不过,内核线程也给线程的使用…
数据变形 IO(二)中,我们已经将原始数据缓冲至Datum,Datum又存入了生产者缓冲区,不过,这离消费,还早得很呢. 在消费(使用)之前,最重要的一步,就是数据变形. ImageNet ImageNet提供的数据相当Raw,不仅图像尺寸不一,ROI焦点内容比例也不一,如图: [Krizhevsky12]给出了CNN打ImageNet的基本预处理,非常经典的" Random 256-224 Crop",即: 首先,对图片进行统一的缩放,无视宽高比,统一缩放成256*256(可利用Op…
听说Google出了TensorFlow,那么Caffe应该叫什么? ——BlobFlow 神经网络时代的传播数据结构 我的代码 我最早手写神经网络的时候,Flow结构是这样的: struct Data { vector<double> feature; int y; Data(vector<double> feature,int y):feature(feature),y(y) {} }; vector<double> u_i,v_i,u_j,v_j; 很简陋的结构,…
你说你会关系数据库?你说你会Hadoop? 忘掉它们吧,我们既不需要网络支持,也不需要复杂关系模式,只要读写够快就行.    ——论数据存储的本质 浅析数据库技术 内存数据库——STL的map容器 关系数据库横行已久,似乎大家已经忘了早些年那些简陋的数据存储模式. 在ACM选手中,流传着“手艹数据库”的说法,即利用map<string,type>或者map<int,type>, 按照自己编码规则,将数据暂存起来,等待调用. 这就是KV数据库,最简陋的数据库,也是最实用的数据库. S…