本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等
内存计算是近十几年来,在数据库和大数据领域的一个热点。随着内存越来越便宜,CPU的架构越来越先进,整个数据库都可以放在内存中,并通过 SIMD 和并行计算技术,来提升数据处理的性能。
我问你一个问题:做 1.6 亿条数据的汇总计算,需要花费多少时间呢?几秒?几十秒?还是几分钟?如果你经常使用数据库,肯定会知道,我们不会在数据库的一张表中保存上亿条的数据,因为处理速度会很慢。
但今天,我会带你采用内存计算技术,提高海量数据处理工作的性能。与此同时,我还会介绍 SIMD 指令、高速缓存和局部性、动态优化等知识点。这些知识点与编译器后端技术息息相关,掌握这些内容,会对你从事基础软件研发工作,有很大的帮助。
了解SIMD
本文所采用的 CPU,支持一类叫做 SIMD(Single Instruction Multiple Data)的指令,它的字面意思是:单条指令能处理多个数据。相应的,你可以把每次只处理一个数据的指令,叫做 SISD(Single Instruction Single Data)。
SISD 使用普通的寄存器进行操作,比如加法:
addl$10,%eax
这行代码是把一个 32 位的整型数字,加到 %eax 寄存器上(在 x86-64 架构下,这个寄存器一共有 64 位,但这个指令只用它的低 32 位,高 32 位是闲置的)。
这种一次只处理一个数据的计算,叫做标量计算;一次可以同时处理多个数据的计算,叫做矢量计算。它在一个寄存器里可以并排摆下 4 个、8 个甚至更多标量,构成一个矢量。图中 ymm 寄存器是 256 位的,可以支持同时做 4 个 64 位数的计算(xmm 寄存器是它的低128 位)。
如果不做 64 位整数,而做 32 位整数计算,一次能计算 8 个,如果做单字节(8 位)数字的计算,一次可以算 32 个!
1997 年,Intel 公司推出了奔腾处理器,带有 MMX 指令集,意思是多媒体扩展。当时,让计算机能够播放多媒体(比如播放视频),是一个巨大的进步。但播放视频需要大量的浮点计算,依靠原来 CPU 的浮点运算功能并不够。
所以,Intel 公司就引入了 MMX 指令集,和容量更大的寄存器来支持一条指令,同时计算多个数据,这是在 PC 上最早的 SIMD 指令集。后来,SIMD 又继续发展,陆续产生了SSE(流式 SIMD 扩展)、AVX(高级矢量扩展)指令集,处理能力越来越强大。
2017 年,Intel 公司发布了一款至强处理器,支持 AVX-512 指令(也就是它的一个寄存器有 512 位)。每次能处理 8 个 64 位整数,或 16 个 32 位整数,或者 32 个双精度数、64个单精度数。你想想,一条指令顶 64 条指令,几十倍的性能提升,是不是很厉害!
那么你的电脑是否支持 SIMD 指令&#