【问题标题】:MSVC 2015 AVX2 debugging problems. Not all SIMD lanes are populated correctlyMSVC 2015 AVX2 调试问题。并非所有 SIMD 通道都正确填充
【发布时间】:2016-03-01 09:57:52
【问题描述】:

我在 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)进行了尝试,并且都表现出相同的行为。

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

提前致谢!

【问题讨论】:

  • 来源看起来不错,我想。发布汇编;它是否与来源匹配应该是显而易见的。也可以尝试使用非 MSVC 特定的方法将浮点数从向量中取出。 (例如,使用_mm256_storeu_ps 存储到浮点数组,或将每个元素依次洗牌到寄存器的低元素并使用_mm_cvtss_f32 转换为标量)
  • 这是新的调试引擎中的一个错误,它有很多。解决方法是工具 > 选项 > 调试 > 常规 > 勾选“使用本机兼容模式”。这强制使用较旧的调试引擎,它没有这个问题。您可以在 connect.microsoft.com 上报告错误

标签: visual-studio-2015 avx avx2


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 2011-08-28
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多