我正在使用Fasm (汇编语言),寻找这些intrinsics指令的SSE2汇编指令等效指令:
_mm_set1_epi8
_mm_cmpeq_epi8
_mm_movemask_epi8
我应该去哪里获取它们(网站、PDF文件等)?
我正在使用Fasm (汇编语言),寻找这些intrinsics指令的SSE2汇编指令等效指令:
_mm_set1_epi8
_mm_cmpeq_epi8
_mm_movemask_epi8
_mm_set1_epi8
。对于大多数指令,说明列出了相应的机器指令。
您还可以使用非常有用的编译器资源管理器来查看给定指令的生成代码,例如此_mm_set1_epi8
示例。
与其纠缠于底层函数的文档,最好首先查看英特尔汇编文档,可以在他们的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,则可以进行搜索。)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
指令是否可以在同一周期内运行,使其变得不太有用。