Cool Stack

OpenCL en Python

PyOpenCL est une interface entre Python et C OpenCL. Vous pouvez créer une maquette d'application en Python avec du code en C OpenCL. Lorsque que vous voudrez réécrire votre application en C/C++ ou Java, le code C OpenCL devra simplement être copié/collé. Ce qui fait de Python la meilleure façon de se lancer dans OpenCL. Je décris ici la méthode d'installation de PyOpenCL dans avec les driver NVidia.

Un très bon article sur l'installation de PyOpenCL avec ATI Stream existe déjà : http://wiki.tiker.net/PyOpenCL/Installation/Linux/Ubuntu

Installation de PyOpenCL : sous Linux

Je décris ici l'installation de PyOpenCL sous Ubuntu 9.10 (64bits). Il est possible que certain détail change sur votre distribution, mais l'idée reste la même. L'installation avec ATI Stream étant déjà décrite, je détaille ici l'installation avec le SDK NVIDIA.

Etape 1 : Installer numpy et boost

aptitude install python-numpy libboost1.40-all-dev

Cela prend quelques minutes boost est une bibliothèque importante en terme de taille.

Etape 2 : Télécharger PyOpenCL

http://pypi.python.org/pypi/pyopencl A l'heure où j'écris ces lignes, la version de pyopencl est 0.91.4. Vous devez donc adapter les lignes suivantes à votre version

wget http://pypi.python.org/packages/source/p/pyopencl/pyopencl-0.91.4.tar.gz
tar xfz pyopencl-0.91.4.tar.gz

Etape 3 : Compiler PyOpenCL

 cd pyopencl-0.91.4
 python configure.py \
  --boost-inc-dir=/usr/include/boost \
  --boost-lib-dir=/usr/lib \
  --boost-python-libname=boost_python-mt-py26 \
  --boost-thread-libname=boost_thread-mt \
  --cl-inc-dir=/usr/include/CL \
  --cl-lib-dir=/usr/lib \
  --cl-libname=OpenCL
make
sudo make install

Démarrer un nouvelle console.

Etape 4 : Tester

Dans python

>>> import pyopencl as cl
>>> ctx = cl.Context()
>>> for i in ctx.get_info(cl.context_info.DEVICES):
        print i.get_info(cl.device_info.NAME)

Si tout est bien configuré et installer vous devez voir le nom de votre (vos) carte graphique (et CPU si vous utilisez un driver OpenCL capable d'utiliser les CPU.

PyOpenCL est maintenant installé correctement

Installation de PyOpenCL : sous MacOSX

Je décris ici l'installation de PyOpenCL sous MacOSX 10.6 Snow Leopard.

Etape 1 : Installation de boost

Téléchargez la dernier version de boost (1.4.2 actuellement) sur http://sourceforge.net/projects/boost/files/boost/

./bootstrap.sh --prefix=$HOME/pool --libdir=$HOME/pool/lib
./bjam -j4 variant=release link=shared install
export LD_LIBRARY_PATH=$HOME/pool/lib:${LD_LIBRARY_PATH}
export PYTHONPATH=/Library/Python/2.6/site-packages:$PYTHONPATH

Etape 2 : Télécharger PyOpenCL

http://pypi.python.org/pypi/pyopencl A l'heure où j'écris ces lignes, la version de pyopencl est 0.91.4. Utilisez la dernière version. Téléchargez et décompressez PyOpenCL dans un répertoire : http://pypi.python.org/packages/source/p/pyopencl/pyopencl-0.91.4.tar.gz

Etape 3 : Compiler PyOpenCL

 cd pyopencl-0.91.4
 python configure.py \
 --boost-inc-dir=$HOME/pool/include \
 --boost-lib-dir=$HOME/pool/lib \
 --boost-python-libname=boost_python \
 --boost-thread-libname=boost_thread \
 --cl-libname='' \
 --ldflags='-Wl,-framework,OpenCL' \
 --boost-compiler='gcc42'
make
sudo make install

Modifiez votre .bash_profile en ajoutant:

export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$HOME/pool/lib

PyOpenCL est maintenant installé correctement

Etape 4 : Tester

Dans python

import pyopencl as cl
ctx = cl.Context()
for i in ctx.get_info(cl.context_info.DEVICES):
    print i.get_info(cl.device_info.NAME)

Si tout est bien configuré et installé vous devez voir le nom de votre (vos) carte graphique (et CPU si vous utilisez un driver OpenCL capable d'utiliser les CPU.

Chez moi je vois:

GeForce 9400M

Si vous voyez quelque chose comme:

>>> import pyopencl as cl
Traceback (most recent call last):
  File "", line 1, in
  File "/Library/Python/2.6/site-packages/pyopencl/__init__.py", line 3, in
    import pyopencl._cl as _cl
ImportError: dlopen(/Library/Python/2.6/site-packages/pyopencl/_cl.so, 2):
Library not loaded: libboost_python.dylib
  Referenced from: /Library/Python/2.6/site-packages/pyopencl/_cl.so
  Reason: image not found

c'est certainement que vous avez oublié d'ajouter la ligne suivante dans votre fichier .bash_profile:

export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$HOME/pool/lib

ou simplement que vous n'avez pas redémarré une nouvelle console. Vous pouvez alors écrire cette ligne directement dans la console et relancer python

Petit exemple

import pyopencl as cl
ctx = cl.Context()
for device in ctx.get_info(cl.context_info.DEVICES):
  print "Device name:", device.name
  print "Device type:", cl.device_type.to_string(device.type)
  print "Device memory: ", device.global_mem_size//1024//1024, 'MB'
  print "Device max clock speed:", device.max_clock_frequency, 'MHz'
  print "Device compute units:", device.max_compute_units

Le site officiel de PyOpenCL : http://pypi.python.org/pypi/pyopencl/

Posted Jeu 31 décembre 2009 by Stéphane Planquart in programmation graphique