AVX-512 — приложение отладки с Intel SDE не работает

Я пытаюсь отлаживать инструкции AVX-512 на эмулируемом процессоре, используя Intel® Software Development Emulator, но он не работает должным образом после установки точки останова. Я следил за этим сообщением в блоге: Отладка эмулируемого кода в Linux*

В окне №1:

~$ g++ -g -O0 -mavx512f main.cpp -o main # compile main.cpp file
~$ sde -debug -- ./main # enable debugging

Application stopped until continued from debugger.
Start GDB, then issue this command at the (gdb) prompt:
target remote :54105

В окне №2

# run debugger
~$ gdb ./main 
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./main...

# set target "target remote :portnumber"
(gdb) target remote :54105  
Remote debugging using :54105
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)
0x00007fa7bbbcc100 in ?? () from /lib64/ld-linux-x86-64.so.2

# suspend program at main function
(gdb) break main   
Breakpoint 1 at 0x2c9c: file /home/borrow/source/repos/se-test/main.cpp, line 165.

# start program execution from the beginning of the program
(gdb) run        
The "remote" target does not support "run".  Try "help target" or
"continue".

# step to next line of code
(gdb) step        
Cannot find bounds of current function

# continue executing until next break point
(gdb) c         
Continuing.
warning: Probes-based dynamic linker interface failed.
Reverting to original interface.
[Inferior 1 (Remote target) exited normally]

В окне №2: как видите

gdb run должен запустить программу, но она не работает. gdb c также должен работать до следующей точки останова, но выполняет программу и завершается. Эта команда дает мне следующее предупреждающее сообщение:

предупреждение: сбой интерфейса динамического компоновщика на основе зондов.

В окне №1: Программа запускается и завершается (без остановки).

Код программы выглядит так:

//  main.cpp
#include <immintrin.h>

const int N=64;
int64_t srcA[N] = {0};
int64_t srcB[N] = {0};
int64_t dst[N] = {0};


void foo()
{
    __m512i result,B,C;
    for ( int i=0; i<N; i+=8 ){
        B =  _mm512_loadu_si512(&srcA[i]);
        C =  _mm512_loadu_si512(&srcB[i]);
        result = _mm512_add_epi64(B,C);
        _mm512_storeu_si512(&dst[i], result);
    }
}
 
int main() {
     ...
     foo();
     ...
}

Я попытался запустить код AVX2 без эмулятора SDE, используя gdb, и это сработало. Сначала я запускаю его на эмулированном процессоре с SDE, он не работает. Как я могу решить эту проблему?


person him    schedule 27.04.2021    source источник
comment
Вы запустили gdb ./main, чтобы символы появились сразу, до подключения к пульту?   -  person Peter Cordes    schedule 27.04.2021
comment
Кроме того, я бы рекомендовал alignas(64) для ваших массивов; AVX-512 выигрывает от выравнивания гораздо больше, чем AVX2. (Например, замедление на 20 % из-за неправильного выравнивания по сравнению с всего парой % с AVX2 из-за зацикливания массива, который не попадает в кэш, в DRAM.)   -  person Peter Cordes    schedule 27.04.2021
comment
@PeterCordes Что ты имеешь в виду? Я компилирую файл main.cpp, и флаг -g выдает отладочную информацию. Затем я пытаюсь отладить этот код. Если ваша машина поддерживает AVX 512 (или AVX2, SSE), вы можете попробовать отладку без SDE. Он должен работать. Но когда я отлаживаю эмулируемый код, он больше не работает.   -  person him    schedule 27.04.2021
comment
Ваш вывод GDB, такой как warning: remote target does not support file transfer, attempting to access files from local filesystem., похоже, указывает на то, что GDB не знал, какой файл отлаживать, пока не подключился к удаленному. IDK, если бы у вас были другие результаты, если бы вы сообщили GDB, какой файл является частью запуска GDB, поэтому вы можете установить точки останова. Конечно, на самом деле вы не запускаете программу AVX-512 внутри GDB, вы по-прежнему используете команду remote, но я думаю, вы уже сказали ей устанавливать точки останова.   -  person Peter Cordes    schedule 27.04.2021
comment
Только что попробовал это на своей машине с GDB 10.1 и SDE 8.33, подтвердил. То же сообщение об ошибке. Использование gdb ./a.out для установки точек останова перед использованием target remote не помогает и даже не устраняет предупреждение о передаче файлов. О, так много для этого предположения. Я почти уверен, что раньше это работало, что в прошлом я использовал SDE для одношагового кода AVX-512.   -  person Peter Cordes    schedule 28.04.2021
comment
Я также пробовал clang++ / lldb, и он тоже вылетает :(   -  person him    schedule 28.04.2021


Ответы (1)


Похоже, он не работает с исполняемыми файлами PIE
(подтверждено в Arch GNU/Linux с GCC 10.2, GDB 10.1, SDE 8.33.)

Соберите с помощью g++ -O2 -fno-pie -no-pie -g -march=skylake-avx512, и все заработает. (Мне пришлось запустить gdb ./a.out вместо голого GDB; без этого он не мог найти нужный файл даже после подключения к удаленному.)

$ g++ -O2 -march=skylake-avx512 -no-pie -fno-pie -g  avx512.cpp
$ /opt/sde-external-8.33.0-2019-02-07-lin/sde64 -debug -- ./a.out
Application stopped until continued from debugger.
Start GDB, then issue this command at the (gdb) prompt:
  target remote :59783

Затем в другой вкладке терминала

$ 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

Отладка на уровне asm и на уровне исходного кода работает нормально, переходя к встроенным функциям в avx512fintrin.h и так далее при использовании stepi (он же si).


Без указания имени файла отдельно от подключения к удаленному:

$ 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)

(IDK, если имеет значение, что мой .gdbinit включает layout reg, полноэкранный режим терминала TUI. Приятно, когда он работает, но несколько глючит.)


Или в качестве суперхитрого обходного пути с исполняемыми файлами PIE я также смог поместить цикл задержки в начало main, что дало вам возможность подключиться, а затем нажать Control-C до того, как SDE завершит выполнение вашей программы.

Затем я мог установить точки останова и начать пошаговое выполнение. (Предположительно сработает системный вызов sleep или read). Отладка на уровне исходного кода все еще казалась неисправной, но я смог отлаживать asm с помощью layout reg. Я использовал set $rip = ... с скопированным адресом, чтобы выйти из цикла _mm_pause() после присоединения и нажатия Control-C.

person Peter Cordes    schedule 28.04.2021