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

时间:2016-03-01 09:57:53

标签: visual-studio-2015 avx avx2

我在Visual Studio 2015中调试AVX2代码时遇到问题,更新1(定位到Win10)。

使用调试器并检查AVX2寄存器时,与正常运行程序相比,使用断点并跨越_mm256_insertf128_ps-intrinsic(例如)时内容会有所不同。 这个bug很容易重现。只需使用main函数中的以下代码创建一个新的Win控制台应用程序:

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]);

在第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.00
2.00
2.00
4.00 <- Correct
4.00 <- Correct
4.00 <- Correct
4.00 <- Correct

我使用MSVC和英特尔编译器(版本16)尝试了这一点,两者都表现出相同的行为。

还有其他人偶然发现了这个问题吗? 有谁知道这可能是什么原因? 它有什么解决方法吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您下载“Visual Studio 2015 Update 2”,您会发现现在已修复此问题。

这里找到答案; https://stackoverflow.com/a/36801311