为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蛊毒传说 2019-09-02 16:09:13
我一直试图找出应用程序中的性能问题,并最终将其缩小到一个非常奇怪的问题。如果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,                5.0302160279288017364 );    }    return r;}生成的代码与gcc不同,但它显示相同的问题。较旧版本的intel编译器生成了另一个函数的变体,它也显示了问题,但只有在main.cpp没有使用intel编译器构建时,因为它插入调用来初始化一些自己的库,这可能最终会在VZEROUPPER某处做。当然,如果整个东西都是用AVX支持构建的,那么内在函数就会变成VEX编码指令,也没有问题。我已经尝试perf在linux上分析代码,并且大多数运行时通常依赖于1-2条指令,但并不总是相同的,具体取决于我所分析的代码版本(gcc,clang,intel)。缩短功能似乎会使性能差异逐渐消失,因此看起来几条指令都会导致问题。
查看完整描述

3 回答

  • 3 回答
  • 0 关注
  • 887 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信