Как связать источник программы 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 ответа
Вот мой первоначальный обходной путь:
- Поместите свой источник в файл, скажем
my_kernel.cuh
. - Создайте строку:
#include "my_kernel.cuh"
- Скомпилируйте только эту строку, используя NVRTC
Теперь NVRTC может связывать источники включенных файлов с файлами, поэтому будет отсутствовать только заглушка с точки зрения ассоциации источник <-> файл.
Предостережение: вам нужно быть осторожным с путями — NVRTC включает пути, рабочий каталог, из которого вы вызываете свою программу, а не каталог исходного файла и т. д.
Кажется, что NVRTC предоставляет имя файла по умолчанию, поэтому, если вы поместите свой источник в файл с таким именем, NSight Compute сможет его найти.
Имя - это то, что вы передали
nvrtcCreateProgram()
как
name
аргумент.
Итак, если ваша функция ядра (т.е.
__global__
функция) находится в
my_kernel.cuh
, и вы помещаете этот файл в рабочий каталог программы-профиля (о котором вы сообщаете NSight Compute) или в один из включаемых каталогов, с помощью которых вы построили свою программу, вы сможете прочитать исходный код. Если собственный каталог исходного файла также является одним из включаемых каталогов, то вам повезло, и вам даже не нужно делать копию.