【问题标题】:What is the SSE2 assembly equivalent of intrinsics?什么是内部函数的 SSE2 程序集等效项?
【发布时间】:2019-06-07 02:50:23
【问题描述】:

我正在使用 Fasm(汇编),我正在寻找与这些内在指令等效的 SSE2 汇编指令:

_mm_set1_epi8
_mm_cmpeq_epi8
_mm_movemask_epi8

我在哪里可以得到它们(网站、pdf...)?

【问题讨论】:

标签: assembly sse simd intrinsics sse2


【解决方案1】:

使用Intel Intrinsics Guide 但请注意,某些内在函数不会映射到单个指令,例如_mm_set1_epi8。尽管描述列出了相应的机器指令,但对于大多数内在函数。

您还可以使用非常有用的Compiler Explorer 来查看为给定内在函数生成的代码,例如this example for _mm_set1_epi8.

【讨论】:

    【解决方案2】:

    不要乱用内在函数文档,首先查看 Intel 的 asm 文档,在他们的 x86 Software Developer Manual vol.2 中。或者在https://www.felixcloutier.com/x86/index.html 上仅提取指令条目的 HTML 摘录,没有介绍和附录。例如https://www.felixcloutier.com/x86/PCMPEQB:PCMPEQW:PCMPEQD.html

    (英特尔的 asm 手册条目在条目底部列出了该指令的内在函数。由于 AVX512 是主 PDF 的一部分,因此列表变得一团糟,但您仍然可以在另一个方向检查您的猜测/记忆如果您已经猜到内在函数将使用什么指令并进行查找。 或者,如果您在完整的 PDF 版本中进行搜索,您会在内部名称上获得成功,对于直接映射到一条指令(如 _mm_cmpeq_epi8 而不是 set1)的内部函数

    它比它们的内在文档更好/更详细(例如,操作部分始终存在,并且通常更具体)。另外,它会向您显示操作数的输入顺序。这通常与内在相匹配,但我似乎记得它没有的情况,可能是随机播放。当然还有vfmadd132ps vs. vfmadd213ps vs. vfmadd231ps,它们的区别在于哪个加数或一个被乘数是目标,哪个可以是内存。

    它还显示了哪个操作数可以是内存。它并不总是最后一个,例如VBLENDVPS xmm1, xmm2, xmm3/m128, xmm4(因为最后一个操作数以立即字节编码,而不是像非 VEX 版本那样隐含 xmm0)。此外,pmovzxbd xmm1, dword [rdi] 和其他函数可用作窄负载(不需要对齐,因为它小于 16 个字节),但您永远不会从仅提供 __m128i 源的内在函数中知道这一点。在您使用_mm_cvtsi32_si128 (int a) 后,编译器无法始终优化为内存操作数。

    还有pblendvb,其中非VEX 形式为PBLENDVB xmm1, xmm2/m128, <XMM0>,隐式使用XMM0 作为混合控制向量。内在函数也隐藏了这一点,因此如果您尝试编写 pblendvb xmm1, xmm8, xmm7,您会遇到令人困惑的错误。

    Agner Fog's asm optimization guide 也有一章介绍 SIMD,其中包含一些非常好的数据移动指令表,可用于不同类型的任务。

    有关更多链接,另请参阅SO x86 tag wiki


    我发现 asm 助记符更容易记住;它们更短,并且在命名中像 shuffle 与 permute 之类的奇怪差异略少(大多数情况下,直到 AVX ......)。更重要的是,我倾向于从 asm 的角度思考,然后编写让编译器高效编译的内在函数。

    CPU 延迟/吞吐量/执行端口信息全部由助记符而非固有信息(Agner Fog 的表、instlatx64http://uops.info/),因此您必须知道这些名称才能了解真正的低级性能细节,并检查编译器是否对您的代码进行了良好的处理,并查看 perf record / perf report 分析结果以找出为什么某处存在热点。

    英特尔在其内在函数指南上有吞吐量/延迟数字,但没有执行端口,因此您无法知道两条 throughtput=1 指令是否可以彼此在同一周期内运行,因此它不是很有用。

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 2013-01-03
      • 2015-10-04
      • 2012-08-16
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多