Динамический параллелизм 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 ()
Другие вопросы по тегам