(草案)SIMD 使用的分类法

主要观点:作者多年来使用过多种 SIMD 用法并偶尔在博客、论文和推特上提及,现总结其 SIMD 用法分类以避免在推特上重复描述,此讨论为引发讨论的草稿,分类较模糊。
关键信息:

  • SIMD 是多数指令集的基本扩展,一次处理 256 或 512 位数据的指令并非 4 倍或 8 倍于处理 64 位数据的指令成本,且无序架构的复杂性与处理数据位数无关。
  • 用 SIMD 有 3 种方式:

    • 类型 1:水平(“一次做很多简单的事”),常见形式,如单字符搜索等。
    • 类型 2:垂直(“用 SIMD 资源做一件很大的事”),利用 SIMD 处理大的数据结构,如 Hyperscan 的 NFA 实现。
    • 类型 3:奇特(“利用仅在 SIMD 指令中可用的功能”),利用 SIMD 功能做特定任务,如在simdjson中使用 PCLMULQDQ 指令。
  • 分类不固定,可组合技术,同一代码库可结合不同编码风格,且类型 2/3 的 SIMD 用法不一定从更宽的 SIMD 模型或向量模型中受益,也常与单线程代码混合。
    重要细节:
  • 类型 1 的示例包括单字符搜索、常规 SIMD 和向量编程用途等,以及在[http://0x80.pl/articles/simd-...]和[https://lemire.me/blog/2024/0...]中的应用。
  • 类型 2 的示例如 Hyperscan 的 NFA 实现和 FDR 字面匹配器。
  • 类型 3 的其他奇特功能包括 Intel 架构的加密指令、Galois 场指令等,以及一些可在 SIMD 寄存器中使用的技巧如 SWAR 技巧。
阅读 12
0 条评论