En algunos artículos previos ya he hablado de las características de Python y también he introducido algunas ideas sobre OpenCL al tratar el paralelismo en GPU. Uno de los problemas que suele plantearse durante el aprendizaje de una nueva API/lenguaje, en este caso concreto OpenCL, es que suele implicar también adecuarse al uso de unas herramientas concretas (bibliotecas, objetos/funciones, compiladores, etc.) y un procedimiento de prueba-error bastante tedioso.
La sencilla operación de enumerar las plataformas y dispositivos disponibles desde OpenCL, siguiendo las indicaciones de la documentación, implican el uso de C/C++, la codificación de un programa completo que es necesario compilar antes de ejecutarlo y ver el resultado, pero hasta llegar a éste normalmente habrá obstáculos: errores durante la compilación, compilación correcta pero con errores de ejecución, sin errores de ejecución pero resultado nulo o incompleto y así sucesivamente.
Personalmente, cuando quiero probar algo nuevo o escribir un prototipo rápido para alguna tarea, prefiero recurrir a un intérprete porque me permite centrarme en el objetivo al no tener que pasar por el habitual proceso de edición-compilación-ejecución. En su lugar escribo las sentencias en la shell del intérprete y obtengo un error inmediato o el resultado que buscaba. Una vez que tengo bien claro cómo hacer aquello que pretendo no hay más que transcribirlo al lenguaje en el que vaya a efectuarse la implementación definitiva y, teóricamente, debería funcionar.
Al comenzar a probar OpenCL mi enfoque no fue distinto y por ello busqué la manera de trabajar con él desde Python, en lugar de hacerlo desde C/C++ que es lo más corriente. Para ello no hay más que configurar e instalar la extensión PyOpenCL, algo que debería ser simple pero que, en la realidad, no lo es tanto, más por las dependencias existentes entre las diferentes partes que otra cosa. Por ello, y por si a alguien le interesa usar OpenCL desde Python, he preparado este pequeño artículo indicando los pasos que he seguido, y que habría que reproducir, para comenzar a funcionar en pocos minutos.
Parto avisando de que las instrucciones siguientes hacen referencia a la instalación de PyOpenCL sobre Windows 7, si bien el procedimiento no debería diferir en exceso en otros sistemas no es algo que haya comprobado personalmente. ¿Por qué en Windows? Aunque uso habitualmente un iMac con MacOS X y un portátil con Linux, la máquina en la que tengo el mejor hardware, tanto en CPU (Intel Core i7) como en GPU (nVidia GTX 285), es un ordenador de escritorio con Windows 7, no hay más razón que ésta.
Sin más, procedo a enumerar los pasos a seguir en el mismo orden en que yo mismo los he llevado a cabo:
En este momento ya tenemos en nuestro sistema todo lo necesario para configurar, compilar e instalar PyOpenCL. En la wiki de PyOpenCL explican poco este proceso y no hacen referencia a algunos apartados sin los cuales no es posible echar PyOpenCL a funcionar. Dicho proceso, completo según la experiencia propia en mi sistema, se compone de los pasos indicados a continuación:
C:\Python26\pyopencl-0.92
.
PATH
. Para añadirla basta con escribir en la línea de comandos: PATH=%PATH%;C:\Python26
, asumiendo que el directorio es C:\Python26
.
python configure.py
, ejecutando el script que ha de generar el archivo de configuración siteconf.py
con unos valores por defecto.
BOOST_INC_DIR
y BOOST_LIB_DIR
ha de ser la del directorio donde se haya instalado la biblioteca Boost, mientras que la de las variables CL_INC_DIR
y CL_LIB_DIR
deberá apuntar a donde se haya instalado el SDK de nVidia o de ATI, según corresponda. En cualquier caso hay que poner atención a las dobles barras invertidas para evitar problemas.
python setup.py install
tal y como se aprecia en la imagen inferior, en la que pueden verse parte de los mensajes generados durante la compilación.
building '_cl' extension
se genere un error y detenga el proceso, haciendo referencia a que no es posible encontrar un archivo vcvars
o vsvars
, hay que asegurarse de que la variable PATH
se actualizó durante la instalación de Visual C++ 2008 Express y permite acceder al compilador. Aparte es posible que haya que configurar manualmente la variable VS90COMNTOOLS
que debe contener la ruta al directorio donde se encuentran las herramientas comunes de Visual Studio 2008. Para ello no hay más que introducir la sentencia set VS90COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
(lógicamente adecuada a donde se haya instalado Visual C++ 2088 en nuestro sistema), poniendo especial atención a esa barra invertida al final, sin la cual seguirán surgiendo errores.
Completado el proceso de compilación e instalación, ya deberíamos poder trabajar con OpenCL desde Python. Podemos comprobarlo abriendo el intérprete interactivo de Python y ejecutando la sentencia import pyopencl
. Si todo va bien, podemos usar el objeto pyopencl
para obtener información del hardware OpenCL, transferir datos desde y hacia la GPU, enviar programas a la GPU para que los ejecute, etc. Si al ejecutar dicha orden, por el contrario, aparece un mensaje de error como el siguiente:
Traceback (most recent call last): File "C:\Python26\pruebaPYOPENCL.py", line 1, inimport pyopencl as cl File "C:\Python26\lib\site-packages\pyopencl-0.92-py2.6-win32.egg\pyopencl\__init__.py", line 3, in import pyopencl._cl as _cl ImportError: DLL load failed: No se puede encontrar el módulo especificado.
el problema se deberá seguramente a que no es posible localizar las bibliotecas de Boost. Aunque en la mencionada wiki de PyOpenCL que es necesario copiarlas a C:\Windows\System32
, en mi caso esto tampoco solucionaba el problema, que desapareció al copiarlas al directorio C:\Python26
, es decir, la carpeta donde esté instalado Python. Los archivos a copiar, desde la carpeta de Boost a la de Python, son dos: boost_python-vc90-mt-1_40.dll y boost_thread-vc90-mt-1_40.dll.
Solucionado este último problema, deberíamos poder usar OpenCL desde Python sin ningún problema. En la imagen inferior puede verse cómo desde el intérprete he consultado el número de plataformas disponibles y, para cada una de ellas, los dispositivos que hay instalados. Lo más interesante es que a partir de aquí es posible trabajar con OpenCL interactivamente, olvidándose de los quebraderos de cabeza de C/C++, la compilación, depuración, etc.
Torre de Babel - Francisco Charte Ojeda - Desde 1997 en la Web