pytorch-contiguous

参考:https://zhuanlan.zhihu.com/p/64551412

PyTorch中的is_contiguous是什么含义?

is_contiguous直观的解释是Tensor底层一维数组元素的存储顺序与Tensor按行优先一维展开的元素顺序是否一致。

行优先

行是指多维数组一维展开的方式,对应的是列优先。

C/C++中使用的是行优先方式(row major)

Matlab、Fortran使用的是列优先方式(column major)

PyTorch中Tensor底层实现是C,也是使用行优先顺序。

>>> t = torch.arange(12).reshape(3,4)
>>> t
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])

pytorch-contiguous

 

 数组 t 在内存中实际以一维数组形式存储,通过 flatten 方法查看 t 的一维展开形式,实际存储形式与一维展开一致,如图2

>>> t.flatten()
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

pytorch-contiguous

 

 而列优先的存储逻辑结构如图3。

pytorch-contiguous

 

使用列优先存储时,一维数组中元素顺序如图4:

pytorch-contiguous

 

 图1、图2、图3、图4 中颜色相同的数据表示在同一行.

不论是行优先顺序、或是列优先顺序,如果要访问矩阵中的下一个元素都是通过偏移来实现,这个偏移量称为步长(stride[1])。

在行优先的存储方式下,访问行中相邻元素物理结构需要偏移1个位置,在列优先存储方式下偏移3个位置。

 

上一篇:Pytorch中的高级选择函数


下一篇:郭哥优化余弦距离代码记录