我在 Visual Studio 2015 更新 1(针对 Win10)中调试我的 AVX2 代码时遇到问题。
使用调试器并检查 AVX2 寄存器时,与正常运行程序相比,使用断点和单步执行 _mm256_insertf128_ps-intrinsic(例如)时的内容不同。该错误很容易重现。只需在 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 和 Intel 编译器(版本 16)进行了尝试,并且都表现出相同的行为。
有没有其他人偶然发现这个问题?有谁知道这可能是什么原因?有什么解决方法吗?
提前致谢!