特别说明,本文大多思路和解释都源于:
[1] PyTorch源码浅析(一)
[2] PyTorch源码浅析(二)
[3] tiny_lib

TensorApply系列的宏函数是TH实现各种张量元素操作最重要的操作,它们负责把一个针对某些标量的操作应用到多个张量元素上去。在GPU部分是相当于一个map的操作。大致方法是优先去操作内存连续部分,然后再操作不连续的部分,以增加CPU cache命中率。

/*
1. 先从下标最外层的维度开始循环,因为按照stride和size的计算公式,最外层的维度步长肯定是1
然后往里面的维度check是否内存一直连续,一直找到不连续的地方,称这个外层的tensor为A,它是连续的,
步长为1。我们把里面剩下的几个维度称为Tensor B,我们把Tensor A一整个看成Tensor B中的一个元素,
Tensor B由一个又一个A组成2. 然后我们开始从最里面的维度循环Tensor B,每次从Tensor B中取得的元素,都是一个连续的A,然后
连续内存操作,会有预取,命中率很高)。
例子:
连续的内存 size 3,4  stride 4,1
1 2 3 4
5 6 7 8
其中一个Tensor是 size 2,2 stride 4,1
2 3 4
6 7 8
先从最外层维度走起,发现第1个维度是连续的,第0个维度不连续了(根据前面讲过的size和stride的计算公式验证)
最外层第1个维度的Tensor就是A,里面第0个维度的Tensor就是B,B中两个元素,即2个A。每次取出一个最长连续
的内存A进行操作,取两次。
就这两个宏
获取Tensor的内存分布情况及相关信息stride size等
#define __TH_TENSOR_APPLYX_PREAMBLE(TYPE, TENSOR, DIM, ALLOW_CONTIGUOUS)
更新地址到新的一段连续内存上
#define  __TH_TENSOR_APPLYX_UPDATE_COUNTERS(TENSOR, ALWAYS_UPDATE)
*/
// ##########################################################
/** The basic strategy for apply is as follows:** 1. Starting with the outermost index, loop until we reach a dimension where the* data is no longer contiguous, i.e. the stride at that dimension is not equal to* the size of the tensor defined by the outer dimensions. Let's call this outer* (contiguous) tensor A. Note that if the Tensor is contiguous, then A is equal* to the entire Tensor. Let's call the inner tensor B.** 2. We loop through the indices in B, starting at its outermost dimension. For* example, if B is a 2x2 matrix, then we do:** B[0][0]* B[0][1]* B[1][0]* B[1][1]** We set the offset into the underlying storage as (storageOffset + stride_B * index_B),* i.e. basically we compute the offset into the storage as we would normally for a* Tensor. But because we are guaranteed the subsequent data is contiguous in memory, we* can simply loop for sizeof(A) iterations and perform the operation, without having to* follow the order described by the strides of A.** 3. As an optimization, we merge dimensions of A that are contiguous in memory. For* example, if A is a 3x3x3x3 tensor narrowed from a 3x3x4x3 tensor, then the first two* dimensions can be merged for the purposes of APPLY, reducing the number of nested* loops.*/

TH库学习(二): THTensorApply宏观理解(简化)相关推荐

  1. Echarts开源可视化库学习(二)常用图表的实现与效果

    一.柱状图 一.Echarts最基本的代码结构 <!DOCTYPE html> <html lang="en"><head><meta c ...

  2. Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

    2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...

  3. TLD(Tracking-Learning-Detection)学习与源码理解之(二)

    TLD(Tracking-Learning-Detection)学习与源码理解之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 OpenTLD下载与编译 ...

  4. 从零开始编写深度学习库(二)FullyconnecteLayer CPU编写

    从零开始编写深度学习库(二)FullyconnecteLayer CPU编写 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 ...

  5. 【Vue学习】—Vue UI组件库(二十八)

    [Vue学习]-Vue UI组件库(二十八) 一.移动端常用的UI组件库 二.PC端常用的UI组件库 三.具体使用自行查看文档,这里就不做概述了

  6. Git学习二、GitLab官网,安装自己的一个私有Gitlab代码管理库

    Git学习一.TortoiseGit 安装后,文件夹前面不显示相关状态图标解决办法 Git学习二.GitLab官网,安装自己的一个私有Gitlab代码管理库 Git学习三.Git与SVN的差异,Git ...

  7. Huggingface Transformers库学习笔记(二):使用Transformers(上)(Using Transformers Part 1)

    前言 本部分是Transformer库的基础部分的上半部分,主要包括任务汇总.模型汇总和数据预处理三方面内容,由于许多模型我也不太了解,所以多为机器翻译得到,错误再所难免,内容仅供参考. Huggin ...

  8. CMakeLists学习二、链接库搜索路径与ld

    CMakeLists学习二.链接库搜索路径与ld 前言 gcc的链接 gcc链接命令 ld搜索路径 ldconfig刷新动态库缓存 CMakeLists指定链接搜索路径 后记 前言 本文继续CMake ...

  9. [pytorch] PyTorch Metric Learning库代码学习二 Inference

    PyTorch Metric Learning库代码学习二 Inference Install the packages Import the packages Create helper funct ...

最新文章

  1. “三板斧”式文化价值体系互助协作,打通企业全流程管理模式
  2. 搜狗研究员:详解基于深度学习的语音分离
  3. MySQL 优化实战记录
  4. oracle clob raw 转换,ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小...
  5. Python数据类型——整型、布尔型、列表、元祖、字典
  6. Deep learning:五(regularized线性回归练习)
  7. ISA Best Practices Analyzer Tool
  8. 如何自学java迅速成为java高手
  9. python入门神图
  10. 家用计算机的辐射,计算机辐射有多大?
  11. Spring Cloud 是什么
  12. 版本控制系统相关知识
  13. python豆瓣Top250数据分析
  14. iOS13 Scene Delegate详解
  15. M2M、物联网应用开发的好助手——Wavecom Sierra 无线MODEM( GSM/GPRS/EDGE MODEM)
  16. centos7 安装hashcat
  17. html 正方形字符,HTML常用标签以及特殊符号
  18. Python通过人脸识别全面分析好友,一起看透你的“朋友圈”!
  19. SonicWALL如何配置BGP
  20. Google2mapinfo的完美转换

热门文章

  1. Java Comparator源码总结 Comparator源码注释翻译和解析中英文对照版
  2. 7个带有示例的CSS网格布局实例
  3. 苹果应用雷达提供对苹果App Store排名的宏观分析服务
  4. Python 的 re 模块
  5. 使用js对表格数据排序
  6. 华为手机里的计算机有什么功能是什么,多少人因为华为手机EMUI的这个独有功能,选择了华为电脑?...
  7. 微信邮件怎么设置自动回复,你了解吗?
  8. MATLAB cvx错误汇总,cvx错误解决,cvx知识点总结,cvx编程技巧
  9. 山东省首版次高端软件申报工作的通知
  10. 图解 HTTP 的缓存机制 | 实用 HTTP