torch THTensorApply.h关于Tensor计算

1、首先有必要了解一下c语言的数组存储格式问题。c存储
2、然后有必要了解一下访问数组
c底层对于数组的访问会查看内存存储的地方是否连续,将对连续的进行集中访问,节省时间。判断内存数组的是否连续是通过stride和size两个参数来确定的。
对于数组a,b,a是从b中拿出来的。
a[3][3][3][3][3][2][3] —> stride={1296, 432, 144, 36, 12, 3, 1} size = {3,3,3,3,3,2,3}
b[3][3][3][4][3][4][3] —> stride={1296, 432, 144, 36, 12, 3, 1} size = {3,3,3,4,3,4,3}

发现中间有连个地方断了,就是b对应的两个4的index的地方,c语言中的数组存储都是一维形式存储的,可见第一个链接,但是a和b还是同一块内存,只不过中间有些地方a是空的。这就造成了a不连续,对于不连续的数组的访问,torch的c底层是从分块的角度来处理的。例如上面的a,会将它前面的三维,中间的两维,和后面的两维分别合并,造成

1 2 3 4
0 0 0 counter
27 9 6 sizes
144 12 1 strides

这个表格描述的就是对于数组的内存分配方式,对于数组a,在[2]处断了一下,多以[2][3]作为一组,对于中间的[3][3]作为一组,前面的[3][3][3]作为第一组,但是stride依然是按照b的方式来计算的,这个和内存中存储数组机制是一样的,一定是一维存储的。
以最后的三维来描述
000 001 002 010 011 012 x x x x x x 100 101 102 110 111 112 x x x x x x 200 201 202 210 211 212 x x x x x x
最后访问的时候会访问不打x的地方,在链接2中有关于内存数组访问方式的介绍,怎么做到高效访问的,而THTensorApply文件采用的原理是类似的。就是将连续的维度merge在一起,降低inner loop的次数

猜你喜欢

转载自blog.csdn.net/u013548568/article/details/79657283