Динамический параллелизм CUDA с драйвером API
Я пытаюсь скомпилировать и связать динамическое ядро и использовать его с API драйвера CUDA на GK110.
Я компилирую исходный файл.cu в Visual Studio с флагом кода перемещаемого устройства и compute_35, sm_35 в файл ptx, а затем компоновщик CUDA добавляет cudadevrt.lib (по крайней мере, он пытался это сделать в соответствии с вызовом компоновщика). Когда я делаю cuModuleLoad на ptx .obj, он говорит о неподдерживаемом коде устройства. Существует также .device-link.obj, который кажется нереально маленьким, и ни одна из функций API драйвера, по-видимому, не распознает его как допустимое изображение. При проверке ptx-файла я вижу, что он сгенерировал вызов функции запуска ядра в соответствии с документацией CUDA (динамический параллелизм из раздела PTX).
Как я могу связать правильный код устройства так, чтобы динамический вызов ядра работал?
(это CUDA 6.5 на Win64 с VC2013)
1 ответ
Вы должны выполнить связывание при загрузке ptx-файла, используя cuda linker, предоставляемый драйвером API:
- Скомпилируйте исходный файл cu с перемещаемым флагом в ptx
В вашем приложении:
- Создайте экземпляр компоновщика с помощью cuLinkCreate ()
- Добавьте ptx-файл, используя cuLinkAddFile() или cuLinkAddData()
- Добавьте cudadevrt.lib, используя cuLinkAddFile() или cuLinkAddData()
- Вызовите cuLinkComplete(), который возвращает вам двоичный файл, который затем можно загрузить как обычно (например, cuModuleLoadDataEx())
- Уничтожить экземпляр компоновщика с помощью cuLinkDestroy ()