大家好啊,我是董董灿。
本篇介绍一个计算机中的部件——存储器,看完之后,你将了解存储器是什么以及存储器在AI计算中的作用。
在介绍之前,先说一个我今天早晨的事儿。
7点起来晨跑,突然发现已经到深秋了,凉飕飕的,感觉是时候换一波秋冬的衣服了。于是开始翻箱倒柜,花了好大一会儿,终于在衣柜的最深处,找到了去年冬季跑步的衣服,口袋里还装着去年的口罩。
找到衣服之后,我突然盯着衣柜看了半天,发现:衣柜的设计确实是很讲究,只可惜我没用好,才导致费了九牛二虎之力才找到了衣服。
衣柜讲究的设计
- 最经常穿的衣服,应该是要用衣架撑好挂在衣柜横杆上的,方便随时取用;
- 不经常穿的衣服,比如非当季的衣服,应该是要叠好放在最底层的柜子里,让他过冬。
这种明显的功能区域划分,可以让我在需要某件衣服的时候,方便快捷的找到。这就和今天文章的主角——存储器有点像了。
不知道是不是所有带有存储性质的产品都有类似的分层划分。但我知道,存储器这种储存数据和指令的东西,有着很明显的分层或分级划分的
存储器的分层设计
之前的一篇文章计算机存储和计算的分离说到,在计算机系统中,计算单元和存储器是分离的。而实际上,在计算机中,单看存储器,也是会分成很多层级。
存储器最常见的就是内存。在买手机时,我们一定会关注一个参数,那就是内存大小。内存越大,手机可以存储的数据就越多,运行起来也就越流畅,手机性能就越好。
但是在一个计算系统中,除了内存,还有其他的存储。下图是一个典型的存储器划分示意图。示意图越往上,代表存储器越靠近计算单元,其容量越小,相对造价就越高。
这也是为什么,在计算机系统中,单位存储的内存价格很高,而外存(如硬盘)相对较为便宜。
磁盘
是离CPU最远的存储器。一般作为硬件外设存在。包括我们常见的硬盘、U盘等存储外设。磁盘的读写速度相比其他存储器慢,但是容量大,价格便宜。这个就相当于衣柜的最底层,存放着不经常穿的衣服(数据),像是一个大仓库。
主存
可以理解为电脑的内存条,用来存放程序运行时的指令和数据。程序运行时操作系统需要将程序和数据加载到内存中,它就相当于衣柜中搭衣服的横杆,随取随用。
高速缓存(Cache)
是比主存离CPU更近的一级存储,他会把程序需要的指令或者数据预先加载进来,在CPU进行运算时,会首先在缓存中查找数据或指令,如果找不到,就在去主存中寻找,找不到去主存中寻找的过程一般称为Cache Miss。
预先加载怎么理解呢?打个比方,我们在冬天肯定有经常要穿的2-3件衣服,但不会每次衣服脏了都放回衣柜中,而是洗完放在阳台晾衣架上,这2-3件衣服轮换穿。CPU也是这样,它会频繁的从高速缓存中存取数据,找不到了,再去内存中找,就好像阳台上没衣服了,再去衣柜里找一样。
寄存器(Register)
是CPU最近的存储器。用来存放程序运行时需要的指令、地址、立即数等。类比于就是身上正在穿的衣服。
有了这几级存储,在做AI加速时,就可以做很多事情。之前指令流水线 说过,由于计算和存储是分离的,那么可以将计算和存储指令排流水,实现性能的加速。
同样,如果存储也有分层设计,并且开放给程序员的话,那么,单独的存储指令也可以进行流水设计,从而在带宽不变的前提下,提高数据的吞吐和程序的性能。
GPU就是这么做的。
熟悉GPU硬件架构的同学可能知道,GPU的编程模型中有DDR(显存,也就是最外层存储,可类比硬盘),Shared Memory(共享内存),当然还有其他的存储。
单说 DDR 和 shared memory(SM)这两级存储,就可以排流水。比如——
上表中每一行代表同一时刻,看不懂没关系,只需要知道在同一时刻,程序可以同时将数据从DDR load 到 SM(左侧的一例) 以及在SM上进行计算(右侧的一列)即可。这样就相当于在流水线上有两个工人一起工作,从而提高了性能。
总结
存储器的分层设计,一个好处之一就是,程序员可以通过编写存储指令(包括将数据从外存搬运到内存的 load 指令,将数据从内存加载到片上计算的 move 指令等),从而完成流水的排布。
当然,存储器的分层设计肯定不单是这个原因,就不展开了。
那么问题来了,这篇文章和AI加速有什么关系呢?
其实,存储器作为一个偏计算机底层的部件,是根本不关心上层应用是什么的。我们可以让计算机进行AI计算,来完成AI加速,也可以让计算机运行一个游戏,完成游戏加速。
只要了解了存储器的原理,不论是AI加速还是游戏加速,都能做到性能很好。
政治基础决定上层建筑。——
而且只要硬件支持指令流水级,并且编译器做的足够好,甚至都不需要程序员手动去排流水(手写汇编确实太枯燥了)就能自动实现。从而完成对于AI算法的加速计算,这一点对于编译器的要求很高,后面再介绍。
今天就介绍到这,欢迎持续关注神经网络推理加速入门系列文章。
本文为作者原创,请勿转载,如需转载,请于作者联系。