如何计算avx和avx2指令集的数量
Posted
技术标签:
【中文标题】如何计算avx和avx2指令集的数量【英文标题】:How to count number of avx and avx2 instruction set 【发布时间】:2016-11-29 07:34:48 【问题描述】:Intel SSE4.2
的数量正好是 313 个汇编指令集(英特尔手册编号的总和)。我希望AVX
和AVX2
使用相同的号码,但找不到任何受信任的参考。我发现了一个reference,它告诉AVX
(第1页,表1)中有292条指令,它是错误的,SSE4.2包含他们没有计算在内的SSSE3。那么如何计算AVX/AVX2
指令呢?
(我想编写一个程序并将英特尔内在函数指南复制到一个文本文件并进行处理。但我需要一种更简单的方法
【问题讨论】:
您要计算助记符的数量,还是操作码的数量?即使在 AVX2 中仍然只有 128b 版本,您是否要将 VPCMPISTRI 与 PCMPISTRI 分开计算? 您想将所有不同形式的 FMA(如 VFMADD132PS 与 VFMADD213PS 与 VFMADDSUB231PS)计算为单独的指令吗?基本上,你想用这个数字做什么,你想要它代表什么? @PeterCordes 是的,我想成为第一个分开的评论,第二个分开并想要助记符。不只是想要新的指令。例如SSE
引入了70条新指令(mmx有57条指令),SSE2
--->144,SSE3
--->13,SSSE3
---->32,SSE4
--- -> 54 所以AVX
----> ?和AVX2
----->?
我希望此信息用于比较过去的英特尔 SIMD 技术和AVX
或AVX2
。研究发表文章
有解析Intels PDF指令集参考手册的脚本:github.com/zneak/x86doc
【参考方案1】:
AVX
有 86 条指令,AVX2
有 137 条指令,AVX
和 AVX2
总共引入了 223 条新指令。
我已将 Intel 内在函数指南复制为 word 格式,删除了内在函数,对汇编指令进行了排序并删除了重复的指令。
这假设所有指令都有相应的内在函数
AVX
ins:
vaddpd,
瓦德普斯,
vaddsubpd,
vaddsubps,
范德普,
范德普斯,
范德普,
范德普斯,
vblendpd,
vblendps,
vblendvpd,
vblendvps,
vbroadcastf128,
vbroadcastsd,
vbroadcastss,
vmppd,
vmpps,
vcmpsd,
vcmpss,
vcvtdq2pd,
vcvtdq2ps,
vcvtpd2dq,
vcvtpd2ps,
vcvtps2dq,
vcvtps2pd,
vcvttpd2dq,
vcvttps2dq,
vdivpd,
vdivps,
vdpps,
vextractf128,
vhaddpd,
vhaddps,
vhsubpd,
vhsubps,
vinsertf128,
vlddqu,
vmaskmovpd,
vmaskmovps,
vmaxpd,
vmaxps,
vminpd,
vminps,
vmovapd,
vmovaps,
vmovddup,
vmovdqa,
vmovdqu,
vmovmskpd,
vmovmskps,
vmovntdq,
vmovntpd,
vmovntps,
vmovshdup,
vmovsldup,
vmovupd,
vmovups,
vmulpd,
vmulps,
沃尔普德,
沃尔普斯,
vperm2f128,
vpermilpd,
vpermilps,
测试,
vpxor,
vrcpps,
vroundpd,
vroundps,
vrsqrtps,
vshufpd,
vshufps,
vsqrtpd,
vsqrtps,
vsubpd,
vsubps,
vtestpd,
vtestps,
vunpckhpd,
冯普克普斯,
vunpcklpd,
vunpcklps,
vxorpd,
vxorps,
vzeroall,
vzeroupper,
和AVX2
ins :
移动,
vbroadcasti128,
vextracti128,
vgatherdpd,
vgatherdps,
vgatherqpd,
vgatherqps,
葡萄酒128,
vmovntdqa,
vmpsadbw,
vpabsb,
vpabsd,
vpabsw,
vpackssdw,
vpacksswb,
vpackusdw,
vpackuswb,
vpaddb,
vpaddd,
vpaddq,
vpaddsb,
vpaddsw,
vpaddusb,
vpaddusw,
vpaddw,
vpalignr,
vpand,
虚拟网络,
vpavgb,
vpavgw,
vpblendd,
vpblendvb,
vpblendw,
vpbroadcastb,
vpbroadcastd,
vpbroadcastq,
vpbroadcastw,
vpcmpeqb,
vpcmpeqd,
vpcmpeqq,
vpcmpeqw,
vpcmpgtb,
vpcmpgtd,
vpcmpgtq,
vpcmpgtw,
vperm2i128,
vpermd,
vpermpd,
vpermps,
vpermq,
vpgatherdd,
vpgatherdq,
vpgatherqd,
vpgatherqq,
vphaddd,
vphaddsw,
vphaddw,
vphsubd,
vphsubsw,
vphsubw,
vpmaddubsw,
vpmaddwd,
vpmaskmovd,
vpmaskmovq,
vpmaxsb,
vpmaxsd,
vpmaxsw,
vpmaxub,
vpmaxud,
vpmaxuw,
vpminsb,
vpminsd,
vpminsw,
vpminub,
vpminud,
vpminuw,
vpmovmskb,
vpmovsxbd,
vpmovsxbq,
vpmovsxbw,
vpmovsxdq,
vpmovsxwd,
vpmovsxwq,
vpmovzxbd,
vpmovzxbq,
vpmovzxbw,
vpmovzxdq,
vpmovzxwd,
vpmovzxwq,
vpmuldq,
vpmulhrsw,
vpmulhuw,
vpmulhw,
vpmulld,
vpmullw,
vpmuludq,
vpor,
vpsadbw,
vpshufb,
vpshufd,
vpshufhw,
vpshuflw,
vpsignb,
签名,
vpsignw,
vpslld,
vpslldq,
vpsllq,
vpsllvd,
vpsllvq,
vpsllw,
vpsrad,
vpsravd,
vpsraw,
vpsrld,
vpsrldq,
vpsrlq,
vpsrlvd,
vpsrlvq,
vpsrlw,
vpsubb,
副总裁,
vpsubq,
vpsubsb,
vpsubsw,
vpsubusb,
vpsubusw,
vpsubw,
vpunpckhbw,
vpunpckhdq,
vpunpckhqdq,
vpunpckhwd,
vpunpcklbw,
vpunpckldq,
vpunpcklqdq,
vpunpcklwd,
vpxor。
【讨论】:
这假设所有指令都有对应的内在函数。 我在您的列表中没有看到vmovss
、the AVX version of MOVSS (_mm_move_ss
)。我猜你的方法只会计算在 AVX 中具有新内在特性的指令,例如对于 256b 版本,而不仅仅是 3 操作数版本。 @CodyGray 有一个很好的观点。
这可能是也可能不是 OP 想要的。有一点语言障碍,所以还不是很清楚。
是的,你是对的,英特尔内部指南中没有vmovss
的内部指令,我的方法没有计算在内。
@PeterCordes 我在哪里可以找到这些指导组织来改进我的答案?【参考方案2】:
This resource也提供了这个问题的答案:
英特尔 AVX 是一项全面的 ISA 增强,它增加了 n 另外还有新功能 到紧凑的新编码格式。
• 大量 (200+) 旧版英特尔 SSEx 指令是 通过增强的指令编码进行升级,以利用 具有独特的源操作数和灵活的内存等特点 结盟。
• 中等数量 (
• 一些新的数据处理和算术运算 (
【讨论】:
以上是关于如何计算avx和avx2指令集的数量的主要内容,如果未能解决你的问题,请参考以下文章
如何在运行时检测 NEON 和 Helium 指令集的可用性
使用 openmp 并行化矩阵乘法并使用 avx2 进行矢量化