2016-10-17 11 views
5

В частности, моя проблема в том, что у меня есть код CUDA, для которого требуется <curand_kernel.h>. Это не включено по умолчанию в NVRTC. Предположительно тогда при создании контекста программы (т. Е. Вызова nvrtcCreateProgram) мне нужно отправить имя файла (curand_kernel.h), а также исходный код curand_kernel.h? Я чувствую, что мне не нужно это делать.Как вы включаете стандартные библиотеки CUDA для связи с кодом NVRTC?

Трудно сказать; Мне не удалось найти пример из NVIDIA для кого-то, нуждающегося в стандартных файлах CUDA, подобных этому в качестве источника, поэтому я действительно не понимаю, что такое синтаксис. Некоторые вопросы: curand_kernel.h также включает в себя ... Нужно ли делать то же самое для каждого из них? Я даже не уверен, что компилятор NVRTC будет работать нормально на curand_kernel.h, потому что есть некоторые особенности языка, которые он не поддерживает, не так ли?

Далее: если вы отправили исходный код файла заголовка в nvrtcCreateProgram, я все еще должен #include его в коде, который будет выполняться, или это приведет к ошибке, если я это сделаю?

Ссылка на пример кода, который делает это или что-то в этом роде, будет оценен гораздо больше, чем простой ответ; Мне действительно не удалось найти.

ответ

6

Вы должны отправить «имя файла» и источник каждого заголовка отдельно.

Когда препроцессор выполняет свою задачу, он будет использовать любые имена файлов #include в качестве ключа для поиска источника для заголовка на основе коллекции, которую вы предоставляете.

Я подозреваю, что в этом случае у компилятора (драйвера) нет доступа к файловой системе, поэтому вы должны предоставить ему источник так же, как и для шейдера в OpenGL.

Итак:

  • Включите имя вашего заголовка при вызове nvrtcCreateProgram. Компилятор будет внутренне генерировать эквивалент std::map<string,string>, содержащий источник каждого заголовка, проиндексированного данным именем.

  • В исходном коде ядра, как обычно, используйте #include "foo.cuh".

  • компилятор будет использовать foo.cuh как индекс или ключ в его внутреннюю карту (созданной при nvrtcCreateProgram называется), и будет извлекать источник заголовка из этой коллекции

  • Compilation доходов, как обычно.

Одна из причин, по которой nvrtc обеспечивает лишь «подмножество» особенностей является то, что компилятор играет в несколько изолированного окружения, не обязательно имеющие все вспомогательных инструментов и утилит, лежащих вокруг, что вы с форума компиляции , Таким образом, вы должны вручную обрабатывать много вещей, которые обеспечивает стандартная комбинация nvcc + (gcc | MSVC| clang).

Возможным, но не идеальным решением было бы предварительно обработать файл, который вам нужен в вашей среде IDE, сохранить результат, а затем #include. Однако, я уверен, есть лучший способ сделать это. если вы просто хотите curand, подумайте о том, чтобы погрузиться в библиотеку и извлечь нужную вам часть (blech) или использовать другую версию rand, совместимую с GPU.На старых версиях CUDA я просто создал большой массив случайных поплавков на хосте, загрузил его на GPU и пробовал в ядрах.

This related link may be helpful.

+0

Хммм. Поэтому я подумываю о том, как я это делаю. Предварительная компиляция кода, который использует curand в PTX, не представляется возможным ... Предварительно генерирующие поплавки на процессоре невозможны, потому что их должно быть слишком много ... Поэтому я остаюсь работать через библиотеку curand чтобы получить детали, которые мне нужно скомпилировать с помощью NVRTC, и найти другую реализацию rand. Как все, что мне действительно нужно от curand, является стандартным унифицированным PRNG от 0 до 1, я думаю, что решение - найти другой PRNG, который проще скомпилировать с использованием NVRTC, спасибо! –

+0

Хм. Реализации ГРП ГПУ трудно найти. Возможно, мне придется каким-то образом адаптировать CURAND ... –

+0

@BillySmith Самое прямое решение - построить большой буфер и заполнить его с помощью rand() или аналогичной процессорной стороны, а затем загрузить его на хост. Храните индексную переменную, указывающую, какое значение находится в буфере. Когда вы попадаете в конец буфера, промойте и повторите. –

 Смежные вопросы

  • Нет связанных вопросов^_^