2015-03-19 4 views
0

В here Роберт Кровелла сказал, что подпрограммы cublas можно вызывать из кода устройства. Хотя я использую динамический параллелизм и компилирую с возможностью вычисления 3.5, мне не удается вызвать подпрограммы Cublas из функции устройства. Я всегда получаю ошибку «вызова функции хоста из устройства/глобальная функция не допускается» Мой код содержит функции устройства, которые требуют CUBLAS процедуры, как cublsAlloc, cublasGetVector, cublasSetVector и cublasDgemmМожно ли вызвать функции cublas из функции устройства?

Мой сборник и связывающие команды:


 
nvcc -arch=sm_35 -I. -I/usr/local/cuda/include -c -O3 -dc GPUutil.cu -o ./build/GPUutil.o 
 
nvcc -arch=sm_35 -I. -I/usr/local/cuda/include -c -O3 -dc DivideParalelo.cu -o ./build/DivideParalelo.o 
 
nvcc -arch=sm_35 -I. -I/usr/local/cuda/include -dlink ./build/io.o ./build/GPUutil.o ./build/DivideParalelo.o -lcudadevrt -o ./build/link.o 
 
icc -Wwrite-strings ./build/GPUutil.o ./build/DivideParalelo.o ./build/link.o -lcudadevrt -L/usr/local/cuda/lib64 -L~/Intel/composer_xe_2015.0.090/mkl/lib/intel64 -L~/Intel/composer_xe_2015.0.090/mkl/../compiler/lib/intel64 -Wl,--start-group ~/Intel/composer_xe_2015.0.090/mkl/lib/intel64/libmkl_intel_lp64.a ~/Intel/composer_xe_2015.0.090/mkl/lib/intel64/libmkl_sequential.a ~/Intel/composer_xe_2015.0.090/mkl/lib/intel64/libmkl_core.a ~/Intel/composer_xe_2015.0.090/mkl/../compiler/lib/intel64/libiomp5.a -Wl,--end-group -lpthread -lm -lcublas -lcudart -o DivideParalelo \t \t 
 

+2

Неправильные команды компиляции. Вы не связываетесь с '-lcublas_device', и есть другие проблемы. Возможно, вы захотите сослаться на [примеры кода cuda] (http://docs.nvidia.com/cuda/cuda-samples/index.html#simpledevlibcublas-gpu-device-api-library-functions--cuda-dynamic- параллелизм), которые показывают, как использовать cublas с устройства, и включают make-файлы, которые вы можете изучить. [Этот вопрос/ответ] (http://stackoverflow.com/questions/27094612/cublas-matrix-inversion-from-device) дает полностью обработанный пример, включая команды компиляции. –

ответ

1

Here вы можете найти все подробности о cuBLAS устройства API, такие как:

Начиная с версии 5.0, то CUDA Toolkit теперь предоставляет статические cuBLAS библиотеки cublas_device.a, который содержит подпрограммы устройства с тем же API, как регулярная Библиотека cuBLAS. Эти процедуры используют внутреннюю функцию динамического параллелизма для запуска ядра изнутри и, следовательно, доступны только для устройства с вычислительной способностью, по меньшей мере равным 3,5.

Чтобы использовать эти библиотечные процедуры с устройства, пользователь должен включить заголовочный файл «cublas_v2.h», соответствующий новому API cuBLAS, и ссылку на статическую библиотеку cuBLAS cublas_device.a.

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

+0

Спасибо за ваш быстрый ответ. Я добавил #include "cublas_v2.h" в свой файл GPUutil.cu и -lcublas_device для ссылки в Makefile. Однако cublas не обнаружен, и у меня есть ошибка компиляции в любом вызове cublas. Я использую nsight с cuda 6.5 Любая идея, которую я делаю неправильно? – emartel

+0

@emartel вы компилируете для возможности вычисления 3.5? То есть 'sm_35'? –

+0

Да, я компилирую для cc 3.5. Вы можете видеть CUDA_FLAGS в моем Makefile, и он используется, когда я компилирую GPUutil.cu (этот файл содержит вызовы подпрограмм cublas). – emartel