置顶:将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

  1. #include <iostream>
  2.  
  3. #define CONCAT_2_EXPAND(x,y) x ## y
  4. #define show_(name) CONCAT_2_EXPAND(show_, name)
  5. // 上面两句合并成一句: #define show_(name) show_##name 都会出错!
  6.  
  7. #include "generic.h"
  8.  
  9. //real = int 类型, int 先用 real 来代表自己
  10. #define real int
  11. #line 1 GENERIC_FILE
  12. #include GENERIC_FILE
  13.  
  14. #undef real // int 用完 real 后必须 undef 掉 real,因为 double 还要用 real
  15.  
  16. //real = double 类型
  17. #define real double
  18. #line 1 GENERIC_FILE
  19. #include GENERIC_FILE
  20.  
  21. int main(){
  22. show_int(6);
  23. show_double(3.14);
  24.  
  25. system("pause");
  26. return 0;
  27. }

  

generic.h

  1. #ifndef GENERIC_FILE
  2. #define GENERIC_FILE "generic.h"
  3. #else
  4.  
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. void show_(real)(real number){
  9. cout << "real = " << number << endl;
  10. }
  11.  
  12. #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过程中可以看到如下信息:

  1. Scanning dependencies of target TH
  2. [ 5%] Building C object CMakeFiles/TH.dir/THGeneral.c.o
  3. [ 10%] Building C object CMakeFiles/TH.dir/THHalf.c.o
  4. [ 15%] Building C object CMakeFiles/TH.dir/THAllocator.c.o
  5. [ 20%] Building C object CMakeFiles/TH.dir/THSize.c.o
  6. [ 25%] Building C object CMakeFiles/TH.dir/THStorage.c.o
  7. [ 30%] Building C object CMakeFiles/TH.dir/THTensor.c.o
  8. [ 35%] Building C object CMakeFiles/TH.dir/THBlas.c.o
  9. [ 40%] Building C object CMakeFiles/TH.dir/THLapack.c.o
  10. [ 45%] Building C object CMakeFiles/TH.dir/THLogAdd.c.o
  11. [ 50%] Building C object CMakeFiles/TH.dir/THRandom.c.o
  12. [ 55%] Building C object CMakeFiles/TH.dir/THFile.c.o
  13. [ 60%] Building C object CMakeFiles/TH.dir/THDiskFile.c.o
  14. [ 65%] Building C object CMakeFiles/TH.dir/THMemoryFile.c.o
  15. [ 70%] Building C object CMakeFiles/TH.dir/THAtomic.c.o
  16. [ 75%] Building C object CMakeFiles/TH.dir/THVector.c.o
  17. [ 80%] Building C object CMakeFiles/TH.dir/generic/simd/convolve.c.o
  18. [ 85%] Building C object CMakeFiles/TH.dir/generic/simd/convolve5x5_sse.c.o
  19. [ 90%] Building C object CMakeFiles/TH.dir/vector/AVX.c.o
  20. [ 95%] Building C object CMakeFiles/TH.dir/generic/simd/convolve5x5_avx.c.o
  21. [100%] Linking C shared library libTH.so
  22. [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)的更多相关文章

  1. pytorch下的lib库 源码阅读笔记(2)

    2017年11月22日00:25:54 对lib下面的TH的大致结构基本上理解了,我阅读pytorch底层代码的目的是为了知道 python层面那个_C模块是个什么东西,底层完全黑箱的话对于理解pyt ...

  2. 源码阅读笔记 - 1 MSVC2015中的std::sort

    大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...

  3. libevent源码阅读笔记(一):libevent对epoll的封装

    title: libevent源码阅读笔记(一):libevent对epoll的封装 最近开始阅读网络库libevent的源码,阅读源码之前,大致看了张亮写的几篇博文(libevent源码深度剖析 h ...

  4. guavacache源码阅读笔记

    guavacache源码阅读笔记 官方文档: https://github.com/google/guava/wiki/CachesExplained 中文版: https://www.jianshu ...

  5. JDK1.8源码阅读笔记(1)Object类

    JDK1.8源码阅读笔记(1)Object类 ​ Object 类属于 java.lang 包,此包下的所有类在使⽤时⽆需⼿动导⼊,系统会在程序编译期间⾃动 导⼊.Object 类是所有类的基类,当⼀ ...

  6. mxnet源码阅读笔记之include

    写在前面 mxnet代码的规范性比Caffe2要好,看起来核心代码量也小很多,但由于对dmlc其它库的依赖太强,代码的独立性并不好.依赖的第三方库包括: cub dlpack dmlc-core go ...

  7. CI框架源码阅读笔记5 基准测试 BenchMark.php

    上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...

  8. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...

  9. CI框架源码阅读笔记3 全局函数Common.php

    从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...

随机推荐

  1. Java基础恶补——内存泄露、内存溢出

    http://blog.csdn.net/wisgood/article/details/16818243

  2. springcloud入门-什么是springcloud

    1.单体应用架构存在的问题 一个归档包(例如war)包含所有功能的应用程序,通常称为单体应用. 相信很多项目都是从单体应用开始的,单体应用比较容易部署和测试,项目的初期,项目可以很好的运行,然而,随着 ...

  3. GDAL源码编译(32位)

    GDAL源码编译(32位) 前言 GDAL:GDAL/OGR 是一个地理空间数据的格式转换及处理工具.官网:https://www.gdal.org/ swig:SWIG是个帮助使用C或者C++编写的 ...

  4. 笨办法29IF语句

    people = 20 cats = 30 dogs = 15 if people < cats: print "Too many cats! The world is doomed! ...

  5. SpringMvc开发报找不到springmvc配置文件

    param-name标签属性值必须为contextConfigLocation

  6. 下载EU台网(欧洲台网)的地震波数据

    retrievedata.py ### here first to check the existence of the focal mechanism event file in the NDK d ...

  7. 剑指Offer 29. 最小的K个数 (其他)

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 题目地址 https://www.nowcoder.com/prac ...

  8. 周强201771010141《面向对象程序设计(java)》第一周学习总结

    周强201771010141<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com ...

  9. 莫烦tensorflow(6)-tensorboard

    import tensorflow as tfimport numpy as np def add_layer(inputs,in_size,out_size,n_layer,activation_f ...

  10. CCF-权限查询-201612-3

    这道题,开始只有10分.....原因是将false 写成了 flase 我要吐血而亡....关键是还debug了半天,以为是逻辑错了 不过亮点是代码很简洁,网上140+的代码看着真复杂 核心: 做题之 ...