矩阵与矩阵的乘法的意义
矩阵与矩阵的乘法可以从矩阵与向量的乘法得到,因为一个矩阵与多个向量相乘,这多个向量就可以组成一个矩阵(会有些限制)。或者说,矩阵本身就是一个有排列顺序要求的向量组,所以矩阵与矩阵相乘可以看作矩阵乘以列向量(或者行向量乘以矩阵的)的组合。例如:
如果把列向量 c和
d可以组合成一个矩阵
B=
(c,d),那么上述的乘积可以用两个矩阵的乘积来表示:
当然,如果有更多的向量组合起来,可以形成这样的矩阵乘式:
类似的,通过向量乘以矩阵的定义,我们同样可以定义反顺序的矩阵乘式,这里向量为行向量:
因此,矩阵与矩阵的相乘的几何意义,可以从矩阵与多个向量相乘的几何意义得到,只是多个向量被按照顺序组合成了另一个矩阵。
矩阵乘以矩阵如 AB=
C的一般几何意义就是把其中一个矩阵如B的数个行向量或列向量构成的几何图形进行旋转、缩放、镜像等变换(另外一个矩阵A起到的作用)得到了数个新向量,这些新向量作为行向量或者列向量组成一个新的矩阵C,这个新矩阵
C会构成新的几何图形。对于下面的乘式:
我们给出具体的数据例子并画出这个变换的图形:
一片绿色的小枫叶,经过夏天的风雨洗礼的自然变换,终于成了一片红彤彤的大枫叶。
其实,两个矩阵相乘,主要是考察一个矩阵对另一个矩阵所起的变 换作用。其作用的矩阵看作是动作矩阵,被作用的矩阵可以看作是由行或列向量构成的几何图形。这个 理解就是上面给出的几何解释。
//————————————————————我是分割线——————————————————————————————————
这就是一个立方体。显示出一个这样的立方体要经过好多步骤,我们先考虑简单的,想象一下他是个线框。再简化一点,连线都没有,就是八个点(立方体有八个顶点的)。那么问题就简化成如何让这八个点转起来。首先,你在创造这个立方体的时候,肯定有八个顶点的坐标,坐标都是用向量表示的,因而至少也是个三维向量。然后“旋转”这个变换,在线性代数里面是用一个矩阵来表示的。向量旋转,是用向量乘以这个矩阵。经过上面的矩阵乘法说明,我相信大家都不难懂的。把这八个点转一下,就是进行八次向量与矩阵的乘法而已。这种计算并不复杂,拆开来看无非就是几次乘积加一起,就是计算量比较大。八个点就要算八次,2000个点就要算2000次。这就是GPU工作的一部分,顶点变换,这也是最简单的一部分。剩下还有一大堆比这更麻烦的就不说了。
GPU的工作大部分就是这样,计算量大,但没什么技术含量,而且要重复很多很多次。就像你有个工作需要算几亿次一百以内加减乘除一样,最好的办法就是雇上几十个小学生一起算,一人算一部分,反正这些计算也没什么技术含量,纯粹体力活而已。而CPU就像老教授,积分微分都会算,就是工资高,一个老教授资顶二十个小学生,你要是富士康你雇哪个?GPU就是这样,用很多简单的计算单元去完成大量的计算任务,纯粹的人海战术。这种策略基于一个前提,就是小学生A和小学生B的工作没有什么依赖性,是互相独立的。很多涉及到大量计算的问题基本都有这种特性,比如你说的破解密码,挖矿和很多图形学的计算。这些计算可以分解为多个相同的简单小任务,每个任务就可以分给一个小学生去做。但还有一些任务涉及到“流”的问题。比如你去相亲,双方看着顺眼才能继续发展。总不能你这边还没见面呢,那边找人把证都给领了。这种比较复杂的问题都是CPU来做的。
图片来自nVidia CUDA文档。其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。图片来自nVidia CUDA文档。其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。
GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间,而且还有有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分。
所以与CPU擅长逻辑控制和通用类型数据运算不同,GPU擅长的是大规模并发计算,这也正是密码破解等所需要的。所以GPU除了图像处理,也越来越多的参与到计算当中来。
//——————————————————————————————我是分割线————————————————————————————————————
GPU将晶体管用于处理器阵列、多线程管理、共享内存、内存控制器;
这些设计并不着眼于提高单一线程的执行速度,而是为了使GPU可以同时执行成千上万的线程;(而CPU出于时间片调度则不行,N个核同一瞬间只能执行N个线程,至于是否执行同一个进程的子线程因为OS调度的不同而有一定区别。N个CPU同一瞬间只能执行N条进程...PS:这个有机会等开操作系统篇章的时候也会详细扯一下)
实现线程间通信,并提供极高的内存带宽;
GPU使用cache来放大内存带宽;
GPU通过同时运行上千个线程来隐藏延迟,等待内存访问的线程会被切换掉,GPU切换线程不耗时间;
对于支持CUDA的GPU,每个流处理器可以同时处理1024个线程;
GPU切换线程的代价是0,事实上GPU通常每个时钟周期都切换线程;
GPU则使用SIMT(单指令多线程),SIMT的好处是无需开发者费力把数据凑成合适的矢量长度,并且SIMT允许每个线程有不同的分支;
支持CUDA的GPU集成有8个内存控制器,GPU的内存带宽通常是CPU的十倍。
......
文章是我根据网上的一些热心网友的博客和我自己的一些相关资料总结得来,如有侵权请立马告诉本人,如有说错的,还请指点,谢谢!