Visual studio 2015 MSVC 2015 AVX2调试问题。并非所有SIMD通道都正确填充

Visual studio 2015 MSVC 2015 AVX2调试问题。并非所有SIMD通道都正确填充,visual-studio-2015,avx,avx2,Visual Studio 2015,Avx,Avx2,我在Visual Studio 2015更新1(针对Win10)中调试AVX2代码时遇到问题 使用调试器并检查AVX2寄存器时,与正常运行程序相比,使用断点并跨过_mm256_insertf128_ps-instruction(例如)时,内容有所不同。 这种错误很容易复制。只需在主功能中使用以下代码创建一个新的Win console应用程序: 1: __m128 lo = _mm_set1_ps(2.0f); 2: __m128 hi = _mm_set1_ps(4.0f); 3: __m256

我在Visual Studio 2015更新1(针对Win10)中调试AVX2代码时遇到问题

使用调试器并检查AVX2寄存器时,与正常运行程序相比,使用断点并跨过_mm256_insertf128_ps-instruction(例如)时,内容有所不同。 这种错误很容易复制。只需在主功能中使用以下代码创建一个新的Win console应用程序:

1: __m128 lo = _mm_set1_ps(2.0f);
2: __m128 hi = _mm_set1_ps(4.0f);
3: __m256 avx = _mm256_castps128_ps256(lo);
4: avx = _mm256_insertf128_ps(avx, hi, 1);
5: for (int i = 0; i < 8; i++)
6:     printf("%.2f\n", avx.m256_f32[i]);
1:uuum128低=mm\uset1\ups(2.0f);
2:uuum128高=mm_u设置1_ps(4.0f);
3:uuum256 avx=mm256_castps128_ps256(本振);
4:avx=_mm256_insertf128_ps(avx,hi,1);
5:for(int i=0;i<8;i++)
6:printf(“%.2f\n”,avx.m256_f32[i]);
在第4行设置断点并跨过它会导致第5-6行的打印循环产生以下输出:

2.00
2.00
2.00
2.00
0.00 <- Wrong!
0.00 <- Wrong!
0.00 <- Wrong!
0.00 <- Wrong!
2.00
2
2
2
0.00如果您下载“Visual Studio 2015更新2”,您会发现此问题现已修复


答案就在这里

我认为来源看起来不错。后asm;它是否与源匹配应该是显而易见的。也可以尝试一种非MSVC特定的方法,从向量中提取浮点数。(例如,使用
\u mm256\u storeu\u ps
存储到浮点数组,或者依次将每个元素洗牌到寄存器的低位元素,并使用
\u mm\u cvtss\u f32
转换为标量)这是新调试引擎中的一个缺陷,它有很多缺陷。解决方法是工具>选项>调试>常规>勾选“使用本机兼容性模式”。这将强制使用较旧的调试引擎,它没有这个问题。您可以在connect.microsoft.com上报告此错误
2.00
2.00
2.00
2.00
4.00 <- Correct
4.00 <- Correct
4.00 <- Correct
4.00 <- Correct