pytorch下的lib库 源码阅读笔记(1)
置顶:将pytorch clone到本地,查看initial commit,已经是麻雀虽小五脏俱全了,非常适合作为学习模板。
2017年12月7日01:24:15
2017-10-25 17:51
参考了知乎问题 如何有效地阅读PyTorch的源代码? 相关回答
按照构建顺序来阅读代码是很聪明的方法。
1,TH中最核心的是THStorage、THTensor,
THStorage实现了底层数据(其实就是一个数组),
THTensor实现了对底层数据的查看。
2,TH: 核心就THStorage与THTensor,辅助有 THGeneral、THHalf、THAllocator、THSize
2017-11-14 02:56
看了这么久,终于知道TH的头在哪里了。该有的预备知识也差不多都具备了,接下来准备一边继续深入
研究TH,一边记笔记。TH看懂了,THNN也是差不多立马能读懂的,再加上一个ATen或类似的东西,就可以
在C/C++层面构建神经网络了。
2017年11月15日01:35:54
pytorch的主要维护者之一的 Adam Paszke 有一篇 A quick tour of Torch internals 的文章。里头大概讲了下
TH的结构。TH用 C 模拟了泛型编程。今天抽丝剥茧,写了一个只包含2个文件的极度简单的演示程序:
main.cpp
#include <iostream> #define CONCAT_2_EXPAND(x,y) x ## y
#define show_(name) CONCAT_2_EXPAND(show_, name)
// 上面两句合并成一句: #define show_(name) show_##name 都会出错! #include "generic.h" //real = int 类型, int 先用 real 来代表自己
#define real int
#line 1 GENERIC_FILE
#include GENERIC_FILE #undef real // int 用完 real 后必须 undef 掉 real,因为 double 还要用 real //real = double 类型
#define real double
#line 1 GENERIC_FILE
#include GENERIC_FILE int main(){
show_int(6);
show_double(3.14); system("pause");
return 0;
}
generic.h
#ifndef GENERIC_FILE
#define GENERIC_FILE "generic.h"
#else #include <iostream>
using namespace std; void show_(real)(real number){
cout << "real = " << number << endl;
} #endif
注释:
#line number "string"
它通知预处理器从下一行的行号被重新设定为 number 所代表的数字。如果给出了可选部分"string",预处理器就把它作为当前文件的名字。这条指令将修改__LINE__符号的值,如果加上可选部分,还将修改__FILE__符号的值。
两个文件的功能是显示 int 和 double 两种不同类型的数。已经实现了泛型编程。
#define、#undef、#line 1 GENERIC_FILE 三者的组合运用真是绝妙的用法。
预编译完后代码膨胀成包含 show_int() 和 show_double() 两个函数的文件了。其实在 C和指针 这本书的 17.5.4节也提到过用C模拟泛型编程的一些技巧。可以参看。用C实现泛型,使用者需要遵循一定的命名规则。
2017年11月18日20:09:10
将函数的泛型实现从 generic.h 中分离到单独的 generic.c 文件中去了,代码在这:generic_in_c
文件结构及编译过程比较巧妙。
TH在make过程中可以看到如下信息:
Scanning dependencies of target TH
[ 5%] Building C object CMakeFiles/TH.dir/THGeneral.c.o
[ 10%] Building C object CMakeFiles/TH.dir/THHalf.c.o
[ 15%] Building C object CMakeFiles/TH.dir/THAllocator.c.o
[ 20%] Building C object CMakeFiles/TH.dir/THSize.c.o
[ 25%] Building C object CMakeFiles/TH.dir/THStorage.c.o
[ 30%] Building C object CMakeFiles/TH.dir/THTensor.c.o
[ 35%] Building C object CMakeFiles/TH.dir/THBlas.c.o
[ 40%] Building C object CMakeFiles/TH.dir/THLapack.c.o
[ 45%] Building C object CMakeFiles/TH.dir/THLogAdd.c.o
[ 50%] Building C object CMakeFiles/TH.dir/THRandom.c.o
[ 55%] Building C object CMakeFiles/TH.dir/THFile.c.o
[ 60%] Building C object CMakeFiles/TH.dir/THDiskFile.c.o
[ 65%] Building C object CMakeFiles/TH.dir/THMemoryFile.c.o
[ 70%] Building C object CMakeFiles/TH.dir/THAtomic.c.o
[ 75%] Building C object CMakeFiles/TH.dir/THVector.c.o
[ 80%] Building C object CMakeFiles/TH.dir/generic/simd/convolve.c.o
[ 85%] Building C object CMakeFiles/TH.dir/generic/simd/convolve5x5_sse.c.o
[ 90%] Building C object CMakeFiles/TH.dir/vector/AVX.c.o
[ 95%] Building C object CMakeFiles/TH.dir/generic/simd/convolve5x5_avx.c.o
[100%] Linking C shared library libTH.so
[100%] Built target TH
逆着这个顺序来,一边删除功能一边编译可以了解TH的结构。
THStorage应该是TH最基本的功能了。是先实现storage,再实现tensor及相关功能,再实现file功能。
lapack、blas、simd等从cmakelists来看都是可选的。
storage和allocator紧密关联。THGeneral.c中大部分是实现内存管理的东西。
查看预编译后的代码可以看到总共有8种类型的storage: inttypes 5种 + floattypes 2种 + half类型
预编译展开 TH.h 可以看到所有的函数声明。
pytorch下的lib库 源码阅读笔记(1)的更多相关文章
- pytorch下的lib库 源码阅读笔记(2)
2017年11月22日00:25:54 对lib下面的TH的大致结构基本上理解了,我阅读pytorch底层代码的目的是为了知道 python层面那个_C模块是个什么东西,底层完全黑箱的话对于理解pyt ...
- 源码阅读笔记 - 1 MSVC2015中的std::sort
大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
- libevent源码阅读笔记(一):libevent对epoll的封装
title: libevent源码阅读笔记(一):libevent对epoll的封装 最近开始阅读网络库libevent的源码,阅读源码之前,大致看了张亮写的几篇博文(libevent源码深度剖析 h ...
- guavacache源码阅读笔记
guavacache源码阅读笔记 官方文档: https://github.com/google/guava/wiki/CachesExplained 中文版: https://www.jianshu ...
- JDK1.8源码阅读笔记(1)Object类
JDK1.8源码阅读笔记(1)Object类 Object 类属于 java.lang 包,此包下的所有类在使⽤时⽆需⼿动导⼊,系统会在程序编译期间⾃动 导⼊.Object 类是所有类的基类,当⼀ ...
- mxnet源码阅读笔记之include
写在前面 mxnet代码的规范性比Caffe2要好,看起来核心代码量也小很多,但由于对dmlc其它库的依赖太强,代码的独立性并不好.依赖的第三方库包括: cub dlpack dmlc-core go ...
- CI框架源码阅读笔记5 基准测试 BenchMark.php
上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...
- CI框架源码阅读笔记3 全局函数Common.php
从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...
随机推荐
- nginx upstream的五种分配方式
Nginx负载均衡选项upstream用法举例 1.轮询(weight=1) 默认选项,当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器d ...
- 斜率优化dp的总结
放在了我的另一个博客上面 斜率优化dp的总结(多刷新几次才打得开)
- 基于FastJson的通用泛型解决方案
由于项目使用的是fastjson,也无法换成其他的序列化框架,所以研究了一下他对泛型序列化和反序列化的支持能力,最终解决了这个问题. 要达成的目标 我的封装方式属于通用封装,我要达到的目标是如下的使用 ...
- 【问题】用ant编译时,提示编码utf为不可映射字符
分析:eclipse默认的编码为gbk,而ant里的build.xml文件里定义的为utf-8格式.两者格式不统一. 建议:将工程的编码改成utf-8的格式,一般java工程也建议为utf-8格式.
- 除了Udacity,全球最聪明的那群人还上哪些网站?
01. ***,与世界相连 WikiWand——打开维基百科的新方式 http://www.wikiwand.com/ InsightfulQuestions(subreddit)——跨越界限的智力讨 ...
- python项目运行环境安装小结
安装最新即可,实际的版本号可能不一样 安装过程较复杂,建议用一台单独的vm安装,能做成docker image最好 基础软件 nginx-1.10.0: sudo apt-get install ng ...
- 第一章03 java 开发环境搭建
1. 首先,搭配java开发环境,安装(jdk:java 开发工具包) 2.安装下载:输入www.oracle.com.cn/indek.html (cn代表中文) 3.测试安装是否成功 (1)wi ...
- GetSystemInfo 和 GlobalMemoryStatus获取系统信息,内存信息
// GetSystemInfo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #in ...
- RN环境的搭建
RN技术详细了解: RN环境的搭建: 1. 首先安装node.js 2. 安装homebrew(网上内容很多自己找,详细的我就不多说了) (1) 在home ...
- 网络性能测试工具-Iperf
一.简单介绍 Iperf是一个网络性能测试工具,Iperf可以测试TCP和UDP带宽质量,Iperf可以测量最大TCP带宽,具有多种参数和UDP特性.Iperf可以报告带宽,延迟抖动和数据包丢失.利用 ...