C# 为什么只有AVX out的处理器对许多SIMD算法执行AVX2处理器? 我一直在研究C语言和C++中SIMD算法的好处,发现在很多情况下,使用AVX处理器上的128位寄存器比使用AVX2处理器的256位寄存器有更好的改进,但我不明白为什么。

C# 为什么只有AVX out的处理器对许多SIMD算法执行AVX2处理器? 我一直在研究C语言和C++中SIMD算法的好处,发现在很多情况下,使用AVX处理器上的128位寄存器比使用AVX2处理器的256位寄存器有更好的改进,但我不明白为什么。,c#,c++,simd,avx,avx2,C#,C++,Simd,Avx,Avx2,我所说的改进是指在同一台机器上SIMD算法相对于非SIMD算法的速度。(来自对问题的评论) 如果算术运算不是算法执行中的瓶颈,那么使用SIMD将无法提供加速。其他瓶颈可能是内存带宽、缓存大小、内存速度、缓存速度。如果具有AVX的处理器在这些区域执行AVX2处理器,那么它将从使用SIMD intrinsic中获得更多好处。在AVX处理器上,当不执行AVX指令(VEX编码的操作码)时,CPU会关闭256位寄存器和浮点单元的上半部分。当代码使用AVX指令时,CPU必须给FP单元通电——这需要大约70微

我所说的改进是指在同一台机器上SIMD算法相对于非SIMD算法的速度。

(来自对问题的评论)


如果算术运算不是算法执行中的瓶颈,那么使用SIMD将无法提供加速。其他瓶颈可能是内存带宽、缓存大小、内存速度、缓存速度。如果具有AVX的处理器在这些区域执行AVX2处理器,那么它将从使用SIMD intrinsic中获得更多好处。

在AVX处理器上,当不执行AVX指令(VEX编码的操作码)时,CPU会关闭256位寄存器和浮点单元的上半部分。当代码使用AVX指令时,CPU必须给FP单元通电——这需要大约70微秒,在此期间,AVX指令实际上使用128微操作执行两次

当AVX指令大约700微秒未被使用时,CPU会再次关闭电路的上半部分

现在它这样做是因为电路的上半部分消耗电力(doh!),因此产生热量(doh!)。这意味着使用AVX指令时CPU运行更热。因此,考虑到CPU在有热余量时可以“涡轮增压”,使用AVX指令可以减少这种可能性,事实上,CPU实际上降低了“基本时钟速度”。因此,例如,如果你有一个官方时钟频率为2.3GHz的CPU,它可以涡轮增压到2.7,当你开始使用AVX指令时,该芯片的时钟频率降到2.1,并且只提升到2.3,在极端情况下,基本时钟可能会降低到1.9(见第2-4页)

在这个阶段,CPU执行所有指令的速度大约为10-15%,甚至可能比不使用AVX指令时慢20%。如果您正在执行大量SIMD操作,那么256位宽的指令就值得这么做。但是如果你在做一些AVX指令,然后是“正常”代码,然后再做一点AVX,那么这个时钟速度损失将超过你从AVX单独获得的所有收益


这就是为什么128位宽的SIMD可以比256位宽的SIMD运行得更快,除非您有长时间的密集SIMD操作。使用剩余的硅是有代价的。。。(或者更准确地说,这是一种奖励,因为我们没有使用它,而我们有时会忘记我们得到的)。

@eoinmullan您似乎在不同的机器上测试东西。说你用AVX在常春藤桥上获得2倍的加速并不意味着用AVX2在哈斯韦尔会获得超过2倍的加速。如果机器具有不同数量的内存带宽,则肯定会出现这种情况。你得照本说的做。在同一台机器上运行所有测试。否则你会把苹果和桔子做比较。你的内存总线宽度是多少?有多少家银行?在两台机器上它们是否相同?您仍然需要在同一台机器上进行比较,因为不同的机器(以及不同型号的处理器)在内存带宽、缓存大小、内存速度、缓存速度等方面具有不同的行为。如果在同一台机器上使用AVX比AVX2获得更好的速度,这可能是编译不太正确的一个迹象,但仅仅比较两台具有一系列不同属性的不同机器并不能说明这一点。这正是我希望看到的,假设您的基准是内存受限的。如果你的常春藤网桥机器比哈斯韦尔的有更多的内存带宽,那么完全可以预期常春藤网桥的可伸缩性会比哈斯韦尔的更高。如果是这样的话,在这里就不足为奇了。@LưuVĩnhPhúc是的,但是RyuJIT在AVX上只使用128位,而在我的AVX处理器上,_mm256_add_epi16是一条无效的指令。从《英特尔intrinsics指南》中可以看出,AVX的256位寄存器上只能使用双精度和浮点运算。