#为什么考完了还有这么多事#
GPU最大的特点是它拥有超多计算核心,往往成千上万核。而每个核心都可以模拟一个CPU的计算功能,虽然单个GPU核心的计算能力一般低于CPU。对于GPU并行计算,缓存对程序员不透明,程序员可根据实际情况操纵大部分缓存。采用 SIMT - 单指令多线程模型,一条指令配备一组硬件,对应32个线程 。
GPU最大的特点是它拥有超多计算核心,往往成千上万核。而每个核心都可以模拟一个CPU的计算功能,虽然单个GPU核心的计算能力一般低于CPU。对于GPU并行计算,缓存对程序员不透明,程序员可根据实际情况操纵大部分缓存。采用 SIMT - 单指令多线程模型,一条指令配备一组硬件,对应32个线程 。
硬件和DNN处理
拓普利兹矩阵的应用
A. 在CPU和GPU平台上加速卷积核计算
CPU和GPU使用并行化技术如SIMD或SIMT并行地执行MAC(multiply-and-accumulate)。所有ALU共享相同的控制和内存(寄存器文件)。在这些平台上,FC层和CONV层一般都映射到矩阵乘法(卷积核或滤波器计算)。附件1(标注为图18)显示FC层如何使用矩阵乘法。滤波器矩阵的高度为滤波器个数,宽度为每个滤波器的权值个数(输入通道(C) × 宽度(W) × 高度(H),因为FC层R=W, S=H);输入特征图矩阵的高度为每个输入特征图的激活次数(C × W × H),宽度是输入特征图的个数(图18(a)为1,图18(b)为N);最后,输出特征图矩阵的高度是输出特征图中的通道数(M)、宽度是输出特征图的个数(N),其中FC层的每一个输出特征图的维数为1×1×输出通道数(M)。
DNN中的的CONV层能采用附件2所示的托普利茨矩阵的松弛形式映射到矩阵乘法中。对于CONV层使用矩阵乘法的缺点是: 输入特征图矩阵中存在冗余数据,如附件2(图19(a))所示。这可能导致存储效率低下或导致复杂的内存访问模式。
有一些为CPU(如Open-BLAS、Intel MKL等)和GPU(如cuBLAS、cuDNN等)设计的软件库,其优化用于矩阵乘法。矩阵乘法被平铺到这些平台的存储层次结构中,在更高级别上,这些存储层次结构的大小约为几兆字节。
通过对数据应用计算变换来减少乘法次数,同时仍然给出相同的逐位结果,我们进一步加快这些平台上的矩阵乘法。这可能会增加添加次数和更不规则的数据访问模式。
快速傅里叶变换(FFT)[10,74]是一种流行的方法,如附件2所示,它减少从O(N^2 x Nf^2)到O(N^2 log2 N)的乘法次数,其中输出大小为N × N和滤波器尺寸是Nf×Nf。为执行卷积,我们采用滤波器的FFT快速傅里叶变换和输入特征映射,然后在频域中执行乘法;接着得到的积应用逆FFT以恢复空间域中的输出特征映射。然而使用FFT有几个缺点:
(1) FFT的优势随滤波器尺寸的增加而减小;
(2) FFT的大小由输出特征图的尺寸决定,输出特征图的尺寸通常比滤波器大得多;
(3) 频域中的系数是复杂的。
虽然FFT减少计算,但是它需要更大的存储容量和带宽。降低复杂性的一种流行方法是使权重稀疏,这在第VII-B2节中讨论;使用FFT会使这种稀疏性难以被利用。
我们能对FFT执行若干优化以使其对DNN更有效。为减少操作次数,可预先计算和存储滤波器的FFT。此外,输入特征图的FFT可计算一次并用于在输出特征图中生成多个通道。由于图像仅包含实数值,因此其傅立叶变换是对称的且能利用它降低存储和计算开销。
其它方法包括Strassen和Winograd,它们重新排列计算,使乘法的数量分别从O(N^3)减少到O(N^2.807),对于3×3滤波器减少2.25倍,降低数值稳定性,增加存储要求和专门处理的开销取决于过滤器的大小。
在实践中,不同算法能用于不同的层形状和大小(例如对于大于5×5的滤波器的FFT以及对于3×3和更低的滤波器的Winograd)。现有的平台库如MKL和cuDNN为给定的形状和大小动态选择合适的算法[77,78]
备注:
拓普利兹矩阵(Toeplitz)是指矩阵中每条自左上到右下的斜线上的元素相同,形如附件中的矩阵(不必是方阵);对于方阵的情形,它可描述为:任一条平行于主对角线的直线上的元素相同。matlab中生成托普利兹矩阵的函数是toeplitz(x,y),它生成一个以x为第一列,y为第一行的托普利兹矩阵。这里x, y均为向量,两者不必等长。toeplitz(x)用向量x生成一个对称的拓普利兹矩阵。
拓普利兹矩阵的应用
A. 在CPU和GPU平台上加速卷积核计算
CPU和GPU使用并行化技术如SIMD或SIMT并行地执行MAC(multiply-and-accumulate)。所有ALU共享相同的控制和内存(寄存器文件)。在这些平台上,FC层和CONV层一般都映射到矩阵乘法(卷积核或滤波器计算)。附件1(标注为图18)显示FC层如何使用矩阵乘法。滤波器矩阵的高度为滤波器个数,宽度为每个滤波器的权值个数(输入通道(C) × 宽度(W) × 高度(H),因为FC层R=W, S=H);输入特征图矩阵的高度为每个输入特征图的激活次数(C × W × H),宽度是输入特征图的个数(图18(a)为1,图18(b)为N);最后,输出特征图矩阵的高度是输出特征图中的通道数(M)、宽度是输出特征图的个数(N),其中FC层的每一个输出特征图的维数为1×1×输出通道数(M)。
DNN中的的CONV层能采用附件2所示的托普利茨矩阵的松弛形式映射到矩阵乘法中。对于CONV层使用矩阵乘法的缺点是: 输入特征图矩阵中存在冗余数据,如附件2(图19(a))所示。这可能导致存储效率低下或导致复杂的内存访问模式。
有一些为CPU(如Open-BLAS、Intel MKL等)和GPU(如cuBLAS、cuDNN等)设计的软件库,其优化用于矩阵乘法。矩阵乘法被平铺到这些平台的存储层次结构中,在更高级别上,这些存储层次结构的大小约为几兆字节。
通过对数据应用计算变换来减少乘法次数,同时仍然给出相同的逐位结果,我们进一步加快这些平台上的矩阵乘法。这可能会增加添加次数和更不规则的数据访问模式。
快速傅里叶变换(FFT)[10,74]是一种流行的方法,如附件2所示,它减少从O(N^2 x Nf^2)到O(N^2 log2 N)的乘法次数,其中输出大小为N × N和滤波器尺寸是Nf×Nf。为执行卷积,我们采用滤波器的FFT快速傅里叶变换和输入特征映射,然后在频域中执行乘法;接着得到的积应用逆FFT以恢复空间域中的输出特征映射。然而使用FFT有几个缺点:
(1) FFT的优势随滤波器尺寸的增加而减小;
(2) FFT的大小由输出特征图的尺寸决定,输出特征图的尺寸通常比滤波器大得多;
(3) 频域中的系数是复杂的。
虽然FFT减少计算,但是它需要更大的存储容量和带宽。降低复杂性的一种流行方法是使权重稀疏,这在第VII-B2节中讨论;使用FFT会使这种稀疏性难以被利用。
我们能对FFT执行若干优化以使其对DNN更有效。为减少操作次数,可预先计算和存储滤波器的FFT。此外,输入特征图的FFT可计算一次并用于在输出特征图中生成多个通道。由于图像仅包含实数值,因此其傅立叶变换是对称的且能利用它降低存储和计算开销。
其它方法包括Strassen和Winograd,它们重新排列计算,使乘法的数量分别从O(N^3)减少到O(N^2.807),对于3×3滤波器减少2.25倍,降低数值稳定性,增加存储要求和专门处理的开销取决于过滤器的大小。
在实践中,不同算法能用于不同的层形状和大小(例如对于大于5×5的滤波器的FFT以及对于3×3和更低的滤波器的Winograd)。现有的平台库如MKL和cuDNN为给定的形状和大小动态选择合适的算法[77,78]
备注:
拓普利兹矩阵(Toeplitz)是指矩阵中每条自左上到右下的斜线上的元素相同,形如附件中的矩阵(不必是方阵);对于方阵的情形,它可描述为:任一条平行于主对角线的直线上的元素相同。matlab中生成托普利兹矩阵的函数是toeplitz(x,y),它生成一个以x为第一列,y为第一行的托普利兹矩阵。这里x, y均为向量,两者不必等长。toeplitz(x)用向量x生成一个对称的拓普利兹矩阵。
SIMt7kgXl9AwTVi68#元气爱豆的日常##爱豆能量月#
074
人人都有弱点,不能成大事的人总是固守着自我的弱点,一生很难有转变。而一个能成大事的人总会寻找自我的弱点,从自我的弱点上开刀。冲破弱点。
刘彰壁纸/刘彰数据/刘彰工作室/刘彰吃饱了不想动/刘彰说自拍好难/刘彰分享对镜自拍/AK刘彰原创diss破千万
074
人人都有弱点,不能成大事的人总是固守着自我的弱点,一生很难有转变。而一个能成大事的人总会寻找自我的弱点,从自我的弱点上开刀。冲破弱点。
刘彰壁纸/刘彰数据/刘彰工作室/刘彰吃饱了不想动/刘彰说自拍好难/刘彰分享对镜自拍/AK刘彰原创diss破千万
✋热门推荐