什么是SSE2汇编等效的内置函数?

3

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

_mm_set1_epi8
_mm_cmpeq_epi8
_mm_movemask_epi8

我应该去哪里获取它们(网站、PDF文件等)?

还可以参考Intel Intrinsics Guide。每个内在函数都列出了汇编指令。 - jww
2个回答

8

6

与其纠缠于底层函数的文档,最好首先查看英特尔汇编文档,可以在他们的x86软件开发手册卷2中找到。或者在https://www.felixcloutier.com/x86/index.html上查看仅包含指令条目的HTML提取,不包括介绍和附录。例如https://www.felixcloutier.com/x86/PCMPEQB:PCMPEQW:PCMPEQD.html

(Intel的汇编手册条目在底部列出了该指令的内置函数。由于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的汇编优化指南也有一章关于SIMD,其中包含一些非常好的数据移动指令表格,适用于不同类型的任务。

另请参阅SO x86标签wiki以获取更多链接。


我发现汇编助记符更容易记忆;它们更短,命名中的怪异差异比如shuffle vs. permute较少(大多数情况下,直到AVX...)。更重要的是,我往往以汇编的方式思考,然后编写能让编译器有效编译的指令。

CPU延迟/吞吐量/执行端口信息全部通过助记符进行命名(Agner Fog的表格,instlatx64,和 http://uops.info/),所以你必须知道这些名称才能深入了解底层性能细节,并检查编译器是否对您的代码进行了良好的优化,并查看perf record / perf report分析结果以便找出热点位置。

Intel在其指令集手册上提供吞吐量/延迟数据,但不包括执行端口,因此您无法知道两个throughput=1指令是否可以在同一周期内运行,使其变得不太有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接