akademic.name

  • Учёба
  • Folding@Home с помощью Nvidia GPU на debian linux

    Как я писал в прошлый раз, решил попробовать считать белки с помощью видеокарты сервера. Всё равно ему видюха бес толку. А видюха там Nvidia GeForce 9400, поддерживает технологию CUDA.

    Сейчас на сервере запущен расчёт на CPU: две штуки, расчёт на GPU: одна штука. Кроме этого сервер скачивает и раздаёт торренты через rtorrent на максимальной скорости соединения и можно смотреть 2 фильма по NFS. Всё без тормозов.

    Под “катом” инструкция, как настроить обсчёт заданий на GPU. Поехали.

    К сожалению клиента для расчёта на видеокарте под linux нет, есть только для windows. Поэтому придётся задействовать wine.

    Делал по статье NVIDIA GPU2 Linux/WINE Headless Install Guide с поправкой на то, что у меня debian x32.

    Начну с пятого пункта статьи, т.к. установленный debian уже есть. Необходимо поставить wine. Можно как в статье

    sudo apt-get install wine

    Мне не понравилось, что с wine автоматически ставится куча мусора вроде поддержки печати, сканера и т.п. Поэтому ставим wine-bin и libwine-gl:

    sudo apt-get install wine-bin libwine-gl

    Далее качаем драйвера для видеокарты и cuda с сайта nvidia. Можно взять последние стабильные и думаю, что скоро это будет наиболее правильный путь. Но пока у меня с ними не заработало. Пришлось качать “CUDA Toolkit 3.0 Beta(CUDA Toolkit 3.0 Beta)”:http://forums.nvidia.com/index.php?showtopic=149959.

    На всякий случай вот прямые ссылки на скачивание: “Видеодрайвер Linux 32 195.17(Linux 32 195.17)”:http://developer.download.nvidia.com/compute/cuda/3_0-Beta1/drivers/cudadriver_3.0-beta1_linux_32_195.17-beta.run “CUDA Toolkit for Ubuntu 9.04 32-bit(CUDA Toolkit)”:http://developer.download.nvidia.com/compute/cuda/3_0-Beta1/toolkit/cudatoolkit_3.0-beta1_linux_32_ubuntu9.04.run

    Для компиляции драйверов необходимо поставить пакеты kernel-headers и build-essential.

    sudo apt-get install build-essential linux-headers-\uname -r``

    Затем ставим собственно драйвера: sudo sh cudadriver_3.0-beta1_linux_32_195.17-beta.run sudo sh cudatoolkit_3.0-beta1_linux_32_ubuntu9.04.run

    Надеюсь этот этап пройдёт без запинки. У меня здесь вечно проблемы. То версия gcc не та, то в kernel-headers файлика не хватает. То симлинки где-нибудь прописать придётся.

    Создаём ссылки на библиотеки cuda: sudo sh -c "echo '/usr/local/cuda/lib' > /etc/ld.so.conf.d/cuda.conf" sudo ldconfig

    Инициализируем wine:

    wine notepad

    Создастся каталог ~/.wine

    Скачиваем обёртку для работы libcuda в wine:

    wget http://www.gpu2.twomurs.com/wrapper2ndgen/2.1/cudart.dll.so -O ~/.wine/drive_c/windows/system32/cudart.dll ln -s ~/.wine/drive_c/windows/system32/cudart.dll ~/.wine/drive_c/windows/system32/nvcuda.dll

    Проверяем, что все нужные зависимости у нас есть:

    ldd ~/.wine/drive_c/windows/system32/cudart.dll

    Вывод будет похож на такой:

    linux-gate.so.1 =>  (0xb78c3000)
    libcudart.so.2 => /usr/local/cuda/lib/libcudart.so.2 (0xb7866000)
    libwine.so.1 => /usr/lib/libwine.so.1 (0xb772a000)
    libm.so.6 => /lib/libm.so.6 (0xb7703000)
    libc.so.6 => /lib/libc.so.6 (0xb75bc000)
    libdl.so.2 => /lib/libdl.so.2 (0xb75b8000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb75a0000)
    librt.so.1 => /lib/librt.so.1 (0xb7597000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb74a6000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7488000)
    /lib/ld-linux.so.2 (0xb78c4000)
    

    Если рядом с какой-нибудь библиотекой будет стоять “not found”, значить либо какой-то из шагов пропущен, либо поможет следующий экспорт:

    export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH

    Не помню где я это взял, но мне помог именно он.

    Теперь надо создать скрипт для инициализации CUDA без запуска X-сервера: nano -w cudaini

    Вот сам скрипт:

    #!/bin/bash
    
    PATH=$PATH:/usr/local/cuda/bin
    
    modprobe nvidia
    
    if [ "$?" -eq 0 ]; then
    
    # Count the number of NVIDIA controllers found.
    N3D=`/usr/bin/lspci | grep -i NVIDIA | grep "3D controller" | wc -l`
    NVGA=`/usr/bin/lspci | grep -i NVIDIA | grep "VGA compatible controller" | wc -l`
    
    N=\`expr $N3D + $NVGA - 1\`
    for i in \`seq 0 $N\`; do
    mknod -m 666 /dev/nvidia$i c 195 $i;
    done
    
    mknod -m 666 /dev/nvidiactl c 195 255
    
    else
    exit 1
    fi
    

    Даём скрипту права на исполнение: chmod u+x cudainit

    И запускаем: sudo ./cudainit

    Проверяем, что всё хорошо: ls /dev/nv*

    Должно вывестись следующее(для одной видеокарты): /dev/nvidia0 /dev/nvidiactl

    Можно вставить запуск cudainit в /etc/rc.local для автостарта при перезагрузке.

    Пора, наконец, скачать клиент для windows: wget http://www.stanford.edu/group/pandegroup/folding/release/Folding@home-Win32-GPU_XP-623.zip

    И распаковать его sudo apt-get install unzip mkdir ~/fahgpu2 unzip Folding@home-Win32-GPU_XP-623.zip -d fahgpu2

    И вот он момент истины! Запускаем! cd ~/fahgpu2 nice wine Folding@home-Win32-GPU.exe -verbosity 9 -forcegpu nvidia_g80

    Должен побежать текст по экрану. Вывод программы останавливается и если не видно ошибок в последних строках типа Folding@home Core Shutdown: UNSTABLE_MACHINE то скорее всего всё хорошо. Можно подождать минут 10-20 появится вывод Completed 1% Completed 2%

    На GeForce 9400 один процент делается минут за 7-8 в среднем.

    Итог мучений

    На Atom N330 на одном ядре на 1% выполнения задания затрачивается около часа времени, на GeForce 9400 чуть менее восьми минут. При использовании расчёта на видеокарте нагрузка на процессор не превышает 15% (htop показывает 4 процессора = 2 ядра * HyperThreading, нагрузка только на один).

    Folding@Home