Сбой компиляции кода, содержащего динамический параллелизм

Я занимаюсь программированием динамического параллелизма с использованием CUDA 5.5 и NVDIA GeForce GTX 780, вычислительная мощность которых составляет 3,5. Я вызываю функцию ядра внутри функции ядра, но она дает мне ошибку:

ошибка: вызов функции __global__ ("kernel_6") из функции __global__ ("kernel_5") разрешен только в архитектуре compute_35 или выше

Что я делаю неправильно?

3 ответа

Вы можете сделать что-то вроде этого

nvcc -arch=sm_35 -rdc=true simple1.cu -o simple1 -lcudadevrt

или же

Если у вас есть 2 файла simple1.cu и test.c, вы можете сделать что-то, как показано ниже. Это называется отдельной компиляцией.

nvcc -arch=sm_35 -dc simple1.cu 
nvcc -arch=sm_35 -dlink simple1.o -o link.o -lcudadevrt
g++ -c test.c 
g++ link.o simple1.o test.o -o simple -L/usr/local/cuda/lib64/ -lcudart

То же самое объясняется в руководстве по программированию cuda.

Из Visual Studio 2010:

1) View -> Property Pages
2) Configuration Properties -> CUDA C/C++ -> Common -> Generate Relocatable Device Code -> Yes (-rdc=true)
3) Configuration Properties -> CUDA C/C++ -> Device -> Code Generation -> compute_35,sm_35
4) Configuration Properties -> Linker -> Input -> Additional Dependencies -> cudadevrt.lib

Вы должны позволить nvcc генерировать код CC 3.5 для вашего устройства. Это можно сделать, добавив эту опцию в командную строку nvcc.

 -gencode arch=compute_35,code=sm_35

Вы можете найти примеры CUDA по динамическому параллелизму для более подробной информации. Они содержат параметры командной строки и параметры проекта для всех поддерживаемых ОС.

http://docs.nvidia.com/cuda/cuda-samples/index.html

Другие вопросы по тегам