Как включить стандартные библиотеки CUDA для связи с кодом NVRTC?
В частности, моя проблема в том, что у меня есть код CUDA, который нуждается в <curand_kernel.h>
бежать. Это не включено по умолчанию в NVRTC. Предположительно тогда при создании контекста программы (т.е. при вызове nvrtcCreateProgram
), Я должен отправить имя файла (curand_kernel.h
), а также исходный код curand_kernel.h
? Я чувствую, что не должен был этого делать.
Сложно сказать; Мне не удалось найти пример от NVIDIA того, кто нуждается в стандартных файлах CUDA, подобных этому, в качестве источника, поэтому я действительно не понимаю, каков синтаксис. Некоторые вопросы: curand_kernel.h
также включает в себя... Должен ли я сделать то же самое для каждого из них? Я даже не уверен, что компилятор NVRTC будет работать правильно curand_kernel.h
потому что есть некоторые языковые функции, которые он не поддерживает, не так ли?
Далее: если вы отправили исходный код файла заголовка на nvrtcCreateProgram
мне все еще нужно #include
это в коде, который будет выполнен / это вызовет ошибку, если я сделаю это?
Ссылка на пример кода, который делает это или что-то подобное, была бы оценена гораздо больше, чем простой ответ; Мне действительно не удалось найти ни одного.
2 ответа
Вы должны отправить "имя файла" и источник каждого заголовка отдельно.
Когда препроцессор сделает свое дело, он будет использовать любой #include
имена файлов в качестве ключа для поиска источника заголовка на основе предоставленной вами коллекции.
Я подозреваю, что в этом случае компилятор (драйвер) не имеет доступа к файловой системе, поэтому вы должны предоставить ему исходный код почти так же, как для шейдера, включенного в OpenGL.
Так:
Включите название вашего заголовка при звонке
nvrtcCreateProgram
, Компилятор внутренне сгенерирует эквивалентstd::map<string,string>
содержит источник каждого заголовка, проиндексированного по указанному имени.В исходном коде ядра используйте
#include "foo.cuh"
по-прежнему.Компилятор будет использовать
foo.cuh
как индекс или ключ к его внутренней карте (создается при вызовеnvrtcCreateProgram
) и получит источник заголовка из этой коллекцииКомпиляция продолжается как обычно.
Одна из причин того, что nvrtc предоставляет только "подмножество" функций, заключается в том, что компилятор играет в несколько изолированной среде, не обязательно располагая всеми вспомогательными инструментами и утилитами, которые есть у вас при автономной компиляции. Таким образом, вы должны вручную обрабатывать много вещей, которые нормальные nvcc + (gcc | MSVC| clang)
комбинация обеспечивает.
Возможным, но не идеальным решением будет предварительная обработка файла, который вам нужен в вашей IDE, сохранение результата, а затем #include
тот. Тем не менее, держу пари, что есть лучший способ сделать это. если ты просто хочешь curand
подумайте о том, чтобы погрузиться в библиотеку и извлечь нужную часть (блек) или использовать другой графический процессор rand
реализация. В старых версиях CUDA я просто генерировал большой массив случайных чисел на хосте, загружал его в графический процессор и делал выборки в ядрах.
Вам не нужно загружатьcurand_kernel.h
себя и добавьте его в механизм включения «псевдонимов».
Вместо этого вы можете просто добавить включаемый каталог CUDA к вашему (набору) включаемым путям, например, добавив--include-path=/usr/local/cuda/include
к вашим параметрам компилятора NVRTC.
(Я делаю это в своей тестовой программе GPU-kernel-runner по умолчанию, чтобы быть в безопасности.)