
C/C++
文章平均质量分 91
SunnyZhou-1024
这个作者很懒,什么都没留下…
展开
-
CMake笔记:add_custom_command不执行
0x00. 前言在网上看别人做一些手工教程视频,经常能看到这样的评论:脑子:我感觉我会了。手:你行你来。之前一直通过编译脚本去寻找代码入口,感觉我已经懂得CMake的语法了,直到今天寄己要写一个脚本去编译一个工程才发现,事情并不简单:脚本并没有按照我期望的去执行。此工程需要用到Protocol Buffer,因此当代码构建的时候需要使用使用Protocol Buffer编译器去编译.proto文件获得对应的生成文件。理论上,想要达到这个目的,我们只需要在CMakeLists.txt中使用add原创 2021-01-22 17:32:40 · 3988 阅读 · 1 评论 -
TensorFlow Lite源码解析之三(委托)
1. 前言所谓劳心者治人,劳力者治于人(所以“劳力士”又叫“打工人”?)。小农经济下自己什么都干,虽然饿不死,但是生产效率也肯定非常低下;只有让专业的人做专业的事,才能最大限度发挥每个人的价值。同理,对于一个推理引擎而言,完成一次计算,可以有多种选择,从头到尾都让CPU做运算理论上也不是什么问题。但是除了结果正确之外,还有另外一项关键指标:时间!密集计算确实非CPU所长,因此他该做的是协调资源,脏活累活让GPU、DSP这些替他干。一个精诚合作的团队力量是非常强大的。那么,TensorFlow Lite是怎原创 2020-12-12 13:00:19 · 2238 阅读 · 4 评论 -
TensorFlow Lite源码解析之一
每一个成功的人工智能背后,都有一个摸摸推理的引擎。想知道TFLite是怎么工作的么,戳我了解更多!原创 2020-11-30 11:20:32 · 1801 阅读 · 0 评论 -
FlatBuffers:flatc源码简析
在简单的编译器他也是编译器原创 2020-09-04 17:21:17 · 1942 阅读 · 0 评论 -
从《七里香》到GCC as汇编语言
行走江湖,不会点汇编怎么行?原创 2020-05-31 14:59:08 · 831 阅读 · 0 评论 -
RPC原理与FastRPC实现
你到一家餐厅吃饭,店里有一个服务员为你服务。你点完菜之后,服务员就走进了后厨。但是,服务员并不是直接将你点的菜告诉他们店里的厨师,相反的,他打电话到别的店点了外卖,外卖到了之后他将饭菜重新装盘,然后给你端了上来。但是你是不知道这个细节的,在你看来,这次吃饭和以往的任何一次没有区别,服务员端上的饭菜在哪里做的你是不知道的,你和平常一样点了菜然后菜就上了,你并不需要自己去关心怎么找到外卖电话,怎么将饭菜装盘。你只管点菜和吃,除了可能等的时间比以往略久,没有任何区别。这个栗子中,服务员就扮演着RPC 中代理的角色原创 2020-05-01 14:37:43 · 5756 阅读 · 1 评论 -
LLVM,一堆积木的故事
如果我说,C可以像Java一样被虚拟机解释执行,也可以对热点代码使用Just-In-Time(JIT)技术编译,也可以实现“一次编译,到处运行”,你信吗?原创 2020-04-04 20:09:24 · 1139 阅读 · 0 评论 -
冰山之下:使用new申请内存的背后
Linux是个多任务操作系统,同一时段内有多个进程在运行着,它们各自拥有很多的资源,其中比较重要的资源之一就是它们拥有的内存。但毕竟内存资源是有限的,不管你4G、8G或者是64G内存,总归是有个尽头。一个进程可能就耗费几百上千兆内存,操作系统怎么让有限的内存运行更多的进程?解决办法是虚拟内存技术。原创 2020-03-29 16:55:25 · 1840 阅读 · 1 评论 -
ONNX Runtime 源码阅读:引擎运行过程总览
之前的文章中,我们一直从源码细节的角度去看某个功能的实现。总会有一种一叶障目不见泰山的感觉,对ONNX Runtime缺乏一个比较总体的认识。通过前面的几篇文章,在看细节源码的过程中,脑海渐渐浮现出了ONNX Runtime总体的轮廓,但是并不是很清晰。今天打算暂时跳出细节,站在高处,看看ONNX Runtime它的筋骨、它的脉络,也更能方便以后进行局部分析。原创 2020-03-28 11:28:48 · 3423 阅读 · 1 评论 -
内存对齐是什么?为什么要对齐?怎么对齐?
所谓内存对齐,就是将数据存放到一个是字的整数倍的地址指向的内存之中。处理器在执行指令去操作内存中的数据,这些数据通过地址来获取。不论什么数据都有一定的大小,当一个数据所在的地址和它的大小对齐的时候,就说这个数据自然对齐了(naturally aligned),否则就是没对齐。原创 2020-03-18 21:33:06 · 1613 阅读 · 2 评论 -
ONNX Runtime 源码阅读:模型分区的实现
为了实现高效的推理,神经网络推理引擎应该尽可能将主机(Host)上能提供更高效计算的硬件设备(Device)利用上,ONNX Runtime当然不能例外。ONNX Runtime目前已经支持了多种不同设备,移动端的支持也在开发中。一台主机上很可能同时存在多种设备,ONNX Runtime是如何选择在那种设备上运行的呢(也就是怎么分区)?对于某些运行时不支持的操作怎么处理(回落)?不同硬件的运行时优先级怎么确定呢?这些就是本文探究的主要内容。原创 2020-03-13 21:34:06 · 3189 阅读 · 2 评论 -
冰山之下:从extern C到程序链接
extern "C" 是什么?起什么作用? 它背后它和C++的改名机制有什么关系?它和ELF又有什么鲜为人知的秘密?如果你也有着同样的好奇,戳我,我将带你走进科学。不仅能学习C++,还能顺路了解ELF格式、链接器的工作原理。原创 2020-03-07 12:51:54 · 565 阅读 · 0 评论 -
交叉编译和ABI简介
本文介绍交叉编译和与之相关的Application Binary Interface的相关知识。原创 2020-03-05 16:04:27 · 1952 阅读 · 0 评论 -
就TM你叫std::forward啊?
之前介绍过std::move,今天我们就接着来说说std::forward。C++11引入了一个新特性:右值引用,这个特性可以避免不必要的拷贝从而提高性能。std::forward我们先看看std::forward是干什么的,然后说说为什么需要它。根据前文,资源高效转移的问题不是已经有std::move来解决了么,为什么还需要另外一个std::forward来参和?注意“不必要”这个词,既然...原创 2020-03-04 18:12:09 · 251 阅读 · 0 评论 -
就TM你叫std::move啊?
`std::move`的作用就是将左值转换为右值,使得可以和右值引用绑定。而引入右值引用的目的就是解决资源高效转移,免去不必要的拷贝操作。同时,还明确资源的所有权问题。方法就是移动构造函数或者移动赋值函数来实现。想了解详情,进来玩啊。原创 2020-02-28 22:54:13 · 217 阅读 · 0 评论 -
Python调用C++之PYBIND11源码分析
知其然更知其所以然。看了本文你不经能学会怎么使用pybind11去为Python编写C++扩展模块,还能知道接口背后的秘密。原创 2020-02-26 14:12:08 · 2396 阅读 · 0 评论 -
Python调用C++之PYBIND11简介
使用传统的方法去编写Python C++扩展模块日子一去不复返啦。看了这篇文章你就懂得如何更快更好的去编写Python C++扩展模块。原创 2020-02-25 18:40:41 · 4093 阅读 · 0 评论 -
GCC 命令简明教程
前言GCC,全称The GNU Compiler Collection,包含了 C, C++, Objective-C, Fortran, Ada, Go等语言的编译器前端以及这些语言所依赖的一些库文件。虽然现在的IDE基本可以搞定很多编译的事情,但是很多时候,b比如我们看源码的时候、自己编写一些Python C++扩展模块的时候等,使用IDE可能会比较繁琐,这时候就需要手动编译,需要看懂或者会...原创 2020-02-18 13:40:40 · 848 阅读 · 0 评论 -
ONNX Runtime 源码阅读:模型结点串行执行顺序的确定
概要ONNX模型中的结构是一个有向图,包含了很多节点。每个节点执行一个特定的操作,最终就得到了推理结果。ONNX模型格式标准并没有要求所有节点按照拓扑顺序来存储,进行模型解析的时候也基本不要求解析出来的节点一定要符合拓扑顺序排列。有些模型很简单,从输入到输出,可能只有一条通路;有些模型很复杂,不仅输入和输出节点间存在多条通路,还有可能存在多个输入和输出节点。ONNX Runtime 是如何确定模...原创 2020-01-17 17:22:27 · 3524 阅读 · 2 评论 -
ONNX Runtime 源码阅读:模型推理过程概览
简介ONNX Runtime是一个用于ONNX(Open Neural Network Exchange)模型推理的引擎。微软联合Facebook等在2017年搞了个深度学习以及机器学习模型的格式标准–ONNX,顺路提供了一个专门用于ONNX模型推理的引擎,onnxruntime。目前ONNX Runtime 还只能跑在HOST端,不过官网也表示,对于移动端的适配工作也在进行中。一半处于工作需...原创 2020-01-14 18:15:01 · 13810 阅读 · 6 评论 -
使用C语言编写Python模块-引子
为什么要用C语言写Python模块,是Python不够香么?还是觉得头发还茂盛?都不是。因为C语言模块有几个显而易见的好处:可以使用Python调用C标准库、系统调用等;假设已经有了一堆C代码实现的功能,可以不用重写,岂不美滋滋;性能?也算;其他一些好处。注:以下代码基于Python3。开局举个栗In a nutshell,用C编写Python模块就是下面几步:准备工作#in...原创 2019-11-07 17:14:54 · 2508 阅读 · 0 评论