Visual Studio 调试器将 AVX 寄存器的上半部分设置为零

Visual Studio debugger sets the upper half of AVX registers to zero

使用 AVX 调试某些代码时,我得到的结果毫无意义。我将程序缩减为以下内容:

#include <iostream>
#include <immintrin.h>

int main()
{
    while (1)
    {
        static float v[] = {1, 2, 3, 4, 5, 6, 7, 8};
        __m256 v8 = _mm256_load_ps(v);
        std::cout << v8.m256_f32[2] << v8.m256_f32[5];
    }
}

当我运行这个程序时,它不停地打印36,这是正确的(它打印3,然后是6)。如果我在循环内的调试器中设置断点,并执行单步操作,它会打印 30。如果我删除断点并继续程序,它会再次开始打印 36 。我在 Release/Debug、Win32/x86(4 种组合)中看到相同的行为。

为了能够使用 AVX,我在配置属性 - C/C++ - 代码生成中将“启用增强指令集”设置为“高级矢量扩展 (/arch:AVX)”。我是不是忘记设置一些其他配置了?

由于这种行为,我无法使用调试器调试我的真实程序(此处未包含)。这很烦人。

我做错了什么吗?我可以解决这个问题吗?

我的 Visual Studio 是:MS Visual Studio Professional 2017,版本 15.9.3。

Visual studio 2017 15.9.7 fixes a bug 调试时损坏了 AVX/MPX/AVX512 寄存器,你应该更新到最新版本,15.9.3 已经快 3 年了。