CUDA компилирует несколько файлов .cu в один файл

Я переношу некоторые вычисления с C# на CUDA. В С# есть много классов, которые я хочу портировать, для каждого класса С# я создаю файлы .cu и .cuh в своем проекте CUDA. Все классы связаны, и все они используются в расчетах. Мне нужно сохранить структуру моего кода C#, потому что в другом случае будет очень легко допустить ошибку.

P.S. В случае, если я помещаю весь код в один файл - все работает как положено, но чтение или исправление некоторых проблем становится настоящей проблемой.

Я хочу скомпилировать проект CUDA и использовать его в своем С# через библиотеку ManagedCuda. Я могу скомпилировать тестовый проект CUDA с одним файлом .cu в файл .ptx, загрузить его в C# через ManagedCuda и вызвать из него функцию.

Но когда я хочу скомпилировать свои настоящие проекты с несколькими файлами cu, в результате я получил несколько файлов .ptx для каждого файла .cu в проекте, более того, я не могу загрузить этот файл .ptx через ManagedCuda, я получил следующую ошибку:

ErrorInvalidPtx: указывает на сбой JIT-компиляции PTX.

Но эта ошибка ожидаема, т.к. в ptx файлах есть перекрестные ссылки, и они имеют смысл только если грузятся вместе.

Моя цель - скомпилировать мой проект CUDA в один файл, но в то же время я не хочу ограничиваться только конкретной видеокартой, которая у меня есть. Для этого мне нужно использовать PTX (или cubin с включенным ptx), этот файл PTX будет скомпилирован для конкретного устройства в момент его загрузки.

Я попытался установить для параметра «Создать код перемещаемого устройства» значение «Да» (-rdc = true) и скомпилировать в PTX и Cubin — в результате я получаю несколько независимых файлов для каждого файла .cu.


person GDocal    schedule 22.03.2018    source источник


Ответы (1)


Очень короткий ответ - нет, вы не можете этого сделать. Цепочка инструментов не может объединить код PTX на этапе компиляции.

Если вы создаете несколько файлов PTX, вам нужно будет использовать средства компоновщика JIT среды выполнения CUDA для создания модуля, который можно загрузить в ваш контекст. Я понятия не имею, поддерживает ли Managed CUDA это или нет.

Изменить, чтобы добавить, что Managed CUDA поддерживает связывание во время выполнения (см. здесь).

person Community    schedule 27.03.2018