C++ AVX-512-使用英特尔SDE调试应用程序不工作

C++ AVX-512-使用英特尔SDE调试应用程序不工作,c++,debugging,gdb,intel,avx512,C++,Debugging,Gdb,Intel,Avx512,我试图在模拟CPU上使用调试AVX-512指令,但设置断点后,它无法按预期工作。我关注了这篇博文: 在窗口#1中: ~$g++-g-O0-mavx512f main.cpp-o main#编译main.cpp文件 ~$sde-调试--./main#启用调试 应用程序停止,直到从调试器继续。 启动GDB,然后在(GDB)提示符下发出以下命令: 远程目标:54105 在窗口#2 #运行调试器 ~$gdb./main GNU gdb(Ubuntu 9.2-0ubuntu1~20.04)9.2 版权所

我试图在模拟CPU上使用调试AVX-512指令,但设置断点后,它无法按预期工作。我关注了这篇博文:

在窗口#1中:

~$g++-g-O0-mavx512f main.cpp-o main#编译main.cpp文件
~$sde-调试--./main#启用调试
应用程序停止,直到从调试器继续。
启动GDB,然后在(GDB)提示符下发出以下命令:
远程目标:54105
在窗口#2

#运行调试器
~$gdb./main
GNU gdb(Ubuntu 9.2-0ubuntu1~20.04)9.2
版权所有(C)2020免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。
有关详细信息,请键入“显示复制”和“显示保修”。
此GDB配置为“x86_64-linux-gnu”。
键入“显示配置”以获取配置详细信息。
有关错误报告说明,请参阅:
.
在线查找GDB手册和其他文档资源,网址为:
.
要获得帮助,请键入“帮助”。
键入“apropos word”以搜索与“word”相关的命令。。。
正在从/main读取符号。。。
#设置目标“目标远程:端口号”
(gdb)远程目标:54105
远程调试使用:54105
警告:远程目标不支持文件传输,试图从本地文件系统访问文件。
正在从/lib64/ld-linux-x86-64.so.2读取符号。。。
(在/lib64/ld-linux-x86-64.so.2中找不到调试符号)
0x00007FA7BBCC100英寸??()来自/lib64/ld-linux-x86-64.so.2
#在主功能处暂停程序
(gdb)主断路器
0x2c9c处的断点1:file/home/borrow/source/resos/se test/main.cpp,第165行。
#从程序的开头开始执行程序
(gdb)运行
“远程”目标不支持“运行”。尝试“帮助目标”或
“继续”。
#转到下一行代码
(gdb)步骤
找不到当前函数的边界
#继续执行,直到下一个断点
(gdb)c
持续的。
警告:基于探测器的动态链接器接口失败。
恢复到原始接口。
[下级1(远程目标)正常退出]
在窗口#2:如你所见

gdb run
应该运行一个程序,但它不工作
gdbc
也应该运行到下一个断点,但执行程序并终止。此命令向我发出以下警告消息:

警告:基于探测器的动态链接器接口失败

在窗口#1中:程序运行并结束(不停止)

程序代码如下所示:

//main.cpp
#包括
常数int N=64;
int64_t srcA[N]={0};
int64_t srcB[N]={0};
int64_t dst[N]={0};
void foo()
{
__m512i结果,B,C;

对于(int i=0;i而言,对于饼图可执行文件而言,它似乎被破坏了
(在带有GCC 10.2、GDB 10.1和SDE 8.33的Arch GNU/Linux上确认。)

使用
g++-O2-fno pie-no pie-no pie-g-march=skylake-avx512
构建,一切正常(我必须运行
gdb./a.out
,而不是裸gdb;否则,即使连接到远程设备,它也无法找到正确的文件。)

然后在另一个终端选项卡中

$ gdb ./a.out
...
(gdb)   target remote :59783
warning: remote target does not support file transfer, attempting to access files from local filesystem.
Reading symbols from /lib64/ld-linux-x86-64.so.2...
(No debugging symbols found in /lib64/ld-linux-x86-64.so.2)
0x00007f4f7033b090 in _start () from /lib64/ld-linux-x86-64.so.2
(gdb) b main
Breakpoint 1 at 0x401050: file avx512.cpp, line 29.
(gdb) b foo
Breakpoint 2 at 0x401190: file avx512.cpp, line 14.
(gdb) c
Continuing. 
Breakpoint 1, main () at avx512.cpp:23
(gdb) layout asm
(copy-paste of some of the disassembly window)
│B+ 0x401120 <_Z3foov>              xor    eax,eax
│   0x401122 <_Z3foov+2>            nop    WORD PTR [rax+rax*1+0x0]
│  >0x401128 <_Z3foov+8>            vmovdqu64 zmm1,ZMMWORD PTR [rax+0x404260]
│   0x401132 <_Z3foov+18>           add    rax,0x40
│   0x401136 <_Z3foov+22>           vpaddq zmm0,zmm1,ZMMWORD PTR [rax+0x404420]
│   0x401140 <_Z3foov+32>           vmovdqu64 ZMMWORD PTR [rax+0x404020],zmm0
│   0x40114a <_Z3foov+42>           cmp    rax,0x200
│   0x401150 <_Z3foov+48>           jne    0x401128 <_Z3foov+8>
│   0x401152 <_Z3foov+50>           vzeroupper
│   0x401155 <_Z3foov+53>           ret
(gdb) layout src
(IDK,如果我的
.gdbinit
包括
布局reg
,全屏终端TUI模式很重要的话。工作时很好,但有点问题。)


或者,作为一个使用PIE可执行文件的超级黑客解决方案,我还能够在
main
的顶部放置一个延迟循环,让您有机会在SDE完成程序执行之前连接并控制-C


然后我可以设置断点并开始单步执行(大概一个
睡眠
读取
系统调用就可以了)。源代码级调试似乎仍然中断,但我能够使用
布局注册表
调试asm。我使用
设置$rip=…
和一个复制粘贴的地址来摆脱
的停顿()
连接并点击control-C后循环。

您是否运行了
gdb./main
以便在连接到遥控器之前立即获得符号?此外,我建议在阵列上使用
alignas(64)
;AVX-512比AVX2从对齐中获益更多。(例如,在缓存未命中DRAM的阵列上循环时,未对齐的速度比AVX2慢了20%,而AVX2只有两个百分点。)@PeterCordes你是什么意思?我编译main.cpp文件,-g标志生成调试信息。然后我尝试调试此代码。如果你的机器支持AVX 512(或AVX2,SSE),您可以尝试在不使用SDE的情况下进行调试。它应该可以工作。但是,当我调试模拟代码时,它将不再工作您的GDB输出,如
警告:远程目标不支持文件传输,尝试从本地文件系统访问文件。
似乎表明GDB在连接到远程之前不知道要调试的文件。IDK if y如果你告诉GDB运行GDB的一部分是什么文件,你会得到不同的结果,所以你可以设置断点。当然,你实际上没有在GDB中运行AVX-512程序,你仍然使用
remote
命令,但我想你已经告诉它设置断点了。只是在我自己的机器上用GDB 10.1和SDE 8.33,conf尝试了这一点irmed。同样的错误消息。在使用
目标远程
之前,使用
gdb./a.out
设置断点没有帮助,甚至不会使“文件传输”警告消失。哦,好吧,这个猜测就到此为止。我很确定这过去是可行的,过去我使用SDE来单步AVX-512代码。
$ gdb ./a.out
...
(gdb)   target remote :59783
warning: remote target does not support file transfer, attempting to access files from local filesystem.
Reading symbols from /lib64/ld-linux-x86-64.so.2...
(No debugging symbols found in /lib64/ld-linux-x86-64.so.2)
0x00007f4f7033b090 in _start () from /lib64/ld-linux-x86-64.so.2
(gdb) b main
Breakpoint 1 at 0x401050: file avx512.cpp, line 29.
(gdb) b foo
Breakpoint 2 at 0x401190: file avx512.cpp, line 14.
(gdb) c
Continuing. 
Breakpoint 1, main () at avx512.cpp:23
(gdb) layout asm
(copy-paste of some of the disassembly window)
│B+ 0x401120 <_Z3foov>              xor    eax,eax
│   0x401122 <_Z3foov+2>            nop    WORD PTR [rax+rax*1+0x0]
│  >0x401128 <_Z3foov+8>            vmovdqu64 zmm1,ZMMWORD PTR [rax+0x404260]
│   0x401132 <_Z3foov+18>           add    rax,0x40
│   0x401136 <_Z3foov+22>           vpaddq zmm0,zmm1,ZMMWORD PTR [rax+0x404420]
│   0x401140 <_Z3foov+32>           vmovdqu64 ZMMWORD PTR [rax+0x404020],zmm0
│   0x40114a <_Z3foov+42>           cmp    rax,0x200
│   0x401150 <_Z3foov+48>           jne    0x401128 <_Z3foov+8>
│   0x401152 <_Z3foov+50>           vzeroupper
│   0x401155 <_Z3foov+53>           ret
(gdb) layout src
$ gdb
(gdb)  target remote :46879
Remote debugging using :46879 warning: No executable has been specified and target does not support determining executable automatically.  Try using the "file" command.
0x00007f0f85830090 in ?? ()
(gdb)