Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

CUDA на Optimus

Решил я сегодня проверить, насколько же реально крута видеокарта на моем ноутбуке. Откопал свой старый fitsview (где еще не было наворочено слишком много функций, так что CUDA полностью дублировала вычисления на CPU), и начал пробовать.

Поначалу у меня ничего не получилось. Я даже на ЛОРе тему создал. Потом, по наводке, сделал подробный вывод 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. Вкратце перескажу арчевики: что нужно сделать, чтобы заполучить рабочую куду на ноутбуках с чертовым оптимусом.
  1. Поставить bumblebee
  2. Поставить nvidia-bumblebee и nvidia-utils-bumblebee
  3. Поставить cuda
  4. Сделать симлинк /usr/lib/libcuda.so.1 -> libcuda.so.304.60
  5. Собирать обычным способом
  6. Запускать при помощи optirun

P.S. С грустью взглянул на свой недописанный велосипед и в очередной раз подумал, что надо бы найти время, да доделать его. Правда, для начала надо будет разобраться-таки с методом восстановления гартманограмм (т.к. этот fitsview создавался в основном как раз с целью способствовать проведению технических наблюдений).
Tags: cuda
Subscribe

  • M$ teams…

    Начал с сегодняшнего дня студентам ЮФУ удаленно лекции читать. У них все завязано на различные корпорации зла. И базовая работа - через teams. ОК,…

  • Почему systemd — дерьмо

    Уже давно на эту статейку натыкался, но все забывал в "закладки" добавить. Вот, добавляю: "systemd — отстой". Советую эту статейку почитать…

  • Разбираемся с утечками

    Занялся полным рефакторингом кода системы управления оптоволоконным спектрографом. А глаз уже "замыленный": ну вот не могу сходу обнаружить, где я…

promo eddy_em сентябрь 3, 12:13 8
Buy for 10 tokens
Уже больше полугода занимаюсь разработкой, вот, наконец-то в мастерских взялись за меня и начали выдавать первые детали. Сегодня сделал тестовую сборку (как обычно, местами пришлось "доработать напильником"): Пока прибор без названия (да и как-то не лезет в голову ничего, у меня нет…
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments