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 年了。
使用 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 年了。