我使用 gdb 调试通过 immintrin.h
header 使用 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 个 channel !
如果我想打印出 __m256i
值的 epi32 值,就会出错:
>>> print msk8
$6 = {[0] = 4294967297, [1] = 4294967297, [2] = 4294967297, [3] = 4294967297}
为什么 gdb 会为 __m256i
打印 4 条 channel (我假设是 64 位整数),而为 __m256
值打印 8 条 32 位 float channel ?这里的一致性在哪里?
如何使用 gdb 从 __m256i
打印 8 个 epi32 值?
$ gdb --version
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
最佳答案
我还没有找到更简单的解决方案,但您可以将您的值转换为 __v8si
,即 (__v8si) ones
将打印 8 个 channel 。
因此可能 watch 表达式、调试器控制台或保留未使用的变量(将在发布版本中优化)有助于调试。
我希望看到一些可以放在调试版本中的属性或注释,这会影响 GDB。
关于integer - gdb 将 __m256i 打印为 8x 32 位元素而不是默认的 4x 64 位元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62399455/