CUDA на Optimus
Nov. 3rd, 2012 02:12 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Решил я сегодня проверить, насколько же реально крута видеокарта на моем ноутбуке. Откопал свой старый fitsview (где еще не было наворочено слишком много функций, так что CUDA полностью дублировала вычисления на CPU), и начал пробовать.
Поначалу у меня ничего не получилось. Я даже на ЛОРе тему создал. Потом, по наводке, сделал подробный вывод make'а и заметил, что не хватает при линковке флага -lcuda. Посмотрел, что творится в /usr/lib. И действительно:
Т.е. в библиотеке nvidia-utils-bumblebee отсутствует симлинк libvuda.so. Почитав внимательно арчевики, я понял, что заменить nvidia-utils-bumblebee на nvidia-utils (где все в порядке) нельзя, а доустанавливать dkms-nvidia (возможно, он бы добавил нужных файлов, либо я получил бы нерабочую графику) не хотелось. Поэтому я просто сделал вручную симлинк, так что теперь все в порядке:
Главное — при обновлении не забыть пересоздать этот симлинк.
Судя по багтрекеру арча, добавлять этот симлинк в пакет разработчики пока не собираются. Ну и хрен с ними. Арч вообще последнее время что-то скатывается в полную задницу. Даже не знаю, на какой дистрибутив перейти, учитывая мое хроническое рукожопие.
Итак, после прогона cmake и сборки, я получил работающую программку. Запускаю при помощи optirun (иначе видеокарта не обнаруживается, уже проверял — хоть на арчевики и пишут, что мол, можно попытаться и без шмеля запустить). Загрузил тестовый спектр 2048x1024 пикселя и проверил скорость Фурье-фильтрации.
Итак, для начала — мой домашний десктоп (nVidia G94 [GeForce 9600 GT]):
получил чуть больше секунды на простую операцию.
Теперь мой ноутбук (nVidia GF108 [GeForce GT 630M]):
Вот такие пироги. Там, конечно, помимо непосредственно вычислений еще и всякие отображения в OpenGL используются. Но в общих чертах понятно, что железо на моем десктопе уже прилично устарело.
В общем, получилось, что ноутбучок мой считает чуть ли не в 4 раза шустрей десктопа. Вот такая, блин, портативная машинка... Единственное преимущество десктопа теперь - большое количество жестких дисков (все-таки, 5.25ТБ я в бук не запихаю).
P.S. Вкратце перескажу арчевики: что нужно сделать, чтобы заполучить рабочую куду на ноутбуках с чертовым оптимусом.
P.S. С грустью взглянул на свой недописанный велосипед и в очередной раз подумал, что надо бы найти время, да доделать его. Правда, для начала надо будет разобраться-таки с методом восстановления гартманограмм (т.к. этот fitsview создавался в основном как раз с целью способствовать проведению технических наблюдений).
Поначалу у меня ничего не получилось. Я даже на ЛОРе тему создал. Потом, по наводке, сделал подробный вывод make'а и заметил, что не хватает при линковке флага -lcuda. Посмотрел, что творится в /usr/lib. И действительно:
ll /usr/lib/libcuda*
lrwxrwxrwx 1 root root 17 окт. 30 20:21 /usr/lib/libcuda.so.1 -> libcuda.so.304.60*
-rwxr-xr-x 1 root root 10218542 окт. 31 06:59 /usr/lib/libcuda.so.304.60*
Т.е. в библиотеке nvidia-utils-bumblebee отсутствует симлинк libvuda.so. Почитав внимательно арчевики, я понял, что заменить nvidia-utils-bumblebee на nvidia-utils (где все в порядке) нельзя, а доустанавливать dkms-nvidia (возможно, он бы добавил нужных файлов, либо я получил бы нерабочую графику) не хотелось. Поэтому я просто сделал вручную симлинк, так что теперь все в порядке:
ls -l /usr/lib/libcuda*
lrwxrwxrwx 1 root root 26 нояб. 3 13:13 /usr/lib/libcuda.so -> /usr/lib/libcuda.so.304.60*
lrwxrwxrwx 1 root root 17 окт. 30 20:21 /usr/lib/libcuda.so.1 -> libcuda.so.304.60*
-rwxr-xr-x 1 root root 10218542 окт. 31 06:59 /usr/lib/libcuda.so.304.60*
Главное — при обновлении не забыть пересоздать этот симлинк.
Судя по багтрекеру арча, добавлять этот симлинк в пакет разработчики пока не собираются. Ну и хрен с ними. Арч вообще последнее время что-то скатывается в полную задницу. Даже не знаю, на какой дистрибутив перейти, учитывая мое хроническое рукожопие.
Итак, после прогона cmake и сборки, я получил работающую программку. Запускаю при помощи optirun (иначе видеокарта не обнаруживается, уже проверял — хоть на арчевики и пишут, что мол, можно попытаться и без шмеля запустить). Загрузил тестовый спектр 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
Вот такие пироги. Там, конечно, помимо непосредственно вычислений еще и всякие отображения в OpenGL используются. Но в общих чертах понятно, что железо на моем десктопе уже прилично устарело.
В общем, получилось, что ноутбучок мой считает чуть ли не в 4 раза шустрей десктопа. Вот такая, блин, портативная машинка... Единственное преимущество десктопа теперь - большое количество жестких дисков (все-таки, 5.25ТБ я в бук не запихаю).
P.S. Вкратце перескажу арчевики: что нужно сделать, чтобы заполучить рабочую куду на ноутбуках с чертовым оптимусом.
- Поставить bumblebee
- Поставить nvidia-bumblebee и nvidia-utils-bumblebee
- Поставить cuda
- Сделать симлинк /usr/lib/libcuda.so.1 -> libcuda.so.304.60
- Собирать обычным способом
- Запускать при помощи optirun
P.S. С грустью взглянул на свой недописанный велосипед и в очередной раз подумал, что надо бы найти время, да доделать его. Правда, для начала надо будет разобраться-таки с методом восстановления гартманограмм (т.к. этот fitsview создавался в основном как раз с целью способствовать проведению технических наблюдений).