【问题标题】:gdb printing a __m256i as 8x 32-bit elements instead of the default 4x 64-bit?gdb 将 __m256i 打印为 8x 32 位元素而不是默认的 4x 64 位?
【发布时间】:2020-10-05 12:40:28
【问题描述】:

我使用 gdb 来调试通过 immintrin.h 标头使用 AVX2 内在函数的程序。

使用 gdb,我可以毫无问题地打印出 __m256 值,如下所示:

>>> print scl8
$4 = {[0] = 0.0078125, [1] = 0.0078125, [2] = 0.0078125, [3] = 0.0078125, [4] = 0.0078125, [5] = 0.0078125, [6] = 0.0078125, [7] = 0.0078125}

在这个特定示例中,所有 8 个通道都包含值 1/128。 请注意,gdb 会打印出所有 8 条车道

如果我想打印出 __m256i 值的 epi32 值,就会出错:

>>> print msk8
$6 = {[0] = 4294967297, [1] = 4294967297, [2] = 4294967297, [3] = 4294967297}

为什么 gdb 会为 __m256i 打印 4 个通道(我假设是 64 位整数),而为 __m256 值打印 8 个 32 位浮点数通道?这里的一致性在哪里?

如何使用 gdb 从__m256i 打印 8 个 epi32 值?

$ gdb --version
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git

【问题讨论】:

  • GCC 将__m256i 定义为typedef unsigned long long __attribute__((vector_size(32), may_alias))。这就是__m256i 打印为 4x uint64_t 的原因。请记住,C x86 内在函数对所有 SIMD 整数元素宽度使用相同的类型。给定一个 YMM 寄存器,您可以 p /x $ymm0.v8_int32,但我不确定您将如何使用 C 内部函数进行源代码级调试。

标签: integer gdb intrinsics avx


【解决方案1】:

我还没有找到更简单的解决方案,但您可以将您的值转换为 __v8si,即 (__v8si) ones 将打印 8 个通道。

因此,观察表达式、调试器控制台或保留未使用的变量(将在发布版本中优化)可能有助于调试。

我想查看一些可以在调试构建中放入的属性或 cmets,它们会影响 GDB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多