【发布时间】: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