0%

张量

在计算机中,张量通常被表示为多维数组。一维张量类似于向量,二维张量类似于矩阵,而高阶张量则可以有任意数量的维度。例如,一个二维张量可以被表示为一个二维数组,其中的每个元素都有两个索引,分别用来表示行和列。

winograd算法

例子
1757581407684
需要如下计算
1757581422920
r0 = d0g0 + d1g1 + d2g2 # 3次乘法+2次加法
r1 = d1
g0 + d2g1 + d3g2 # 3次乘法+2次加法
以上的计算过程总共需要 6 次乘法和 4 次加法
1757581436548
推导:
上面已经说过,如果我们直接进行矩阵乘,会得到 r0 = d0 x g0 + d1 x g1 + d2 x g2,r1 = d1 x g0 + d2 x g1 + d3 x g2 ,所以我们可以令:m1 + m2 + m3 = r0,m2 - m3 - m4 = r1。像这样:

image

先观察,两个等式中 m1、m4 是没有重复出现的,我先令 m1 = d0 x g0,m4 = -d3 x g2,这样可以约掉 m1 和 m4,所以左边只剩两个变量,两个等式两个变量即可求出 m3、m4,所以这个时候的 m1、m2、m3、m4 是这样的:

image

观察 m2 中包含了 d1、d2、g0、g1、g2,将其转换为两个多项式乘积形式,拆成 d 和 g 分开的形式,如下:

image

同理,对 m3 也进行如上转换,完了之后现在的 m1、m2、m3、m4 是这样的:

image

这个时候让我们回到最开始的等价关系,进行观察,要是我在 m2、m3 上同时加上一个值,对于式 (b) 来说是不变的(所以 m4 不用动),对于式 (a) 来说需要给 m1 减去两倍的这个值。

image

观察现在的 m1、m2、m3、m4,当这个值是 (d2g0) / 2 时可以简化表达式,所以这样给上面等式进行等价变换后得到的 m1、m2、m3、m4 如下:

image

继续如上操作,如果给 m2 加上一个值,同时给 m3 减去这个值,那么对于式 (a) 来说是不变的 (所以 m1 不用动),对于式 (b) 来说需要给 m4 减去两倍的这个值才能等价。同样观察现在的 m1、m2、m3、m4,当这个值为 (d1g2) / 2 时可以进一步简化表达式,接着作这样的变换后得到最终的 m1、m2、m3、m4,如下:

image

稀疏矩阵乘

压缩

压缩稀疏行
1757581450698
V = [ 10 20 30 40 50 60 70 80 ]
COL_INDEX = [ 0 1 1 3 2 3 4 5 ]
ROW_INDEX = [ 0 2 4 7 8 ]
压缩稀疏列
对角线压缩
对角线压缩利用了稀疏矩阵中对角线上大量为零的特点。它只存储对角线上的非零元素及其对应的行列索引,并将其他位置的元素设为零。这种方法适用于矩阵对角线上非零元素占比较大的情况。
块压缩
块压缩将稀疏矩阵分成多个块,只存储每个块中的非零元素及其对应的行列索引。这种方法适用于稀疏矩阵中非零元素分布比较均匀的情况,可以进一步减少存储空间

BCSR
BCSR是对CSR的一般化和改进,它和CSR的区别在于把原矩阵分成了大小相同的block,block中的空元素则用0填上,于是每一个block都是稠密的,所以val数组会变大一些(需要填充一些0),但是索引却简化了,这里的精髓在于每一个块内部可以直接进行稠密的矩阵向量乘法

1757581461010

1757581450698

张量

在计算机中,张量通常被表示为多维数组。一维张量类似于向量,二维张量类似于矩阵,而高阶张量则可以有任意数量的维度。例如,一个二维张量可以被表示为一个二维数组,其中的每个元素都有两个索引,分别用来表示行和列。

winograd算法

例子
1757581407684
需要如下计算
1757581422920
r0 = d0g0 + d1g1 + d2g2 # 3次乘法+2次加法
r1 = d1
g0 + d2g1 + d3g2 # 3次乘法+2次加法
以上的计算过程总共需要 6 次乘法和 4 次加法
1757581436548
推导:
上面已经说过,如果我们直接进行矩阵乘,会得到 r0 = d0 x g0 + d1 x g1 + d2 x g2,r1 = d1 x g0 + d2 x g1 + d3 x g2 ,所以我们可以令:m1 + m2 + m3 = r0,m2 - m3 - m4 = r1。像这样:

image

先观察,两个等式中 m1、m4 是没有重复出现的,我先令 m1 = d0 x g0,m4 = -d3 x g2,这样可以约掉 m1 和 m4,所以左边只剩两个变量,两个等式两个变量即可求出 m3、m4,所以这个时候的 m1、m2、m3、m4 是这样的:

image

观察 m2 中包含了 d1、d2、g0、g1、g2,将其转换为两个多项式乘积形式,拆成 d 和 g 分开的形式,如下:

image

同理,对 m3 也进行如上转换,完了之后现在的 m1、m2、m3、m4 是这样的:

image

这个时候让我们回到最开始的等价关系,进行观察,要是我在 m2、m3 上同时加上一个值,对于式 (b) 来说是不变的(所以 m4 不用动),对于式 (a) 来说需要给 m1 减去两倍的这个值。

image

观察现在的 m1、m2、m3、m4,当这个值是 (d2g0) / 2 时可以简化表达式,所以这样给上面等式进行等价变换后得到的 m1、m2、m3、m4 如下:

image

继续如上操作,如果给 m2 加上一个值,同时给 m3 减去这个值,那么对于式 (a) 来说是不变的 (所以 m1 不用动),对于式 (b) 来说需要给 m4 减去两倍的这个值才能等价。同样观察现在的 m1、m2、m3、m4,当这个值为 (d1g2) / 2 时可以进一步简化表达式,接着作这样的变换后得到最终的 m1、m2、m3、m4,如下:

image

稀疏矩阵乘

压缩

压缩稀疏行
1757581450698
V = [ 10 20 30 40 50 60 70 80 ]
COL_INDEX = [ 0 1 1 3 2 3 4 5 ]
ROW_INDEX = [ 0 2 4 7 8 ]
压缩稀疏列
对角线压缩
对角线压缩利用了稀疏矩阵中对角线上大量为零的特点。它只存储对角线上的非零元素及其对应的行列索引,并将其他位置的元素设为零。这种方法适用于矩阵对角线上非零元素占比较大的情况。
块压缩
块压缩将稀疏矩阵分成多个块,只存储每个块中的非零元素及其对应的行列索引。这种方法适用于稀疏矩阵中非零元素分布比较均匀的情况,可以进一步减少存储空间

BCSR
BCSR是对CSR的一般化和改进,它和CSR的区别在于把原矩阵分成了大小相同的block,block中的空元素则用0填上,于是每一个block都是稠密的,所以val数组会变大一些(需要填充一些0),但是索引却简化了,这里的精髓在于每一个块内部可以直接进行稠密的矩阵向量乘法
1757581461010

张量

在计算机中,张量通常被表示为多维数组。一维张量类似于向量,二维张量类似于矩阵,而高阶张量则可以有任意数量的维度。例如,一个二维张量可以被表示为一个二维数组,其中的每个元素都有两个索引,分别用来表示行和列。

winograd算法

例子

1757581407684