Настройка Ubuntu 8.10 для кодинга под NVIDIA CUDA

    image

    Решил я всерьез заняться программированием распределенных вычислений с использованием этой технологии. Не буду подробно рассказывать, что она из себя представляет, скажу только, что CUDA предназначена для проведения распределенных вычислений не на процессоре, а на чипе видеокарты, что позволяет производить неграфические вычисления с феноменальной скоростью (производительность чипа GeForce 8800 GTX при математических расчетах примерно равна производительности 180(!)-ядерного Pentium 4 1,5 ГГц). В основном это используется для решения научных задач, вроде моделирования различных сложных систем. Кстати, данную технологию использует последняя версия Adobe Photoshop (CS4) — рендеринг картинок и многие эффекты обрабатываются именно с помощью CUDA. Технология поддерживается видеокартами на чипах NVIDIA начиная с 8 серии и новее, включая, само собой, Quadro и Tesla.

    Сказано — сделано. Буду настраивать свою убунту под это дело, а заодно и о своем опыте расскажу ;)

    Примечание:
    1. Примеры для CUDA можно благополучно писать и компилировать даже на компьютере без поддерживаемой видеокарты, однако работать они будут раз в сто медленнее, чем при ее наличии.
    2. Есть известная проблема — CUDA состоит в плохих отношениях с компилятором gcc-4.3, который по умолчанию установлен в Ubuntu 8.10, поэтому приходится откатываться на gcc-4.1. Подробности ниже :)

    Начнем!


    Для начала установим необходимые библиотеки.
    $ sudo apt-get install linux-headers-`uname -r` binutils pkg-config build-essential xserver-xorg-dev libc-dev

    Самое важное здесь — libc-dev, без ее наличия ничего работать не будет.

    Отлично, продолжаем! Теперь настроим компилятор. Для начала скачаем gcc и g++ нужной нам версии (это важно — их версия должна быть одинаковой). Проще всего это сделать через Synaptic, отыскав там gcc-4.1 и g++-4.1, а можно и прописать в консоли:
    $ sudo apt-get install gcc-4.1 g++-4.1

    Нужно настроить систему на использование нужного нам компилятора (см АПД в конце!). Делается это до смешного просто:
    $ sudo rm -d /usr/bin/gcc
    $ sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc
    $ sudo rm -d /usr/bin/g++
    $ sudo ln -s /usr/bin/g++-4.1 /usr/bin/g++


    Кстати, вернуть на место «старый» компилятор легко — достаточно заменить в приведенных командах 4.1 на 4.3.
    Ну и, само собой, нам нужны сами компоненты CUDA — видеодрайвер, тулкит и SDK. Берем их с родного сайта. Систему указываем 8.04, все будет прекрасно работать и так.

    Поскольку мы собираемся использовать последнюю версию — выбираем пакеты для 2.1:
    1. CUDA Driver — NVIDIA-Linux-x86-180.06-pkg1.run
    (Спасибо товарищу Frosty — недавно вышел драйвер версии 180.22, скачать его можно, естественно, с официального сайта. Процедура установки не отличается)
    2. CUDA Toolkit — cuda-linux-rel-nightly-2.1.1635-3065709.run
    3. CUDA SDK code samples — cuda-sdk-linux-2.10.1126.1520-3141441.run

    Сохраняем их куда-нибудь на диск (желательно, чтобы путь к ним не содержал пробелов и символов кириллицы) и устанавливаем для всех трех пакетов chmod +x. Предварительный этап завершен!

    Собственно установка.


    Для начала надо поставить видеодрайвер. Ставится он стандартно:
    $ sudo -s -H
    # /etc/init.d/gdm stop


    Жмем Ctrl+Alt+F1 и логинимся. Затем:
    # sh NVIDIA-Linux-x86-180.06-pkg1.run
    Нам предлагают скачать precompiled headers с сервера NVIDIA. Отказываемся.
    Тогда нам предлагают скомпилировать их под наше ядро. Соглашаемся.
    Ждем несколько секунд — и вуаля! Драйвер установлен.
    Теперь можно снова запустить X-Server:
    # /etc/init.d/gdm start

    Теперь нужно немного подправить один файл:
    $ sudo gedit /etc/default/linux-restricted-modules-common

    там нужно исправить строчку на вот такую
    DISABLED_MODULES=«nvidia nvidia_legacy nvidia_new»

    Сохраняемся и ребутимся. Если же X-сервер не запустился, то можно просто восстановить конфигурационный файл:
    $ sudo cp /etc/X11/xorg.conf.backup /etc/X11/xorg.conf

    и пересмотреть свои действия на предмет ошибки.

    Отлично! Теперь установим оставшиеся два компонента:
    $ sudo ./cuda-linux-rel-nightly-2.1.1635-3065709.run
    $ sudo ./cuda-sdk-linux-2.10.1126.1520-3141441.run


    Пути (в первом случае /usr/local/cuda и $HOME/NVIDIA_CUDA_SDK во втором) лучше оставить по умолчанию, во избежание.

    Теперь немного поковыряем переменные окружения. Они в Ubuntu хранятся в /etc/environment. Нужно добавить в PATH:"/usr/local/cuda:/usr/local/cuda/bin". А потом осталось отредактировать один файл:
    $ sudo gedit /etc/ld.so.conf

    Добавляем в конец
    # NVIDIA CUDA v2.1 support
    /usr/local/cuda/lib

    и набираем ldconfig:
    $ sudo ldconfig

    Все, можно начинать радоваться! Теперь идем в каталог SDK и пробуем собрать примеры.
    $ cd ~/NVIDIA_CUDA_SDK
    $ make


    Кстати, не стоит забывать про параметры команды make. При компилировании кода под CUDA они могут быть такие:
    — release configuration — make
    — debug configuration — make dbg=1
    — emurelease configuration — make emu=1
    — emudebug configuration — make emu=1 dbg=1

    Не забывайте, что если на вашем компьютере нету совместимой видеокарты — обязательно ставим параметр emu=1.

    Вот, собственно, и все! Теперь, если все правильно собралось(если нет — перепроверьте, нужной ли версии gcc и g++), можно идти в каталог ~/NVIDIA_CUDA_SDK/bin/linux/release/ и наслаждаться примерами. Лично мне больше всего понравился fluidsGL.

    Если есть какие-то недочеты — постараюсь исправить. Удачи!

    АПД: Меня попросили сразу два товарища (3dm и timyr_lan) поправить способ смены дефолтного компилятора. Спасибо за поправку.
    Корректнее делать вот так:
    export CC=«gcc-4.1»
    export CPP=«cpp-4.1»
    export CXX=«g++-4.1»

    Прописать в ~/.bashrc или просто выставлять эти переменные перед компиляцией CUDA кода.


    АПД2: Вариант нумбер 2, даже проще:
    $ gedit ~/NVIDIA_CUDA_SDK/common/common.mk
    # Compilers
    NVCC := $(CUDA_INSTALL_PATH)/bin/nvcc.
    CXX := g++-4.1
    CC := gcc-4.1
    LINK := g++-4.1 -fPIC

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 66

      +1
      Подскажите плиз ссылку «CUDA для чайников». Очень хочеться получить базовые представления, основные принципы программирования для распределенных вычислений и примитивные примеры этого языка
        +3
        Вообще исчерпывающая информация в самом NVIDIA CUDA Programmers Guide есть, но нужен английский.
          0
          Спасибо
          +2
          courses.ece.uiuc.edu/ece498/al1/
          Полноценный курс от компании NVIDIA для Иллиноисского университета университета
          Презентации
          Аудио записи лекций
          Документация
          Лабораторные
          0
          Диплом делал по этой теме :). Собирал под WinXP, SUSE и Ubuntu. Под линукс примерно так, как и описано выше. Всё действительно работает и работает очень хорошо. Особенно приятно, когда программа на видеокарте начинает обходить по производительности аналогичную на процессоре.
            –1
            есть табличка сравнения, и описание что за задача была. у меня есть стойкое подозрение, что не сильно она будет опережать настоящий процессор
              0
              Наверное я и компания NVIDIA( www.nvidia.ru/object/cuda_home_ru.html ) занимаемся обманом честных граждан ;) и запускаем программы на «ненастоящих» процессорах.

              По существу:
              Тягался я с OpenSource библиотекой обработки изображений DevIL (Development Image Libarary) она же когда-то OpenIL

              Железо:
              Core2Duo T7100 1.8GHz
              Nvidia Quadro NVS 140M

              Задача:
              Свертка изображения ядром 3х3 и 5х5

              Размер изображения Время GPU сек. Время CPU сек. Ускорение
              Однократный запуск обработки
              1.4Мб                  0.109          0.203          1.86
              3 Мб                   0.188          0.422          2.245
              8.6Мб                  0.5            1.25           2.5
              54Мб                   2.69           7.844          2.642
              
              10-и кратный запуск обработки (минимизируем затраты на чтение-запись, оцениваем работу ядер)
              1.4Мб                  0.656          1.906          2.9
              3 Мб                   1.360          4.171          3.067
              8.6Мб                  3.890         11.485          3.95
              54Мб                  10.812         71.297          6.56
              


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

              Есть задачи, на которых прироста производительности нет. Скажем, контрастирование изображения, в силу того, что это однопроходная задача и всё время съедается на передаче данных с/на карту.
                +1
                >>Nvidia Quadro NVS 140M
                издеваетесь? это же G86, там всего 16 потоковых процессоров, вы лучше возьмите старичка 8800GT с 112 потоковыми процессорами, или более менее новую gtx260 с 216 потоковыми процессорами, тогда уже можно сравнивать с обычными процессором, а Quadro NVS 140M — это очень low-end
                  0
                  А если поставить сервак Tesla с четырмя такими картами то будет еще круче, а если датацентр с такими серваками…

                  этот low-end показал себя неплохо
                  когда делал диплом выбирать не приходилось
                  был ноут с указаной картой и ни каких других альтернатив

                  education и production две большие разницы ;)

                  PS: если не хотите, что бы я издевался, говорите предметно, раскажите ваш опыт, ваши успехи
                    0
                    я о «Наверное я и компания NVIDIA( www.nvidia.ru/object/cuda_home_ru.html ) занимаемся обманом честных граждан ;) и запускаем программы на «ненастоящих» процессорах.»

                    если сравнивать производительность cuda и процессора, то уж с нормальной картой, а не low-end G86
                    в чем единственный плюс вычислений на cuda — это в количестве потоковых процессоров

                    у меня есть единственный опыт использования cuda — перебор паролей md5:
                    на топовых комплектующих, доступных для покупки:
                    процессорах core2quad 3ггц производительность с 4 ядрами доходит до ~300млн паролей/сек, при использовании 4 видеокарт 9800GX2 с 128*8=1024 потоковыми процессорами производительность доходит до ~3500млн паролей/сек
                    при использовании нетоповых процессоров и видеокарт:
                    на core2duo 3ггц производительность ~100 паролей/сек; 8800GT ~500паролей/сек

                    т.е. основное достоинство технологии cuda вовсе не в доступности low-end видеокарт, а в масштабируемости технологии — можно увеличить количество потоковых процессоров и производительность при намного меньших затратах, сделав доступными по цене большие вычисления для обычных компьютеров, которые может позволить себе каждая уважающая себя компания; я вовсе не говорю о дорогущих «серваках Tesla с четырмя такими картами» и «датацентрах с такими серваками», я об обычных компьютерах
                    PS: 4*9800GX2 в рознице стоит 4*$300, «сервак Tesla с четырмя такими картами» $10000 — производительность одна и та же ;-)
                      0
                      >если сравнивать производительность cuda и процессора, то уж с нормальной картой,
                      >а не low-end G86 в чем единственный плюс вычислений на cuda — это в количестве потоковых
                      >процессоров

                      Простите, не прояснил:
                      Работу я начал в ноябре — декабра 2007, когда девятой линейки и CUDA 2.0 еще небыло.

                      На счет масштабирования абсолютно согласен, в данной технологии на нее сделан основной упор.
                        0
                        ~300млн паролей/сек

                        миллионы?
                          0
                          да, миллионы; это мало для вас или много?
                            0
                            много!
                            внизу просто уже без миллионов: ~100 паролей/сек;
                            опечатка?
                              0
                              извиняюсь, опечатка :)
                              100млн для core2duo и 500 450млн для 8800gt
                          0
                          где-то есть подвох=) почему тогда видеокарта не стоит вместо основного процессора?

                          или там процессоры в видюхе порезанные, CUDA сильно порезана по функциям по сравнению с C?
                            0
                            видеокарты не рассчитаны вычислять то, что считают процессоры и задуманы под ускорение вычислений, в которых cpu очень слаб, другие вычисления они либо не умеют делать, либо делают жутко медленно;
                            насколько я знаю основные вычисления для видеокарт — это целочисленные вычисления и вычисления с плавающей запятой, но видеокарта не рассчитана на ветвления, предсказания ветвлений, сдвиг битов и прочие хитрости cpu…
                      0
                      А можно сорцы и картинки в открытый доступ попробовать погонять на своем процессоре?
                  0
                  Нужны ли иксы для работы CUDA?
                    0
                    нет, можно программировать на CUDA под win, nix и mac
                      0
                      Вы не поняли вопроса. Тогда перефразирую под ваше утверждение: нуждны ли иксы, directx или quartz чтобы программировать на CUDA?
                        0
                        Понял вопрос! Нет, программирование на CUDA никоим образом не завязано на графическую подсистему (кроме косвенной связи — часто графическая система работает через видеокарту, на которой исполняется программа для CUDA, что может вызываеть разные эффекты, как например Watchdog timeout под Win).
                    0
                    Вроде все отлично, но хотелось бы сделать пару замечаний по установке драйверов:
                    1) Вчера вышла стабильная версия 180.22, думаю лучше исправить в инструкции, чем давать указание на первую бету драйверов с поддержкой CUDA
                    2) На форуме нвидии дается несколько иная инструкция по установке:

                    sudo aptitude install linux-headers pkg-config xserver-xorg-dev
                    sudo aptitude purge nvidia-glx linux-restricted-modules linux-restricted-modules-common
                    sudo rm -f /etc/init.d/nvidia-glx /etc/init.d/nvidia-kernel

                    а затем выход из иксов и установка.
                      0
                      На сайте NVIDIA в разделе технологии для Ubuntu рекомендуется пока именно 180.06. Я могу ошибаться, но новый паблик-драйвер необязательно должен поддерживать CUDA, может быть, для этого нужен специальный драйвер. Насчет второго пункта — я рассказывал о собственном опыте, и у меня все отлично работает. Да и если при установке не будет хватать какой-то определенной библиотеки — это будет понятно. Так что спасибо за замечание, думаю, народу пригодится, если что.
                        0
                        В релиз нотах к паблик-драйверу явно указано про поддержку CUDA, для нее не будет отдельного драйвера, он будет идти в комплекте с драйвером.
                          0
                          Спасибо, вставил.
                        0
                        Лично у меня 180.22 продемонстрировала массу артефактов при включённом compiz-fusion. Я к нему привык, так что пришлось откатиться на 177.80. Возможно, более новые версии данного по с новыми дровами работают без нареканий, не проверял. Так что может просто не всем подойти.
                          0
                          Кстати, с 188.06 у меня компиз прекрасно работает вместе с CUDA, причем видюха ноутбучная 8400 GS.
                        0
                        Идиотский вопрос — а когда оно считает, видеокартой может пользоваться? Или черный экран?
                          0
                          Для этого можно запустить пример deviceQuery, он проверяет оборудование на предмет поддержки CUDA.
                            +1
                            Приоритет отдаётся системе и видеобуферу. Т.е. память под видеобуфер остаётся и если потребуется больше, то даже данные CUDA-приложений могут быть затёрты для нужд видеобуфера.

                            С вычислениями по-другому. Вычичслительные ресурсы делятся по-равному. Т.е. если загрузить видеокарту на расчёты по полной, то тормоза будут.
                          • НЛО прилетело и опубликовало эту надпись здесь
                              0
                              Они не в сто раз медленнее, просто на них не распараллелишь вычисления на большое число потоков сразу, поэтому обработка идет медленнее. А вообще — чем больше потоков — тем быстрее процесс.
                                0
                                Неверное утверждение.

                                Во-первых, всё зависит от задачи. Почему это я под x86 не могу распараллелить тот же перебор паролей? Да хоть 1000 потоков и будут они у меня работать параллельно. Только какой смысл? Если в лучшем случае ядер у меня 4 + программная диспетчеризация сжирает уйму времени(в CUDA она аппаратная).
                                  +1
                                  Дело не в распараллеливании на потоки, а именно на ядра. То есть если каждое ядро будет работать над своей задачей — естественно задача решится быстрее. Плюс — переход от ядра к ядру в x86 составляет добрую сотню тактов, когда как в чипе NVIDIA это один такт. Вот вам и прирост производительности…
                                    0
                                    Вы сейчас просто взяли и перефразировали мой пост, повторив все мои утверждения. :)
                                      0
                                      Ну не совсем :) Просто объяснил более понятным языком, мне так кажется. В любом случае — спасибо за поддержку :)
                                0
                                В силу особенностей архитектуры, главная из которых заключается в прицнипе SIMD(single-instruction-multiple-data, одна-инструкция-разные-данные), другими словами, скажем, если в GeForce 280GTX присутствуют 240 ядер, то за один такт, в идеале, видеокарта выполняет 240 одинаковых инструкций, каждая из которых оперирует разными данными.
                                  0
                                  Попробуйте запустить приложение на видео чипе — будет обратная ситуация. Nvidia сравнивается с устаревшим процессором на числодробительных задачах — прямой поток без ветвления.
                                  0
                                  Спасибо, вы спасли меня от трахатья с гуглом. Я в конфигурации linux'а не настолько силён, чтобы запросто так взять и поставить все необходимые компоненты. А посмотреть CUDA хочется. (GeForce 9800)
                                    0
                                    а есть что-то подобное для ATI?
                                    +3
                                    В скором времени ожидается выход OpenCL 1.0 — стандарта для параллельного программирования под платформы ATI и NVIDIA.

                                      +2
                                      Забыл ссылку дать: www.nvworld.ru/news/09_12_2008.html#09_12_2008-07
                                        0
                                        Насколько я понимаю, стандарт как стандарт не привязан к платформе. Он был изначально предложен Apple, а поддерживать его будут естественно все кто подсуетятся.
                                        +1
                                        почему для смены версии gcc не использовать export CC=gcc-4.1?
                                          0
                                          может случиться так, что установленный стандартно компилятор будет отличаться от системного (как бредово не звучит — но у меня такое было). А вообще — способов полно, что для кого проще.
                                            +1
                                            забыл про g++. export CXX=g++-4.1
                                            0
                                            А OpenCL не рассматривался в качестве альтернативы? Он вроде похож принципиально, но позволяет писать под большее количество железяк. А в разработке этого стандарта участвовали и нвидия, и интел и ати, есть надежда, что просто так не бросят.
                                              0
                                              Можно поинтересоваться, что именно вы собрались кодить?
                                              Кроме gamedev'а или подбора паролей :), для чего еще можно использовать?
                                                0
                                                Например у меня в вычислительном комплексе есть отдельное расширение для работы с матрицами на GPU. Т.е. когда размер матриц начинает превышать определённый объём, то часть вычислений переносится на GPU.

                                                Этот «определённый объём» расчитывается эмперически. Т.е. когда время затраченное на двусторонний обмен данными между видеокартой и оперативной памятью на фоне сложной вычислительной операции(на которую тратится значительно больше времени на обычном процессоре) становится достаточно мал, имеет смысл использовать GPU.

                                                Имеет смысл переносить операции начиная с умножения и заканчивая каким-нибудь сингулярным разложением матриц.
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                    0
                                                    Смотрите на 280, там двойная точность. Но и одинарной хватает для огромного количества полезных задач.
                                                  0
                                                  Это мне для научной работы. Например, моделирование поведения различных сложных материалов и химических систем.
                                                    0
                                                    Любое статистическое моделирование — как раз подходящая задача, как я понимаю.
                                                      0
                                                      Работа с изображениями — классический пример. Фильтры, декодирование raw и т.п.

                                                      Видео-обработка тоже должна хорошо лечь на GPU, особенно в HD-варианте.

                                                      CUDA-архиваторы не за горами.

                                                      Это я всё про ширпотреб. А что уж говорить про узкоспециализированные числодробильные приложения, в которых перемножение матриц из миллионов элементов — обычное дело!
                                                      –1
                                                      Пожалуйста как чего-нибудь напишешь, выложил табличку с результатами. а было бы еще и сравнение выполнение тойже задачи но на обычном процессоре.

                                                      У меня есть стойкое подозрение что на обычном процессоре это будет быстрее. Так как основное проседание у видео карты будет именно в синхронизации всех этих 180 ядер =)
                                                        +1
                                                        Надо почитать документацию и все подозрения пропадут. Там нет необходимости синхронизировать все 180 ядер по отдельности. Аппаратно ядра объединяются в warp'ы по 32 ядра. Программно реализация по потокам делится на блоки, блоки объединяются в grid'ы. Обработка идёт пакетно.

                                                        А табличка есть:
                                                        www.nvidia.com/object/cuda_home.html#

                                                          0
                                                          Давно всё выложено, скажем, посмотрите majuric.org/software/cudamd5/source/
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                            +2
                                                            спасибо =) Конечно, я писал прошивку для чемоданчика с красной кнопкой, и у меня есть к нему доступ по ssh.
                                                              +3
                                                              И у вас тоже?! :)
                                                            +1
                                                            Это не распределенные вычисления. Параллельные, да.
                                                              0
                                                              топикстартер! а зачем вручную ставить драйвер? из репозитория не подойдет?
                                                                0
                                                                на время написания топика дрова из репозитория не поддерживали CUDA :) Сейчас, как-никак, уже больше года прошло.

                                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                              Самое читаемое