AVX 和 AVX2 之间的区别

问题描述 投票:0回答:1

下面是 AVX2 中矩阵乘法的实现。我使用的机器仅支持 AVX,因此我尝试使用 AVX 实现相同的配置。

但是,我很难理解到底有什么区别,以及需要改变什么!此实现中哪些内容是 AVX2 特有的,无法与只能处理 AVX 的机器一起使用?

这是 AVX 和 AVX2 所有命令的链接 https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=AVX

感谢您的任何见解!

 for (uint64_t i = 0; i < M; i++)
     {
         for (uint64_t j = 0; j < N; j++)
         {
             __m256 X = _mm256_setzero_ps();
             for (uint64_t k = 0; k < L; k+= 8) {
                 const __m256 AV = _mm256_load_ps(A+i*L+k);
                 const __m256 BV = _mm256_load_ps(B+j*L+k);
                 X = _mm256_fmadd_ps(AV,BV,X);
             }
             C[i*N+j] = hsum_avx(X);
         }
     }

x86 matrix-multiplication simd avx avx2
1个回答
9
投票

您的代码使用 AVX1 + FMA 指令,而不是 AVX2。 例如,它可以在 AMD 打桩机上正常运行。 (假设 hsum 以合理的方式实现,提取高半部分,然后使用 128 位混洗。)。

如果您的仅 AVX CPU 也没有 FMA,则需要使用

_mm256_mul_ps
_mm256_add_ps


对于英特尔来说,AVX2 和 FMA 是在同一代 Haswell 中引入的,但这些是不同的扩展。 FMA 在某些没有 AVX2 的 CPU 中可用。

不幸的是即使是 VIA CPU 也有 AVX2 但没有 FMA

,否则 AVX2 意味着 FMA,除非您使用的是虚拟机或

模拟器,故意具有真正的硬件没有的扩展组合 MSVC /arch:AVX2

和 GCC / clang

-march=x86-64-v3

 都暗示 Haswell 功能级别,AVX2+FMA+BMI1/2。
(在一些 AMD CPU 中有一个 FMA4 扩展,有 4 个操作数(3 个输入和一个单独的输出),Bulldozer 到 Zen1,之后英特尔在 AMD 上进行了切换,为时已晚,他们无法更改其 Bulldozer 设计以支持 FMA3。这就是为什么有一个仅限 AMD 的 FMA4,以及为什么直到 Piledriver 后 AMD 才支持与 Intel 兼容的 FMA 扩展,但现在这已成为历史的一部分,所以通常我们只是说 FMA 来引用技术上称为 FMA3 的扩展。请参阅 Agner Fog 2009 年的博客 
停止指令集战争

,以及

我如何知道我是否可以使用FMA指令集进行编译?

AVX1:仅限 256 位 FP(除了
(立即)和

_mm256_permutevar_ps

(矢量控制)是 AVX1 
vpermilps
 车道内排列,而 AVX2 则背负着 
_mm256_permutexvar_ps
。  令人困惑的是,内在函数有一个用于车道交叉的 
x
,而 asm 助记符却很简单。
	

© www.soinside.com 2019 - 2024. All rights reserved.