Как я могу получить дескриптор модуля драйвера CUDA для функций и глобальных переменных в скомпилированной программе?

#cuda #globals #nvrtc #cuda-driver

#cuda #глобальный #nvrtc #cuda-driver

Вопрос:

CUDA Runtime API имеет функции cudaGetSymbolAddress() и cudaGetSymbolSize() для работы с глобальными файлами на стороне устройства из кода на стороне хоста, используя их имена (идентификаторы исходного кода) в качестве дескрипторов.

В API драйвера у нас есть cuModuleGetGlobal() , что позволяет нам делать то же самое… за исключением того, что он принимает CUmodule, в котором находится глобальный символ. Если вы работаете с кодом, который вы динамически компилировали и загружали / добавляли в модуль, тогда все готово. Но что, если эти глобальные файлы являются частью вашей программы, скомпилированной статически с использованием NVCC, а не загруженной динамически?

Я бы предположил, что для каждой скомпилированной программы существует какой-то «основной модуль» или «модуль по умолчанию» с его встроенными глобалами и функциями. Могу ли я получить дескриптор для этого?

Комментарии:

1. .cu файл компилируется либо nvcc в ptx, либо в cubin (для стандартного использования API драйвера). Любой из них загружается API драйвера с помощью cuModuleLoadXX функции. Не уверен, о чем вы спрашиваете.

2. API среды выполнения использует довольно хрупкий частный шаблон для выполнения своей магии, нет API-интерфейсов, которые делают то, что вы себе представляете

3. Вы спрашиваете о модуле из сборки API среды выполнения? В противном случае я не понимаю вашего вопроса. Вы буквально используете код, идентичный вызову nvrtc, за исключением того, что модуль возвращается из вызова, при котором вы загружаете внешний cubin или ptx из имени файла или дескриптора, а не из выходных данных компилятора среды выполнения

4. @talonmies: Я попытаюсь объяснить здесь в комментарии и, пожалуйста, скажите мне, должен ли я перефразировать сам вопрос. Я ничего не загружаю динамически. У меня есть файл .cu с глобальной переменной на стороне устройства и, скажем, ядром, которое ее использует. Теперь я хочу использовать cuModuleGetGlobal() для получения информации об этом глобальном.

5. @RobertCrovella: (снова отвечаю, чтобы уточнить). Я спрашиваю не о модуле, который я загружаю сам динамически, а скорее о модуле, который создается средой выполнения, когда я компилирую .cu файл в программу и запускаю его.

Ответ №1:

Я бы предположил, что для каждой скомпилированной программы существует какой-то «основной модуль» или «модуль по умолчанию» с его встроенными глобалами и функциями.

Существует, и если вы разделите шаблонный код хоста, созданный API среды выполнения, который заставляет его работать, и некоторые трассировки времени выполнения, вы увидите, что он опирается на множество статически определенных символов и пару недокументированных функций API среды выполнения, которые внутренне поддерживают модуль, используемый API среды выполнения.

Могу ли я получить дескриптор для этого?

Используя API драйвера, нет. Если вам нужно взаимодействовать с API среды выполнения, используйте API среды выполнения.

Комментарии:

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

2. Возможно, вы можете изменить процесс сборки, извлекая PTX ваших пользователей.