2013-10-10 3 views
7

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

error : calling a __global__ function("kernel_6") from a __global__ function("kernel_5") is only allowed on the compute_35 architecture or above

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

ответ

3

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

-gencode arch=compute_35,code=sm_35 

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

http://docs.nvidia.com/cuda/cuda-samples/index.html#simple-quicksort--cuda-dynamic-parallelism-

+5

Чтобы использовать динамический параллелизм '--relocatable-устройства код = true' или короткое замыкание' -rdc' также необходимо. Также для предотвращения дальнейших ошибок не забывайте ссылаться на библиотеку cudadevrt. –

11

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

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 programming guide

+0

Привет, спасибо за ответ Я делаю это, но получаю эту ошибку Неустранимая ошибка: nvcc поддерживает '-relocatable-device-code = true (-rdc = true)', '--device-c (-dc)', и '-device-link (-dlink)' только при таргетинге sm_20 или выше – user2865500

+0

Не могли бы вы приложить то, что именно вы делаете? простую программу и команду, которую вы используете? Потому что я просто попробовал вышеуказанную команду для простой программы [здесь] (http://pastebin.com/3Z2aGa4F) –

+0

И не добавляйте свои комментарии как ответы, пожалуйста. –

5

С 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 
+0

Я очень благодарен за вашу помощь .. Я сделал это сейчас, я получаю эту ошибку.пожалуйста, не обращайте внимание ... nvcc: фатальная ошибка: nvcc поддерживает '-relocatable-device-code = true (-rdc = true) ',' --device-c (-dc) 'и' --device-link (-dlink) 'только при таргетинге на sm_20 или выше – user2865500

+0

Убедитесь, что вы правильно выполнили шаг 3. Можете ли вы успешно скомпилировать Пример CUDA cdpLUDecomposition? Он использует динамический параллелизм для вычисления LU-разложения. – JackOLantern

+0

Да, сэр. Я создаю пример CUDA cdpLUDeomposition. Это не дает никаких ошибок. Но дает мне этот Native 'вышел с кодом 0 (0x0). Я сделал все шаги успешно. – user2865500

Смежные вопросы