海量数据做计算,到底可以有多快?

本文已收录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 位整数,或

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值