Pull to refresh

NVIDIA CUDA(сиквел) — Настройка PyCUDA

Reading time4 min
Views18K
image
В продолжение темы Настройка Ubuntu 8.10 для кодинга под NVIDIA CUDA, я решил наладить себе рабочее место для использования одного из моих любимых языков программирования — Python. Для этого существует отличный набор библиотек PyCUDA, позволяющий реализовывать все прелести NVIDIA CUDA API с помощью удобного и красивого кода. Приведу пример кода из стандартной комплектации PyCUDA:
import pycuda.autoinit
import pycuda.driver as drv
import numpy

mod = drv.SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
const int i = threadIdx.x;
dest[i] = a[i] * b[i];
}
""")

multiply_them = mod.get_function("multiply_them")

a = numpy.random.randn(400).astype(numpy.float32)
b = numpy.random.randn(400).astype(numpy.float32)

dest = numpy.zeros_like(a)
multiply_them(
drv.Out(dest), drv.In(a), drv.In(b),
block=(400,1,1))

print dest-a*b

Не правда ли, удобно и просто?

Начнем!


Для нормальной работы PyCUDA нам потребуются:

— Машина с UNIX-подобной системой и доступом к интернету.
— Nvidia CUDA toolkit. PyCuda была разработана с оглядкой на версию 2.0 beta, однако у меня она вроде как нормально работает и с 2.1 beta.
— C++ компилятор, желательно gcc версии не ниже 4.х.
— Установленный интерпретатор Python, версия 2.4 или новее.

Теперь установим последнюю версию библиотеки Boost C++. Перед установкой стоит проверить, установлен ли девелоперский пакет для Python, он будет называться python-dev или python-devel. Установка фактически стандартная, только не надо забывать задать префикс — каталог для собранных инклюдов. В данном случае пусть будет $HOME/pool.

$ tar xfj ~/downloads/boost_1_37_0.tar.bz2
$ cd boost_1_37_0
$ ./configure --prefix=$HOME/pool
$ make
$ make install


После сборки (должна пройти успешно) проверяем, появилась ли папка $HOME/pool. Если да — то все путем, идем дальше :)

Важное примечание: Если в конце установки появилось что-то в духе
...failed updating 30 targets...
...skipped 2 targets...

то еще раз перепроверьте, установлены ли у вас девелоперские заголовки питона. Если не удалось обновить всего лишь несколько файлов (менее 5), то, скорее всего, все будет работать нормально, но для верности можно поставить libz-dev и libbz2-dev и собрать Boost заново.

Теперь добавим путь к только что откомпилированным библиотекам в переменную окружения:
$ export LD_LIBRARY_PATH=$HOME/pool/lib:${LD_LIBRARY_PATH}

Если этого не сделать, то на этапе сборки PyCUDA появится что-то вроде:
...blablabla...
ImportError: libboost_python-gcc42-mt-1_35.so.1.35.0:
cannot open shared object file: No such file or directory
...blablabla...


Качаем саму PyCUDA и переходим в каталог с ней.
$ cd $HOME/downloads/pycuda-0.91.1

Нужно установить пакет numpy. Сделать это можно, либо скачав его самому с numpy.org и собрать, либо с помощью самой PyCUDA. Поскольку мы уже перешли в каталог с дистрибутивом, просто набираем:
$ sudo python ez_setup.py //установка setup-tools
$ sudo easy_install numpy //установка numpy с помощью setup-tools


Порядок.

Собираем PyCUDA.


Осталось последнее и самое главное — установить саму PyCUDA. Главная сложность состоит в том, что нужно задать кучу опций при конфигурировании.
$ ./configure \
--boost-inc-dir=$HOME/pool/include/boost-1_37 \
--boost-lib-dir=$HOME/pool/lib \
--boost-python-libname=boost_python-gcc41-mt \
--cuda-root=/where/ever/you/installed/cuda


А теперь — внимание! Если с первыми двумя параметрами все понятно (объяснялось выше), то два последних нуждаются в объяснении. boost_python-gcc41-mt — это имя библиотеки, в которой gcc41 — версия компилятора, с помощью которого вы собирали boost. Как я писал в предыдущей статье, при программировании под CUDA обычно должна использоваться версия 4.1, но если вы не выставили ее системной по умолчанию — то это в данном случае неактуально. Проверить версию активного компилятора можно, набрав
$ gcc -v

Ну а в последнем пункте, как несложно догадаться, нужно заменить /where/ever/you/installed/cuda на каталог с CUDA, то есть по умолчанию /usr/local/cuda.

Кстати, перед вводом make install можно еще раз перепроверить введенные адреса. Они все сохраняются в файле siteconf.py, который создается при конфигурировании. У меня он перед сборкой выглядел вот так:
BOOST_INC_DIR = ['/home/username/pool/include/boost-1_37']
BOOST_LIB_DIR = ['/home/username/pool/lib']
BOOST_PYTHON_LIBNAME = ['boost_python-gcc41-mt']
CUDA_ROOT = '/usr/local/cuda'
CUDADRV_LIB_DIR = []
CUDADRV_LIBNAME = ['cuda']
CXXFLAGS = []
LDFLAGS = []

Если вы хотите переконфигурировать PyCUDA с новыми параметрами — то сначала удалите этот файл. Либо можно просто внести в него изменения и набрать
$ sudo python setup.py build

Теперь можно смело компилировать:
$ sudo make install

Если все сделано правильно — то ошибок при сборке быть не должно. Перезагружаем компьютер, и для полной уверенности можно пойти в каталог
/pycuda-0.91.1/test(или какая у вас там версия) и запустить test_driver.py.

$ cd /pycuda-0.91.1/test
$ python test_driver.py


Если в результате появилось ОК — то все в шоколаде. Если одна-две ошибки (у меня почему-то иногда случались глюки с памятью) — просто попробуйте чуть позже еще раз.

Спасибо, что дочитали до конца, буду рад выслушать критику :)

АПД: Все получилось настроить, в том числе работу в Eclipse. Проблема была в том, что были выставлены неверные права на папку кэша пикуды, проще всего сделать так:
$ sudo chmod 0777 -R /home/username/.pycuda-compiler-cache

Ну и кроме всего прочего, ни интерпретатор, ни сам Eclipse не должны быть запущены из-под рута. Ибо переменные окружения другие :) Спасибо за помощь в настройке товарищу Riz.
Tags:
Hubs:
+35
Comments67

Articles