LINUX.ORG.RU

Проблемы с cuda на оптимусе

 , ,


0

1

Решил сейчас проверить, как будет работать мой велосипед, немного использующий cuda, на новом буке. Но не могу скомпилировать:

make
Linking CXX executable fitsview
CMakeFiles/fitsview.dir/./fitsview_generated_CUDA.cu.o: In function `getprops':
/tmp/fitsview/src/CUDA.cu:89: undefined reference to `cuDeviceGet'
/tmp/fitsview/src/CUDA.cu:90: undefined reference to `cuCtxCreate_v2'
/tmp/fitsview/src/CUDA.cu:103: undefined reference to `cuMemGetInfo_v2'
/tmp/fitsview/src/CUDA.cu:105: undefined reference to `cuCtxDetach'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
make[2]: *** [src/fitsview] Ошибка 1
make[1]: *** [src/CMakeFiles/fitsview.dir/all] Ошибка 2
make: *** [all] Ошибка 2
В общем, какие-то ошибки с линковкой. Специально на свой домашний поставил куду той же версии:
pacman -Q cuda
cuda 5.0.35-3
Там все компилируется и линкуется без проблем.

Может, чего-то не хватает?

☆☆☆☆☆

Последнее исправление: Eddy_Em (всего исправлений: 1)

А при чем тут оптимус? cuda-приложение можно скомпилировать даже если отсутствует железо от nvidia.

make VERBOSE=1 что говорит?

Reset ★★★★★
()
Ответ на: комментарий от Reset

Сделал

set(CUDA_VERBOSE_BUILD ON)
Толку 0

А, вот:

set(CMAKE_VERBOSE_MAKEFILE ON)
Получил на стадии линковки:
/usr/bin/cmake -H/tmp/fitsview -B/tmp/fitsview --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /tmp/fitsview/CMakeFiles /tmp/fitsview/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Вход в каталог `/tmp/fitsview'
make -f src/CMakeFiles/fitsview.dir/build.make src/CMakeFiles/fitsview.dir/depend
make[2]: Вход в каталог `/tmp/fitsview'
cd /tmp/fitsview && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /tmp/fitsview /tmp/fitsview/src /tmp/fitsview /tmp/fitsview/src /tmp/fitsview/src/CMakeFiles/fitsview.dir/DependInfo.cmake --color=
make[2]: Выход из каталога `/tmp/fitsview'
make -f src/CMakeFiles/fitsview.dir/build.make src/CMakeFiles/fitsview.dir/build
make[2]: Вход в каталог `/tmp/fitsview'
Linking CXX executable fitsview
cd /tmp/fitsview/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/fitsview.dir/link.txt --verbose=1
/usr/bin/c++    -fopenmp     CMakeFiles/fitsview.dir/open_dialog.c.o CMakeFiles/fitsview.dir/terrain.c.o CMakeFiles/fitsview.dir/opengl.c.o CMakeFiles/fitsview.dir/fitsview.c.o CMakeFiles/fitsview.dir/fits.c.o CMakeFiles/fitsview.dir/filelist.c.o CMakeFiles/fitsview.dir/gauss.c.o CMakeFiles/fitsview.dir/imtools.c.o CMakeFiles/fitsview.dir/spots.c.o CMakeFiles/fitsview.dir/tracking.c.o CMakeFiles/fitsview.dir/fitsheaders.c.o CMakeFiles/fitsview.dir/gtk.c.o CMakeFiles/fitsview.dir/./fitsview_generated_CUDA.cu.o  -o fitsview -rdynamic /opt/cuda/lib64/libcudart.so -lgtkglext-x11-1.0 -lgdkglext-x11-1.0 -lGLU -lGL -lXmu -lXt -lgtk-x11-2.0 -lpangox-1.0 -lX11 -lgmodule-2.0 -lrt -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 -lcfitsio -lfftw3 -lm -lgsl -lgslcblas -lm -llept -lm /opt/cuda/lib64/libcufft.so -lgsl -lgslcblas -llept /opt/cuda/lib64/libcufft.so -Wl,-rpath,/opt/cuda/lib64 
CMakeFiles/fitsview.dir/./fitsview_generated_CUDA.cu.o: In function `getprops':
/tmp/fitsview/src/CUDA.cu:89: undefined reference to `cuDeviceGet'
/tmp/fitsview/src/CUDA.cu:90: undefined reference to `cuCtxCreate_v2'
/tmp/fitsview/src/CUDA.cu:103: undefined reference to `cuMemGetInfo_v2'
/tmp/fitsview/src/CUDA.cu:105: undefined reference to `cuCtxDetach'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
make[2]: *** [src/fitsview] Ошибка 1
make[2]: Выход из каталога `/tmp/fitsview'
make[1]: *** [src/CMakeFiles/fitsview.dir/all] Ошибка 2
make[1]: Выход из каталога `/tmp/fitsview'
make: *** [all] Ошибка 2

А ведь ты прав: почему-то cmake не добавил -lcuda в опцию линковки (при этом на нормальном компьютере все ОК). Странно. То ли лыжи не едут...

Eddy_Em ☆☆☆☆☆
() автор топика
Последнее исправление: Eddy_Em (всего исправлений: 2)
Ответ на: комментарий от Eddy_Em

Обнаружил "косяк"

У меня установлена nvidia-utils-bumblebee, в которой есть файл /usr/lib/libcuda.so.304.60, но нет /usr/lib/libcuda.so. Сделал

su -c "ln -s /usr/lib/libcuda.so.304.60 /usr/lib/libcuda.so"
прогнал еще раз cmake, и make собрал все.

Но вот проблема в том, что при обновлении все опять поломается. Попробую удалить nvidia-utils-bumblebee и поставить обычный nvidia-utils (хоть это и не рекомендуется).

Класс! Запускаю:

optirun ./fitsview
Открываю картинку и запускаю простую фильтрацию:
CARD returns(err=0):  free mem:2115231744,  total mem:2147155968
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 616): allocate
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 621): copy image to dev
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 629): doing image FFT
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 633): allocate
build_GLG_filter (/tmp/fitsview/src/CUDA.cu, line 540): size=2048, x0=896,x1=1152, y0=896,y1=1152, half=-1024, ss=8.9407e-08, sx2=25, sy2=25
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 656): doing filter FFT
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 661): multiplication
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 666): doing inverse FFT
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 672): allocate
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 677): copy to host

Eddy_Em ☆☆☆☆☆
() автор топика
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: Обнаружил "косяк" от Eddy_Em

К сожалению, как я понял, заменить недоделанные nvidia-utils-bumblebee на nvidia-utils нельзя. Что ж, придется не забывать делать ln -s при обновлении.

А пока вот тест (Фурье-фильтрация картинки 2048x1024). На десктопе (nVidia G94 [GeForce 9600 GT]):

CARD returns(err=0):  free mem:435281920,  total mem:536150016
DiffFilter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/CUDA.cu, line 616): allocate
DiffFilter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/CUDA.cu, line 621): copy image to dev
DiffFilter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/CUDA.cu, line 629): doing image FFT
DiffFilter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/CUDA.cu, line 633): allocate
build_GLG_filter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/CUDA.cu, line 540): size=2048, x0=896,x1=1152, y0=896,y1=1152, half=-1024, ss=8.9407e-08, sx2=25, sy2=25
DiffFilter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/CUDA.cu, line 656): doing filter FFT
DiffFilter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/CUDA.cu, line 661): multiplication
DiffFilter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/CUDA.cu, line 666): doing inverse FFT
DiffFilter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/CUDA.cu, line 672): allocate
DiffFilter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/CUDA.cu, line 677): copy to host
CARD returns(err=0):  free mem:410648064,  total mem:536150016
compute_minmax (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/imtools.c, line 103): stat: max=17864.75, min=-37625.20
gen_texture (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/opengl.c, line 492): min = -37625.2, wd = 55489.9
gen_texture (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/opengl.c, line 507): time: 0.00513101
filter (/Data/documents/SAO/GTK+openGL/FITSview/fitsview/src/gtk.c, line 600): TIME: 1.05449

на буке (nVidia GF108 [GeForce GT 630M]):

CARD returns(err=0):  free mem:2115231744,  total mem:2147155968
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 616): allocate
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 621): copy image to dev
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 629): doing image FFT
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 633): allocate
build_GLG_filter (/tmp/fitsview/src/CUDA.cu, line 540): size=2048, x0=896,x1=1152, y0=896,y1=1152, half=-1024, ss=8.9407e-08, sx2=25, sy2=25
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 656): doing filter FFT
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 661): multiplication
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 666): doing inverse FFT
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 672): allocate
DiffFilter (/tmp/fitsview/src/CUDA.cu, line 677): copy to host
CARD returns(err=0):  free mem:2098843648,  total mem:2147155968
compute_minmax (/tmp/fitsview/src/imtools.c, line 103): stat: max=17864.76, min=-37625.22
gen_texture (/tmp/fitsview/src/opengl.c, line 492): min = -37625.2, wd = 55490
gen_texture (/tmp/fitsview/src/opengl.c, line 507): time: 0.00441313
filter (/tmp/fitsview/src/gtk.c, line 600): TIME: 0.260431
В 4 раза быстрей!

Вот такой, блин, портативный компьютер, у которого и видеокарта мощней, и оперативки в 3 раза больше, чем на десктопе...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

В М-ках мало ядер, десктопная GTX560 в 7-10 раз быстрее работает.
Сравнивал работу 630М на алгоритме Marching Cubes (см. примеры nvidia sdk).
Но для ноутбуков это и без того очень много :-)

blinkenlichten
()
Ответ на: комментарий от blinkenlichten

У меня 4 ядра, которые более мощные, чем те же 4 в десктопе.

Marching Cubes

Япона мать! Это есть готовое?! А я велосипедил, блин!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Kosyak

Тьфу ты, и действительно. Что это я...

Ну, это и понятно, что в мобильной видеокарте GPU-ядер будет поменьше. Но все равно она мощнее получается, чем моя 9600...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Там же(в NVIDIA SDK) есть и код для openCL.
Есть ещё один хороший способ компактности вокселов, который отличный от «привычного», что есть в коде от nvidia — это т.н. «гистопирамиды».
Вот у автора алгоритма есть готовый GPL-ный код на GLSL v1.2 (очень быстрый, по сравнению с CUDA):
Marching Cubes with HistoPyramides
Правда, здесь код менять очень сложно, ибо всё хардкорно на шейдерах и пиксель-буфферах сделано.

Те же «гистопирамиды» на openCL тут и на CUDA тут, второе работает в 2х быстрее примера в NVIDIA SDK, правда этот код менять надо будет, чтобы была возможность грузить объёмы у которых [X * Y] размерности не есть степенью 2.

Авторам было удобно сделать арифметику преобразования линейного индекса в глобальной памяти в координату 3Д точки через битовые сдвиги, это действительно работает быстрее, но вносит такие дополнительные требования к входным данным.
ЕМНИП, такое же ограничение есть и в коде NVIDIA SDK, напильником надо будет немного поработать.

blinkenlichten
()
Ответ на: комментарий от Eddy_Em

А, ну тут похожая, но все-таки другая задача. Без велосипедов не обойтись.

blinkenlichten
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.