C中的整数SIMD指令AVX

C中的整数SIMD指令AVX,c,gcc,simd,avx,C,Gcc,Simd,Avx,我试图在数据类型int、float和double上运行SIMD指令。 我需要乘法、加法和加载操作 对于float和double我成功地使这些指令起作用: \u mm256\u add\u ps,\u mm256\u mul\u ps和\u mm256\u load\u ps(双精度结束时为*pd)。 (不支持直接FMADD操作) 但对于integer,我找不到工作指令。“英特尔AVX手册”中显示的所有内容都给出了GCC 4.7中类似的错误,如“未在此范围内声明”\u mm256\u mul\u

我试图在数据类型
int
float
double
上运行SIMD指令。 我需要乘法、加法和加载操作

对于
float
double
我成功地使这些指令起作用:

\u mm256\u add\u ps
\u mm256\u mul\u ps
\u mm256\u load\u ps
(双精度结束时为*pd)。 (不支持直接FMADD操作)

但对于integer,我找不到工作指令。“英特尔AVX手册”中显示的所有内容都给出了GCC 4.7中类似的错误,如“未在此范围内声明”\u mm256\u mul\u epu32”

对于加载整数,我使用
\u mm256\u set\u epi32
,这对于GCC来说很好。我不知道为什么那些其他指令没有定义。我需要更新什么吗

我包括所有这些


我的处理器是Intel core i5 3570k(常春藤网桥)。

256位整数运算仅在AVX2之后添加,因此,如果只有AVX1,则必须使用128位
\uUm128i
向量作为整数内部数

AVX1确实有整数加载/存储,像
\u mm256\u set\u epi32
这样的内部函数可以通过FP-shuffles或编译时常量的简单加载来实现

高级向量扩展2(AVX2),也称为Haswell新指令,[2]是Intel Haswell微体系结构中引入的AVX指令集的扩展。AVX2增加了以下内容:

  • 将most矢量整数SSE和AVX指令扩展到256位
  • 三操作数通用位操作和乘法
  • 三操作数融合乘法累加支持(FMA3)
  • 收集支持,支持从非连续内存位置加载向量元素
  • DWORD和QWORD粒度任意到任意排列
  • 矢量移动
FMA3实际上是一个单独的特性;AMD Piledriver/Steamroller有,但没有AVX2

但是,如果int值范围适合24位,则可以使用
float
。但是请注意,如果需要精确的结果或结果的低位,则必须将
浮点
转换为
双精度
,因为24x24乘法将生成48位的结果,该结果只能精确存储在
双精度
中。此时,每个向量仍然只有4个元素,使用
int32
的XMM向量可能会更好。(但请注意,FMA吞吐量通常优于整数乘吞吐量。)

AVX1具有128位整数运算的VEX编码,因此您可以在与256位FP内部函数相同的函数中使用它们,而不会导致SSE-AVX转换暂停。(在C语言中,您通常不必担心这一点;您的编译器将负责在需要的地方使用
vzeroupper

您可以尝试使用AVX位指令(如VANDPS和VXORPS)模拟整数加法,但如果ymm向量没有按位左移,则无法工作

如果确定未设置FTZ/DAZ,则可以使用小整数作为非规范/次规范
float
值,其中尾数之外的位均为零。那么FP加法和整数加法是相同的位运算。(当输入和结果都是非规范的时,VADDPS在英特尔硬件上不需要微码辅助。)

此外,即使有大量的VANDPS和VXORPS YMM指令也无法模拟
vpaddb