Как вы заставляете NVCC включать информацию определения макросов?

#macros #cuda #nvcc

#макросы #cuda #nvcc

Вопрос:

Обычно в gcc вы можете указать уровень отладочной информации с помощью -g, и если вы используете -g3, это будет включать определения макросов препроцессора в исполняемый файл, который отладчики, такие как gdb, могут прочитать и разрешить вам использовать во время отладки. Я хотел бы сделать это с помощью nvcc для отладки программ CUDA.

В настоящее время я работаю над изменением программы-шаблона в SDK, поэтому я использую Makefile по умолчанию и common.mk включено из файла Makefile. В common.mk в блоке ‘ifeq ($(dbg), 1)’ я попробовал следующее:

  • поместите -g3 в COMMONFLAGS
  • поместите -g3 в NVCCFLAGS
  • поместите -g3 в CXXFLAGS и CFLAGS
  • поместите —compiler-options -g3 в NVCCFLAGS.

Первые два выдают ошибку нераспознанного параметра. Вторые два, похоже, не помогают, потому что при отладке с использованием cuda-gdb я не получаю информацию о макросе.

Причина, по которой я хотел бы это сделать, заключается в том, что я хотел бы проверить некоторую память, используя те же макросы, которые сама программа использует для доступа к этой памяти. Например,

  #define ARROW(state, arrow) ((c_arrow_t *)(amp;((state)->arrows)   (arrow) * sizeof(c_arrow_t)))                                                                                                  
 #define STATE(nfa, state) ((c_state_t *)(amp;((nfa)->states)   (state) * sizeof(c_state_t))) 
  

вот некоторые макросы, которые я использую для доступа к состояниям и стрелкам недетерминированного конечного автомата.

Спасибо за вашу помощь!

Ответ №1:

Вероятно, вам нужно передать оба параметра -g в nvcc, чтобы настроить его на сборку с отладкой на хосте, и также передать -g3 компилятору хоста через -Xcompiler (или —compiler-options).

Просто наблюдение, но вам действительно не следует использовать этот SDK makefile ни для чего. Это действительно зло — грубый взломанный на некоторых автоинструментах способ создания инструкций make, который является одновременно излишне сложным и очень негибким. Даже разработчики NVIDIA, с которыми я взаимодействую, предупреждают не использовать его.