C++性能优化笔记-11-使用向量操作

使用向量操作

  • AVX指令集和YMM寄存器
  • AVX512指令集和ZMM寄存器
  • 自动向量化
  • 使用内建函数
    • 对齐数据
    • 向量化表查找
  • 使用向量类
    • 向量类的CPU分发
  • 转换串行代码到向量化代码
  • 数学函数的向量化
  • 对齐动态分配的内存
  • 对齐RGB视频或三维向量
  • 结论

今天的微处理器有向量指令,这让在一个向量的所有元素上进行操作成为可能。这样叫单指令多数据(SIMD)操作。每个向量的大小可以是64位(MMX),128位(XMM),256位(YMM)和512位(ZMM)。
当需要在大数据集上,对多个数据执行相同的操作,并且程序逻辑也允许时,向量操作是很有用的。例如:图像处理、音频处理、向量和矩阵的数学操作。天然串行的算法,例如排序算法,不大适合向量操作。严重依赖于表查找或要求很多数据交换的算法,例如很多加密算法,是不大适合向量操作。
向量操作依赖于一系列特殊的向量寄存器。不同指令集支持的向量寄存器大小和数目各有不同。可以参考各指令集的数据。
为了高效的访问,不同向量寄存器建议的内存对齐要求也各有不同。
一般,越新的处理器,向量处理也越快。
通常,越小的元素,向量操作越有益。

AVX指令集和YMM寄存器

128位的XMM寄存器被扩展到256位,在AVX指令集中称为YMM。AVX指令集的主要好处是,它允许更大的浮点向量。AVX2指令集也允许256位整数向量。
代码针对AVX指令集编译的话,只能在CPU和操作系统都支持AVX时才能运行。

AVX512指令集和ZMM寄存器

256位的YMM寄存器扩展为512位的ZMM寄存器,在AVX512指令集。AVX512指令集中,64位模式有32个向量寄存器,而32位模式只有8个。因此,AVX512代码最好编译为64位模式。

你可能感兴趣的:(架构与开发技巧,程序优化,c++,c++,向量化,优化)