相关疑难解决方法(0)

如果没有Skylake上的VZEROUPPER,为什么这个SSE代码会慢6倍?

我一直试图找出应用程序中的性能问题,并最终将其缩小到一个非常奇怪的问题.如果VZEROUPPER指令被注释掉,则下面的代码在Skylake CPU(i5-6500)上运行速度慢6倍.我测试了Sandy Bridge和Ivy Bridge CPU,两种版本都以相同的速度运行,有或没有VZEROUPPER.

现在我VZEROUPPER对这个代码有了一个相当好的想法,而且我认为当没有VEX编码指令并且没有调用可能包含它们的任何函数时,它对这个代码根本不重要.事实上它不支持其他支持AVX的CPU似乎支持这一点.英特尔®64和IA-32架构优化参考手册中的表11-2也是如此

那么发生了什么?

我留下的唯一理论是,CPU中存在一个错误,它错误地触发了"保存AVX寄存器的上半部分"程序,而不应该这样做.或者其他一些同样奇怪的东西.

这是main.cpp:

#include <immintrin.h>

int slow_function( double i_a, double i_b, double i_c );

int main()
{
    /* DAZ and FTZ, does not change anything here. */
    _mm_setcsr( _mm_getcsr() | 0x8040 );

    /* This instruction fixes performance. */
    __asm__ __volatile__ ( "vzeroupper" : : : );

    int r = 0;
    for( unsigned j = 0; j < 100000000; ++j )
    {
        r |= slow_function( 
                0.84445079384884236262,
                -6.1000481519580951328, …
Run Code Online (Sandbox Code Playgroud)

performance x86 sse intel avx

32
推荐指数
2
解决办法
4072
查看次数

混合EVEX和VEX编码方案的代价是什么?

这是一个已知的问题是混合VEX编码的指令和非VEX指令有一个点球和程序员必须意识到这一点.

有一些像这样的问题和答案.解决方案取决于您编程的方式(通常您应该zeroupper在转换后使用.但我的问题是关于EVEX编码的方案.只要没有内在函数,例如_mm512_zeroupper()使用VEX编码和EVEX-时似乎没有惩罚但是,EVEX是4字节,VEX是3字节,矢量长度分别是512位和256位.

因为AVX-512不可用(至少对我而言).我想问一下,当我们想要混合它们时,有什么需要注意的.

x86 assembly simd avx512

8
推荐指数
1
解决办法
667
查看次数

标签 统计

x86 ×2

assembly ×1

avx ×1

avx512 ×1

intel ×1

performance ×1

simd ×1

sse ×1