编译原理之美
宫文学
北京原点代码 CEO
46197 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
编译原理 · 期中考试周 (1讲)
编译原理之美
15
15
1.0x
00:00/00:00
登录|注册

31 | 内存计算:对海量数据做计算,到底可以有多快?

内存计算技术的应用和好处
动态优化的必要性
内存计算技术的普及
程序的局部性
SIMD的应用
内存价格下降
多内核并行计算
循环互换优化
时间局部性和空间局部性
存储层次结构:寄存器、高速缓存、内存、磁盘
动态编译
循环互换优化
SLP矢量化
循环的矢量化
挑战:1.6亿个64位整数加法
简单加法运算示例
应用领域:多媒体处理、游戏、数据库系统、人工智能、编译器优化
发展历程:MMX指令集、SSE、AVX、AVX-512
标量计算 vs 矢量计算
单条指令能处理多个数据
示例代码
一课一思
课程小结
内存计算的发展因素
高速缓存和局部性
LLVM的自动矢量化功能
SIMD指令演示
SIMD指令
内存计算

该思维导图由 AI 生成,仅供参考

内存计算是近十几年来,在数据库和大数据领域的一个热点。随着内存越来越便宜,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 位是闲置的)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

内存计算技术结合SIMD指令的应用为数据库和大数据领域带来了巨大的性能提升。SIMD指令集的引入使得一条指令能同时处理多个数据,大大提高了计算效率。文章介绍了SIMD指令的发展历程和应用场景,以及如何在编译器中生成SIMD指令以发挥其优势。通过示例程序演示了如何使用SIMD指令进行数据处理,并展示了其在处理1.6亿个64位整数时的惊人速度。此外,文章还提到了高速缓存和数据局部性对计算速度的帮助。总的来说,内存计算技术结合SIMD指令的应用,为多媒体处理、游戏、商业领域的数据库系统、人工智能和编译器优化等领域带来了巨大的性能提升。 文章还介绍了LLVM的自动矢量化功能,包括循环的矢量化和SLP矢量化功能,以及编译器在自动矢量化过程中需要避免的潜在问题。这些内容为读者提供了对内存计算和SIMD指令应用的深入了解,以及对编译器优化技术的启发。 此外,文章还强调了程序的局部性对计算机高速缓存的重要性,以及编译器在循环互换优化方面的作用。最后,文章指出了多内核并行计算和内存成本的降低对内存计算技术的普及起到了重要作用。 总的来说,本文深入探讨了内存计算技术结合SIMD指令的应用,以及与编译器优化技术的关系,为读者提供了全面的技术视角和实践指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • 沉淀的梦想
    为什么nums1和nums2的内存位置有重叠就不能进行矢量化了呢?

    作者回复: 这个地方我确实没有细讲。 假设,我们做8个32位整数的计算。让nums2 = nums1 + 1。但是,nums2[0]的地址跟nums1[4]的地址相同,也就是nums2是从nums1的一半开始的。nums1和nums2一共占了12个整数位置。 假设nums1中各个元素的值都是1。然后做矢量计算。做完以后,结果是怎样的呢?从nums1开始,是4个1,8个2,一共12个数字。对吧。 但如果你用标量的循环去做,是怎样的呢? for(int i = 1; i < 8; i++) nums2[i] = nums1[i] + 1; 会是4个1,4个2,4个3。 它等价于nums1[i+4] = nums1[i] + 1。

    2019-11-04
    2
    3
  • pebble
    支持 AVX-512 指令(也就是它的一个寄存器有 512 位)。每次能处理 8 个 64 位整数,或 16 个 32 位整数,或者 32 个双精度数、64 个单精度数。你想想,一条指令顶 64 条指令,几十倍的性能提升,是不是很厉害! 这句里,最后的32个双精度跟64个单精度数量不对啊,双精度是64位的,512字节应该是8个,单精度也就是16个了

    作者回复: 回复。我这个地方确实写得不准确,要再补充点内容。我引用的是Intel的官网的内容。它的意思不是只用一个寄存器处理。而是因为使用了两个 512 位融合乘加 (FMA) 单元,每次可以同时处理32 次双精度和 64 次单精度浮点运算,以及八个 64 位和十六个 32 位整数。FMA单元的指令比较特殊,它可以完成乘法运算的时候同时完成加法运算。 我把正文调一下。参考: https://www.intel.cn/content/www/cn/zh/architecture-and-technology/avx-512-overview.html

    2019-11-08
    2
  • dll
    gcc -mavx2 simd2.c -o simd2 这部分代码是不是在m1上没法执行
    2022-07-27
    1
  • 吃饭
    python里的pandas处理数据那么快是不是用的就是这个
    2021-06-28
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部