Как связать источник программы NVRTC с файлом?

Я использую NVRTC для компиляции ядра. Соответствующий вызов API:

      nvrtcResult nvrtcCreateProgram ( 
    nvrtcProgram* prog,
    const char* src,
    const char* name, 
    int  numHeaders, 
    const char** headers,
    const char** includeNames )

Как видите, источник — это необработанная строка, не связанная с файлом. Это означает, что когда вы --generate-line-info, вы получаете номера строк, но не связанное имя файла. А это значит, что если вы потом будете использовать, скажем, NSight Compute — вы не сможете увидеть исходный код своего ядра.

Очевидно, что ни сам NSight Compute, ни сам NVRTC не могут разобраться, что сырой исходник зеркалируется в каком-то файле. Но должен быть какой-то способ обойти это:

  • Возможно, я что-то упускаю в NVRTC API, который может сделать ассоциацию исходного файла <->?
  • Возможно, мы можем манипулировать получившейся скомпилированной программой (разумно, а не вручную или написать свой собственный новый API), чтобы создать ассоциацию?
  • Может быть, можно как-то засунуть исходники в скомпилированную программу?

2 ответа

Вот мой первоначальный обходной путь:

  1. Поместите свой источник в файл, скажем my_kernel.cuh.
  2. Создайте строку:
            #include "my_kernel.cuh"
    
  3. Скомпилируйте только эту строку, используя NVRTC

Теперь NVRTC может связывать источники включенных файлов с файлами, поэтому будет отсутствовать только заглушка с точки зрения ассоциации источник <-> файл.

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

Кажется, что NVRTC предоставляет имя файла по умолчанию, поэтому, если вы поместите свой источник в файл с таким именем, NSight Compute сможет его найти.

Имя - это то, что вы передали nvrtcCreateProgram()как nameаргумент.

Итак, если ваша функция ядра (т.е. __global__функция) находится в my_kernel.cuh, и вы помещаете этот файл в рабочий каталог программы-профиля (о котором вы сообщаете NSight Compute) или в один из включаемых каталогов, с помощью которых вы построили свою программу, вы сможете прочитать исходный код. Если собственный каталог исходного файла также является одним из включаемых каталогов, то вам повезло, и вам даже не нужно делать копию.

Другие вопросы по тегам