Как включить стандартные библиотеки 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 по умолчанию, чтобы быть в безопасности.)

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