MSVC 2015 AVX2 调试问题。并非所有 SIMD 通道都正确填充
MSVC 2015 AVX2 debugging problems. Not all SIMD lanes are populated correctly
我在 Visual Studio 2015 更新 1(针对 Win10)中调试我的 AVX2 代码时遇到问题。
使用调试器检查 AVX2 寄存器时,使用断点和跨过 _mm256_insertf128_ps-intrinsic(例如)与正常 运行 程序时的内容不同。
该错误很容易重现。只需在主函数中使用以下代码创建一个新的 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 和 Intel 编译器(版本 16)进行此操作,并且都表现出相同的行为。
还有其他人遇到过这个问题吗?
有谁知道这可能是什么原因?
有什么解决方法吗?
提前致谢!
如果您下载 "Visual Studio 2015 Update 2",您会发现此问题现已修复。
在这里找到答案;
我在 Visual Studio 2015 更新 1(针对 Win10)中调试我的 AVX2 代码时遇到问题。
使用调试器检查 AVX2 寄存器时,使用断点和跨过 _mm256_insertf128_ps-intrinsic(例如)与正常 运行 程序时的内容不同。 该错误很容易重现。只需在主函数中使用以下代码创建一个新的 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 和 Intel 编译器(版本 16)进行此操作,并且都表现出相同的行为。
还有其他人遇到过这个问题吗? 有谁知道这可能是什么原因? 有什么解决方法吗?
提前致谢!
如果您下载 "Visual Studio 2015 Update 2",您会发现此问题现已修复。
在这里找到答案;