вызов ядра внутри ядра CUDA

#c #cuda #visual-studio-2019

#c #cuda #visual-studio-2019

Вопрос:

Я пытаюсь сделать что-то подобное:

 __global__ void foo()
{
    // do stuff
}

__global__ void boo()
{
    foo<<<m, n>>>();
}
  

но я получаю сообщение об ошибке «запуск ядра из __device__ или __global__ functions требует отдельного режима компиляции»

Я попытался найти ответ в Google и увидел некоторые результаты, в которых говорилось о «динамическом параллелизме», и в нем говорится, что для этого требуется вычислительная мощность 3 или выше, которая у меня есть (вычислительная мощность GTX 750 Ti 5).
Я также хочу, чтобы мне нужно было включить флаг «rdc», хотя он устраняет ошибку, это приводит к сбою компиляции, несмотря ни на что (даже если я все комментирую)

Итак, как я могу достичь своей цели или в чем может быть проблема?
(используя cuda 11.0)
Я также добавил «cudadevrt.lib; cudart.lib;» для ввода в компоновщике в свойствах проекта

РЕДАКТИРОВАТЬ:
ошибка, которую он выдает, когда для rdc установлено значение true:

Ошибка MSB3721 Команда «»C:Program Файлы Вычисления на графическом процессоре NVIDIA ToolkitCUDAv11.0binnvcc.exe » -dlink -o «x64Debugcrimson cuda.device-link.obj» -Xcompiler «/EHsc /W3 /nologo /Od /Zi /Fdx64Debugvc142.pdb /RTC1 /MDd » -L»C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.0bin/crt» -L»C:Program FilesNVIDIA GPU Computing ToolkitCUDA v11.0 lib x64″ cudadevrt.lib cudart.lib cudart_static.lib kernel32.lib user32.lib gdi32.lib winspool.библиотека comdlg32.библиотека advapi32.библиотека shell32.библиотека ole32.библиотека oleaut32.библиотека uuid.библиотека odbc32.библиотека odbccp32.lib -gencode=arch=compute_50,code=sm_50 -G —machine 64 x64 Debug CrimsonNet.cu.obj x64Debugkernel.cu.obj» завершается с кодом 1.

РЕДАКТИРОВАТЬ 2: я продолжил расследование, и, похоже, проблема возникает при связывании файлов, которые я не до конца понимаю, как это работает при использовании rdc.

Комментарии:

1. Можете ли вы опубликовать ошибки компиляции, которые вы видите?

2. @cwharris помимо того, что я уже написал, в нем просто говорится, что nvcc завершается с кодом 1

3. изучите любые примеры кодов CUDA и связанные с ними файлы проекта, которые используют динамический параллелизм CUDA, например cdpSimplePrint

4. @RobertCrovella Кажется, я сделал это правильно, я продолжил расследование, и, похоже, проблема заключается в том, что при связывании файлов я не до конца понимаю, как это работает при использовании rdc

Ответ №1:

Используя MS VS 2019 и CUDA 11.0, следующие шаги позволили мне создать пример динамического параллелизма (CDP):

  1. Создайте новый проект CUDA Runtime

  2. В kernel.cu файл, который сгенерирован, модифицируйте ядро следующим образом:

      __global__ void child_kernel() {printf("hellon");}
    
     __global__ void addKernel(int *c, const int *a, const int *b)
     {
         child_kernel << <1, 1 >> > ();
         int i = threadIdx.x;
         c[i] = a[i]   b[i];
     }
      
  3. В проекте…Свойства…CUDA C … Общий набор генерирует код перемещаемого устройства на «Да»

  4. В проекте…Свойства…Компоновщик CUDA…Общие добавить cudadevrt.lib к дополнительным зависимостям

  5. Создайте или перестройте проект, затем вы должны увидеть вывод, подобный этому:

      1>------ Rebuild All started: Project: test23, Configuration: Debug x64 ------
     1>Compiling CUDA source file kernel.cu...
     1>
     1>C:UsersRobert Crovellasourcerepostest23>"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.0binnvcc.exe" -gencode=arch=compute_52,code="sm_52,compute_52" --use-local-env -ccbin "C:Program Files (x86)Microsoft Visual Studio2019ProfessionalVCToolsMSVC14.20.27508binHostX86x64" -x cu -rdc=true  -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.0include" -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.0include"  -G   --keep-dir x64Debug -maxrregcount=0  --machine 64 --compile -cudart static  -g   -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Fdx64Debugvc142.pdb /FS /Zi /RTC1 /MDd " -o x64Debugkernel.cu.obj "C:UsersRobert Crovellasourcerepostest23kernel.cu"
     1>kernel.cu
     1>
     1>C:UsersRobert Crovellasourcerepostest23>"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.0binnvcc.exe" -dlink -o x64Debugtest23.device-link.obj -Xcompiler "/EHsc /W3 /nologo /Od /Zi /Fdx64Debugvc142.pdb /RTC1 /MDd " -L"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.0bin/crt" -L"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.0libx64" cudadevrt.lib cudart_static.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib cudart.lib  -gencode=arch=compute_52,code=sm_52 -G --machine 64 x64Debugkernel.cu.obj
     1>cudadevrt.lib
     1>cudart_static.lib
     1>kernel32.lib
     1>user32.lib
     1>gdi32.lib
     1>winspool.lib
     1>comdlg32.lib
     1>advapi32.lib
     1>shell32.lib
     1>ole32.lib
     1>oleaut32.lib
     1>uuid.lib
     1>odbc32.lib
     1>odbccp32.lib
     1>cudart.lib
     1>kernel.cu.obj
     1>   Creating library C:UsersRobert Crovellasourcerepostest23x64Debugtest23.lib and object C:UsersRobert Crovellasourcerepostest23x64Debugtest23.exp
     1>test23.vcxproj -> C:UsersRobert Crovellasourcerepostest23x64Debugtest23.exe
     ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
      

Примечания:

  1. CUDA 11.0 (и выше) предназначен только для устройств, которые будут поддерживать CDP. Для более ранних версий вам может потребоваться установить цель генерации кода устройства в соответствии с графическим процессором, который будет поддерживать CDP (например compute_35,sm_35 )

  2. В MS VS ошибка MSB3721 сама по себе не так полезна. Это просто указывает на то, что «что-то пошло не так». Чтобы получить больше полезной информации из Visual Studio, вам следует увеличить детализацию вывода на консоль. Точный способ сделать это зависит от версии VS, но вы можете найти инструкции с помощью такого поиска, как этот. Цель состоит в том, чтобы увеличить детализацию, чтобы VS показывал вам фактический результат, генерируемый nvcc при возникновении ошибки.

  3. Для CUDA 11.0 / VS2019 добавление cudadevrt.lib не требуется, поскольку оно уже включено в проект. Для других / более старых версий это может быть необходимо.

Если у вас все еще возникают проблемы, я предлагаю вам увеличить детализацию, чтобы получить лучшее представление о точной проблеме. Вы также должны попробовать шаги, перечисленные выше, чтобы убедиться, что вы их понимаете (т. Е. Начиная с нового проекта). Если у вас все еще возникают проблемы, отправьте новый вопрос с вашим фактическим кодом, а также выводом консольной компиляции после увеличения детализации.

Ответ №2:

Я до сих пор не знаю, что вызвало проблему, но после удаления всего, что связано с Nvidia, кроме драйвера, а затем переустановки всего через установщик CUDA ошибка исчезла, и теперь она работает нормально.