2017-02-09 49 views
1

Эта проблема возникает, когда я пытаюсь импортировать theano с режимом gpu. При импорте theano, он пытается скомпилировать некоторый код, создать общую библиотеку и попытаться загрузить его. Вот команда сделать такой файл.nvcc выбирает неправильную библиотеку libcudart

nvcc -shared -O3 -m64 -Xcompiler -DCUDA_NDARRAY_CUH=mc72d035fdf91890f3b36710688069b2e,\ 
    -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION,-fPIC,-fvisibility=hidden -Xlinker \ 
    -rpath,/home/jay/.theano/compiledir_Linux-4.8--ARCH-x86_64-with-arch-Arch-Linux--3.6.0-64/cuda_ndarray \ 
    -I/usr/lib/python3.6/site-packages/Theano-0.9.0b1-py3.6.egg/theano/sandbox/cuda \ 
    -I/usr/lib/python3.6/site-packages/numpy-1.13.0.dev0+72839c4-py3.6-linux-x86_64.egg/numpy/core/include \ 
    -I/usr/include/python3.6m -I/usr/lib/python3.6/site-packages/Theano-0.9.0b1-py3.6.egg/theano/gof \ 
    -L/usr/lib -o /home/jay/.theano/compiledir_Linux-4.8--ARCH-x86_64-with-arch-Arch-Linux--3.6.0-64/cuda_ndarray/cuda_ndarray.so \ 
    mod.cu -lcublas -lpython3.6m 

Он компилирует успешно, но не может найти правильную библиотеку для cudart. Кажется, что ldconfig знает местоположение этой библиотеки, что является правильным.

$ ldconfig -p | grep libcuda 
    libcudart.so.8.0 (libc6,x86-64) => /opt/cuda/lib64/libcudart.so.8.0 
    libcudart.so (libc6,x86-64) => /opt/cuda/lib64/libcudart.so 
    libcuda.so.1 (libc6,x86-64) => /usr/lib/libcuda.so.1 
    libcuda.so (libc6,x86-64) => /usr/lib/libcuda.so 

Но тем не менее, когда я осмотреть библиотеку, в ней говорится о проблеме, связанной с libcudart.

$ ldd cuda_ndarray.so | grep cuda 
    libcublas.so.8.0 => /opt/cuda/lib64/libcublas.so.8.0 (0x00007f006dd1b000) 
    libcudart.so.7.5 => not found 

чтения Эльф заголовка

$ readelf -a cuda_ndarray.so | grep NEEDED 
0x0000000000000001 (NEEDED)    Shared library: [libcublas.so.8.0] 
0x0000000000000001 (NEEDED)    Shared library: [libpython3.6m.so.1.0] 
0x0000000000000001 (NEEDED)    Shared library: [libcudart.so.7.5] 
0x0000000000000001 (NEEDED)    Shared library: [librt.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0] 
0x0000000000000001 (NEEDED)    Shared library: [libdl.so.2] 
0x0000000000000001 (NEEDED)    Shared library: [libstdc++.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libgcc_s.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 

Что пошло не так, что он выбирает неправильную библиотеку, cudart7.5 вместо cudart8.0?

вот выход моего nvcc -V

$ nvcc -V 
nvcc: NVIDIA (R) Cuda compiler driver 
Copyright (c) 2005-2016 NVIDIA Corporation 
Built on Sun_Sep__4_22:14:01_CDT_2016 
Cuda compilation tools, release 8.0, V8.0.44 

и мой libcudart.so указывает на правильную библиотеку версии

$ ls -la | grep libcudart 
lrwxrwxrwx 1 root root  16 Jan 10 06:10 libcudart.so -> libcudart.so.8.0 
lrwxrwxrwx 1 root root  19 Jan 10 06:10 libcudart.so.8.0 -> libcudart.so.8.0.44 
-rwxr-xr-x 1 root root 415432 Jan 10 06:10 libcudart.so.8.0.44 
-rw-r--r-- 1 root root 775162 Jan 10 06:10 libcudart_static.a 

и еще один общий вопрос, как же компоновщик разрешает фактическое местоположение файла ввода например -lm или -lcudart или любые сокращенные обозначения, используемые при компиляции?

Я попробовал два из примеров программ, поставляемых с CUDA, которая включает в себя библиотеку libcudart

$ grep -rnw . -e 'lcudart' 
./3_Imaging/cudaDecodeGL/Makefile:329:LIBRARIES += -lcudart -lnvcuvid 
./0_Simple/simpleMPI/Makefile:284:LIBRARIES += -L$(CUDA_PATH)/lib$(LIBSIZE) -lcudart 

из этих двух simpleMPI создалась без ошибок.

$ ./simpleMPI 
Running on 1 nodes 
Average of square roots is: 0.667242 
PASSED 

Другая не удался с ранее ошибками

$ ./cudaDecodeGL 
./cudaDecodeGL: error while loading shared libraries: libcudart.so.7.5: cannot open shared object file: No such file or directory 
+0

У вас должна быть сломанная установка CUDA. Что такое /opt/cuda/lib64/libcudart.so что вы связываете? И какая версия nvcc вы используете? – talonmies

+0

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

+0

Итак, если вы компилируете мир приветствия cuda из командной строки, все ссылки и работает правильно? В этом случае должна быть зависимость от CUDA 7.5 в том, что вы компилируете или связываете, например, с материалом Theano – talonmies

ответ

1

Я установил CUDA8, над моей старой установкой CUDA7.5, поэтому он переехал старые Cuda библиотеки cuda/lib64/stubs. После удаления этого каталога все работало так, как я ожидал.

+0

, так что у вас действительно была сломанная установка CUDA .. пожалуйста, забудьте вернуться через несколько дней, чтобы принять этот ответ sp, он падает с оставшейся без очереди очереди для тега CUDA – talonmies

+1

Установщик не перемещает старые библиотеки cuda в CUDA/lib64/окурки. Этот каталог будет присутствовать даже при новой установке CUDA 8 в чистой системе, и удаление этого означает, что ваша установка CUDA 8 теперь прерывается для некоторых задач. –

+0

Спасибо, Роберт за разъяснения. Я не удалял этот каталог, но перемещался где-то еще, я могу вернуться назад, когда это необходимо. Это означает, что моя проблема на самом деле не решена. Можете ли вы пролить свет на то, как «-lcudart» разрешается, и мы передаем его в nvcc? –

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

  • Нет связанных вопросов^_^