参考: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]])
数组 t 在内存中实际以一维数组形式存储,通过 flatten 方法查看 t 的一维展开形式,实际存储形式与一维展开一致,如图2
>>> t.flatten() tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
而列优先的存储逻辑结构如图3。
使用列优先存储时,一维数组中元素顺序如图4:
图1、图2、图3、图4 中颜色相同的数据表示在同一行.
不论是行优先顺序、或是列优先顺序,如果要访问矩阵中的下一个元素都是通过偏移来实现,这个偏移量称为步长(stride[1])。
在行优先的存储方式下,访问行中相邻元素物理结构需要偏移1个位置,在列优先存储方式下偏移3个位置。