scieee AI-readable full text Open interactive document viewer

Implementación eficiente de redes neuronales autoorganizadas en CUDA C/C++.

Gill, Shelley

Abstract

En este documento se expondrá una implementación del problema del viajante de comercio usando una implementación personalizada de un mapa auto-organizado basándose en soluciones anteriores y adaptándolas a la arquitectura CUDA, haciendo a la vez una comparativa de la implementación eficiente en CUDA C/C++ con la implementación de las funciones de GPU incluidas en el Parallel Computing Toolbox de Matlab. La solución que se da reduce en casi un cuarto las iteraciones necesarias para llegar a una solución buena del problema mencionado, además de la mejora inminente del uso de las arquitecturas paralelas. En esta solución se estudia la mejora en tiempo que se consigue con el uso específico de la memoria compartida, siendo esta una de las herramientas más potentes para mejorar el rendimiento. En lo referente a los tiempos de ejecución, se llega a concluir que la mejor solución es el lanzamiento de un kernel de CUDA desde Matlab a través de la funcionalidad incluida en el Parallel Computing Toolbox.

Full text

ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA Mención Computación Implementación eficiente de redes neuronales autoorganizadas en CUDA C/C++. Effitient implementation of self organizing neural netword in CUDA C/C++. Realizado por Shelley Gill Tutorizado por Enrique Domínguez Merino Departamento Lenguajes y Ciencias de la Computación UNIVERSIDAD DE MÁLAGA MÁLAGA, Diciembre 2015 Fecha defensa: El Secretario del Tribunal Resumen: En este documento se expondrá una implementación del problema del viajante de comercio usando una implementación personalizada de un mapa auto-organizado basándose en soluciones anteriores y adaptándolas a la arquitectura CUDA, haciendo a la vez una comparativa de la implementación eficiente en CUDA C/C++ con la implementación de las funciones de GPU incluidas en el Parallel Computing Toolbox de Matlab. La solución que se da reduce en casi un cuarto las iteraciones necesarias para llegar a una solución buena del problema mencionado, además de la mejora inminente del uso de las arquitecturas paralelas. En esta solución se estudia la mejora en tiempo que se consigue con el uso específico de la memoria compartida, siendo esta una de las herramientas más potentes para mejorar el rendimiento. En lo referente a los tiempos de ejecución, se llega a concluir que la mejor solución es el lanzamiento de un kernel de CUDA desde Matlab a través de la funcionalidad incluida en el Parallel Computing Toolbox. Palabras claves:CUDA, Parallel Computing Toolbox, Matlab, problema del viajante de comercio, mapas auto-organizadas, memoria compartida. Abstract: In this document I will explain an implementation of the travelling salesman problem using a personalized implementation of a self-organizing map basing it on past solutions and adapting them to the CUDA arquitecture, making at the same time a comparison of the effitient implementation in CUDA C/C++ with the implementation of the GPU functions included in the Parallel Computing Toolbox from Matlab. The solution given reduces in almost a quarter the iterations necessary for getting a good solution of the problem mentioned, as well as the imminent mark up from the use of parallel arquitectures. In this solution I study the tie mark up that is achieved by using the shared memory in CUDA specifically, this being one of the best tools for gining effitiency. When it comes to the execution times, we can conclude that the best solution es the execution of a CUDA kernel from Matlab through the functionalities included in the Parallel Computing Toolbox. Keywords: CUDA, Parallel Computing Toolbox, Matlab, travelling salesman problem, self-organizing maps, shared memory. VI ´ Indice general 1. Introducci´ on 1 1.1.Antecedentes.......................... 1 1.2.Objetivos ............................ 2 1.3.Trabajofuturo.......................... 2 1.4. Estructura de la memoria . . . . . . . . . . . . . . . . . . . 3 2. Mapas auto-organizados 5 2.1. Redes Neuronales Artificiales . . . . . . . . . . . . . . . . . 5 2.1.1. Aprendizaje no supervisado en RNAs . . . . . . . . 6 2.1.2. SOM o redes de Kohonen . . . . . . . . . . . . . . . 7 2.1.3. Adaptaciones al problema del viajante . . . . . . . . 9 3. Paralelizaci´ on 15 3.1.Ventajas............................. 15 3.2.Inconvenientes ......................... 16 3.3. Descripci´ on de las tecnolog´ ıas ................ 17 4. Implementaci´ on 19 4.1. Pruebas de rendimiento . . . . . . . . . . . . . . . . . . . . 19 4.2. Soluci´ on............................. 20 5. Resultados 27 5.1.Eficiencia ............................ 27 5.1.1. Pruebas de rendimiento . . . . . . . . . . . . . . . . 28 5.1.2. Soluci´ on......................... 28 5.2.Calidad ............................. 29 5.3.Dificultad ............................ 29 5.3.1. Pruebas de rendimiento . . . . . . . . . . . . . . . . 29 VII ´ INDICE GENERAL 5.3.2. Soluci´ on......................... 30 6. Uso del software 31 6.1.Pruebas............................. 31 6.1.1. CUDA.......................... 32 6.1.2. Matlab.......................... 32 6.2. C´ odigo.............................. 33 6.2.1. CUDA.......................... 34 6.2.2. Matlab.......................... 35 6.2.3. Resultados ....................... 35 7. Conclusiones 39 VIII Cap´ıtulo 1 Introducci´ on En este documento se proceder´ a a exponer tanto datos te´ oricos como pr´ acticos para la realizaci´ on de un mapa auto-organizado adaptado al problema del viajante de comercio y a la arquitectura de tarjetas gr´ aficas. Adem´ as se har´ a una comparativa tanto en eficiencia como en facilidad de implementaci´ on y calidad de los resultados de la implementaci´ on a m´ as bajo nivel como es el caso de CUDA o de la implementaci´ on realizada en Matlab. 1.1. Antecedentes En el contexto actual, nos encontramos con una colecci´ on de problemas NP que mediante el uso de algoritmos de aprendizaje se puede llegar a obtener buenas aproximaciones en un tiempo mucho m´ as razonable. Esto ocurre con el problema del viajante de comercio, que usando una aproximaci´ on mediante una red de Kohonen adaptada al problema, puede conseguir una mejora notable en el tiempo de ejecuci´ on. 1 CAP´ ITULO 1. INTRODUCCI ´ ON Adem´ as con la mejora de los componentes dedicados al procesamiento masivo de datos en paralelo, podemos mejorar el rendimiento m´ as a´ un, obteniendo en muchos casos la mejora gratuita con una mejora de hardware. 1.2. Objetivos Se pretende dar una soluci´ on aproximada al problema del viajante de comercio, utilizando las tecnolog´ ıas gr´ aficas aplicadas a una soluci´ on adaptada a una red de Kohonen. Tambi´ en se har´ a una comparaci´ on entre las implementaciones realizadas para concluir sobre la implementaci´ on en Matlab de las librer´ ıas de CUDA. Para ello se va a repasar los detalles te´ orico-pr´ acticos que se han utilizado, y se dar´ an detalles sobre la implementaci´ on y las adaptaciones de los algoritmos que se han seguido. 1.3. Trabajo futuro Dado que el problema del viajante pertenece al conjunto de los problemas NP, y en este conjunto podemos reducir un problema a otro del mismo conjunto con tiempo lineal, este trabajo es muy interesante para llegar a una aproximaci´ on buena para muchos problemas. 2 CAP´ ITULO 1. INTRODUCCI ´ ON 1.4. Estructura de la memoria El documento estar´ a organizado en cap´ ıtulos diferenciados por tema, a continuaci´ on se da una breve explicaci´ on de cada uno. Se estudiar´ an las RNA generales, en m´ as profundidad las RNA con aprendizaje no supervisado y haciendo especial hincapi´ e en las redes de Kohonen o mapas auto-organizados. Adem´ as se estudiar´ a las razones por las que pueden o no ser paralelizadas las RNA y las ventajas e inconvenientes a las que puede llevar. Las tecnolog´ ıas de las que haremos uso ser´ an CUDA C/C++ y Matlab junto con el Parallel Computing Toolbox, y m´ as espec´ ıficamente su implementaci´ on de funciones de GP-GPU. Se ver´ an aqu´ ı detalles espec´ ıficos de los lenguajes, los modelos de computaci´ on, las infraestructuras necesarias y datos de rendimiento. Tambi´ en se dar´ a a conocer la arquitectura GP-GPU con especial inter´ es en la tarjeta gr´ afica usada para el trabajo. Se ver´ a en detalle el problema de viajante y con mayor detenimiento la adaptaci´ on del mismo al mapa auto-organizado para su resoluci´ on, adem´ as de hacer comparativas tanto de rendimiento como de la calidad. El mismo problema ser´ a implementado en las tecnolog´ ıas descritas y los detalles espec´ ıficos de la implementaci´ on ser´ an descritas, junto con las distintas implementaciones posibles a ra´ ız de ejemplos y decisiones tomadas. Se intentar´ a adem´ as comprobar la eficiencia de la implementaci´ on de Matlab del paralelismo en GP-GPU en comparaci´ on con la realizada a mano en CUDA C/C++. Adem´ as se estudiar´ a la dificultad que tiene para el programador y la calidad de los resultados. Finalmente se expondr´ an una serie de conclusiones finales, ramificaciones posibles, escalabilidad e integraci´ on en otros entornos. 3 CAP´ ITULO 2. MAPAS AUTO-ORGANIZADOS Figura 2.3: Representaci´ on de la arquitectura. y realizando el aprendizaje mediante el movimiento de la posici´ on de las neuronas en el espacio. En este caso la entrada consiste en dos sensores que toman una lista de coordenadas, normalizadas seg´ un la f´ ormula xscaled =(x−xmin) (xmax−xmin), de una a una, escogiendo como neurona ganadora la que se encuentra m´ as cercana de la entrada. El mapa que se emplea es parecida al apartado anterior, las neuronas se encuentras dispuestas en un c´ ırculo de radio 1 y centro 0. Se tienen como vecinos las neuronas inmediatamente a cada lado. La regla de aprendizaje queda como sigue: f(σ,d) = e−d2 σ2 ynew j=yold j+α·f(σ,d)·xi−yold j El caso pr´ actico que se incluye en el art´ ıculo [2] toma como entradas las de la tabla 2.5. Tras crear la capa de neuronas y normalizamos las entradas nos queda una representaci´ on como en la figura 2.5 10 CAP´ ITULO 2. MAPAS AUTO-ORGANIZADOS Figura 2.4: Representaci´ on de la arquitectura. Con esto ya se puede realizar el aprendizaje, obteniendo un resultado parecido a la representaci´ on de la figura 2.6, donde se obtiene que el camino m´ ınimo es MT LKIADBOEQRSFHCGPJNM. 11 CAP´ ITULO 2. MAPAS AUTO-ORGANIZADOS WDS latitude longitude WDS latitude longitude A 53.214 19.155 K 52.349 18.924 B 53.560 19.221 L 49.763 19.076 C 53.280 19.167 M 52.758 18.790 D 53.111 19.220 N 52.988 18.920 E 54.200 19.210 O 53.719 19.194 F 54.390 19.185 P 53.684 19.031 G 53.848 19.079 Q 54.058 19.269 H 53.721 19.170 R 54.076 19.399 I 53.603 19.027 S 54.390 19.399 J 53.494 18.969 T 49.763 18.790 Tabla 2.5: Valores de entradas. Figura 2.5: Neuronas y entradas normalizadas. 12 CAP´ ITULO 2. MAPAS AUTO-ORGANIZADOS Figura 2.6: Neuronas y entradas normalizadas tras el aprendizaje. 13 CAP´ ITULO 2. MAPAS AUTO-ORGANIZADOS 14 Cap´ıtulo 3 Paralelizaci´ on La paralelizaci´ on de procesos, como todo en esta vida, tiene sus ventaja y sus inconvenientes, en el caso que estamos estudiando, las ventajas de tiempo tienen mucho m´ as peso que la dificultad que a˜ nade a la implementaci´ on. Esto se debe a que las RNA son extremadamente paralelizables, ya que consisten en unidades de proceso muy sencillas que interfieren entre s´ ı en sus c´ alculos. Es siempre necesario tener en cuenta el coste de la paralelizaci´ on frente a la reducci´ on posible por la paralelizaci´ on. En el caso de las adaptaciones al problema del viajante de comercio o TSM por sus siglas en Ingl´ es, se ve que tiene mucho potencial. El ´ unico problema es que por cada entrada tenemos que actualizar tres elementos de la capa de neuronas, y tambi´ en puede ocurrir, y ocurre, que hay entradas para las que la neurona ganadora es la misma. 3.1. Ventajas La ventaja m´ as notable es la mejora del tiempo, pero en el caso de las RNA la sencillez con la que se paraleliza, acaba siendo casi m´ as intuitiva la implementaci´ on. 15 CAP´ ITULO 3. PARALELIZACI ´ ON Matlab En este caso las ventajas son numerosas, pero cabe destacar la facilidad con la que, con el uso del Parallel Computing Toolbox, se puede realizar numerosas aplicaciones sin mucho esfuerzo y sin necesitar un periodo de aprendizaje muy largo. Quiz´ as m´ as importante, es la oportunidad de usar un elevad´ ısimo n´ umero de funciones que pueden ser paralelizadas sin m´ as que indicar que se ejecuten en paralelo. Tambi´ en es interesante mencionar la posibilidad de lanzar kernels de CUDA desde Matlab lo que nos da la posibilidad de usar toda la potencia de CUDA sin tener que cambiar de entorno de trabajo. CUDA Las ventajas de CUDA son tambi´ en muy sorprendentes, el uso de una arquitectura dise˜ nada de forma global por una misma organizaci´ on, da lugar a un sistema muy ´ optimo. Tambi´ en es importe destacar las mejoras notables que ha transformado una arquitectura poco amigable, en una sencilla y bien documentada. Las mejoras incluyen la inclusi´ on de un debugger con el NSight edition de las versiones de CUDA, compatibles con Eclipse y Visual Studio, tambi´ en se ha simplificado la implementaci´ on mediante el uso transparente de la memoria para el programador a partir de CUDA 6.0, aunque este empeore el rendimiento y la inclusi´ on de paralelismo din´ amico, a partir de la versi´ on 5.0, que consiste en la posibilidad de lanzar kernels desde un kernel, reduciendo el uso de CPU y transferencia de datos entre las memorias de CPU y de v´ ıdeo. 3.2. Inconvenientes El inconveniente m´ as notable en el caso de la utilizaci´ on del procesador gr´ afico, es el peso que tiene lanzar c´ odigo, tiene un coste elevado en tiempo. De esta manera tenemos que estar seguros de tener un problema que merece el esfuerzo y el coste vinculados a la paralelizaci´ on. 16 CAP´ ITULO 3. PARALELIZACI ´ ON Matlab En este caso el principal problema es la facilidad con la que podemos llegar a caer en un caso de uso poco deseado para el rendimiento, y es el uso de funciones sin indexar en paralelo. Esto ocurre, por ejemplo, si tenemos un array alocado en la tarjeta gr´ afica, y en vez de usar alguna de las funciones para las operaciones elemento a elemento se utilice un bucle para operar sobre el array [3] en este art´ ıculo se incluyen ejemplos y banchmarking del uso de pagefun sobre arrays alocados en GPUs con funciones indexadas y no indexadas frente a los mismos c´ alculos en CPU. CUDA Hay dos inconvenientes principales para el uso de de CUDA, el primero es la curva de aprendizaje, este es muy empinado al principio, cosa que crea una barrera para los programadores acostumbrados a un paralelismo m´ as intuitivo y en CPU. El segundo es, que al necesitar ejecutarse sobre un tarjeta NVidia, lo hace incompatible con muchos equipos, hace que a la hora de escoger tecnolog´ ıas haya muchas empresas que a´ un usan tecnolog´ ıas paralelas en CPU u optan por su contrapartida libre OpenCL. 3.3. Descripci´ on de las tecnolog´ıas Se han utilizado CUDA C/C++ utilizando Visual Studio community 2013 como IDE y Matlab junto con su Parallel Computing Toolbox. CUDA Como podemos leer en la misma p´ agina de NVidia, CUDA es una arquitectura de c´ alculo paralelo que aprovecha la gran potencia de la GPU 17 CAP´ ITULO 3. PARALELIZACI ´ ON para proporcionar un extraordinario incremento en rendimiento. En este caso vamos a hacer uso de la capacidad de c´ alculo para calcular una red neuronal, para ello se ha usado la versi´ on 6.5 de CUDA C/C++, y compilado con el compute capability 2.0, de tal manera, pudi´ endose hacer uso de ciertas funciones desde los kernels de CUDA como pueden ser las impresiones de pantalla que da mucha facilidad a la hora de la implementaci´ on, y en particular la funci´ on de la ra´ ız cuadrada, que en esta implementaci´ on es necesaria para el c´ alculo de la distancia entre los puntos. Se ejecuta sobre una tarjeta gr´ afica NVidia GeForce GT 650M, con 384 n´ ucleos y memoria dedicada de 2Gb. Matlab Para la implementaci´ on final se ha utilizado Matlab 14b junto con el Parallel Computing Toolbox, aunque para las pruebas de concepto se ha utilizado tambi´ en el Neural Network Toolbox. Parallel Computing Toolbox es una librer´ ıa en Matlab que permite hacer uso de la capacidad de procesamiento de los equipos multicore, con tarjetas gr´ aficas y en clusters. Neural Network Toolbox es una librer´ ıa de Matlab que incluye una serie de funciones y aplicaciones para modelar sistemas no lineales entre ellos aprendizaje por refuerzo, mapas auto-organizados y redes din´ amicas. 18 Cap´ıtulo 4 Implementaci´ on Antes de realizar la implementaci´ on se hacen una serie de pruebas de concepto, que se explicar´ an en detalle en el cap´ ıtulo de los resultados, con los cuales se han tomado unas decisiones sobre la implementaci´ on, como puede ser el uso de memoria compartida en la implementaci´ on de CUDA o el uso del mismo kernel de CUDA en la implementaci´ on de Matlab. 4.1. Pruebas de rendimiento Lo que se ha hecho para comprobar en un inicio la diferencia de tiempo entre usar Matlab con el Parallel Computing Toolbox, usar Matlab para ejecutar un kernel de CUDA, usar CUDA con la memoria compartida y CUDA con la memoria por defecto, se ha medido para comprobar la diferencia en la eficiencia de la implementaci´ on del uso de la tarjeta gr´ afica en Matlab, hice una prueba sencilla de lanzar un kernel mand´ andole un array de ceros de longitud 100, sumarle 1 a cada posici´ on y devolver el resultado. 19 CAP´ ITULO 4. IMPLEMENTACI ´ ON 26 Cap´ıtulo 5 Resultados Se han realizado una serie de pruebas de concepto descritos en el cap´ ıtulo anterior para poder llegar a las implementaciones ´ optimas. En este cap´ ıtulo adem´ as se repasan los resultados obtenidos tras la implementaci´ on en ambas tecnolog´ ıas de una implementaci´ on del TSM con una red de Kohonen personalizada, las medidas de tiempo tomadas han sido de las ejecuciones propias del kernel incluyendo tambi´ en la transferencia de datos entre memoria de CPU y de GPU en ambos sentidos, no se ha tenido en cuenta ni la lectura y escritura en ficheros ni la normalizaci´ on de la preparaci´ on de los datos en la CPU, ya que no es de inter´ es para el objetivo de este documento. 5.1. Eficiencia En este apartado se expondr´ an los tiempos de ejecuci´ on de cada una de las pruebas y algoritmos implementadas con el fin de comparar los mejores resultados. 27 CAP´ ITULO 5. RESULTADOS 5.1.1. Pruebas de rendimiento Todos los resultados expuesto en este apartado se realizan como media de 10 ejecuciones del c´ odigo. Tal y como se explica en el cap´ ıtulo anterior estas cuatro pruebas consisten en sumar 1 a cada elemento de un array de 100 posiciones. Es importante mencionar, a ra´ ız de estas pruebas, y respuestas de varias preguntas publicadas en varios foros adem´ as de la b´ usqueda en la documentaci´ on de Matlab, ´ este ejecuta el c´ odigo en modo JIT, haciendo que, la primera ejecuci´ on de un c´ odigo sea mucho m´ as lenta que las posteriores. Matlab con Parallel Computing Toolbox Media de tiempo de la primera ejecuci´ on: 2096ms. Media de tiempo de las posteriores ejecuciones: 0.9ms. Matlab lanzando kernel de CUDA Media de tiempo de la primera ejecuci´ on: 1623ms. Media de tiempo de las posteriores ejecuciones: 5.8ms. CUDA memoria por defecto Media de tiempo de la primera ejecuci´ on: 685ms. Media de tiempo de las posteriores ejecuciones: 282ms. CUDA memoria compartida Media de tiempo de la primera ejecuci´ on: 577ms. Media de tiempo de las posteriores ejecuciones: 188ms. 5.1.2. Soluci´ on CUDA Media de tiempo de la primera ejecuci´ on: 1108ms. Media de tiempo de las posteriores ejecuciones: 575ms. 28 CAP´ ITULO 5. RESULTADOS Matlab Media de tiempo de la primera ejecuci´ on: 2708ms. Media de tiempo de las posteriores ejecuciones: 21ms. Estos dos ´ ultimos resultados se cumplen cambiando las entradas, ya sea el mapa de entrada o los valores de la tasa de aprendizaje, tambi´ en se mantienen de forma proporcional al n´ umero de iteraciones de aprendizaje, con lo cual, en cuanto a rendimiento, la mejor opci´ on es la de integrar un kernel de CUDA en c´ odigo Matlab, si no tenemos en cuenta el peso que tiene la ejecuci´ on del propio Matlab. Como ya se ha mencionado esto se debe a la ejecuci´ on JIT, tambi´ en por ese factor podemos observar que la primera ejecuci´ on tarda m´ as del doble con respecto a su contrapartida CUDA C/C++. 5.2. Calidad La calidad es la misma en CUDA y Matlab, los valores obtenidos por ambas ejecuciones ha dado lugar a la misma soluci´ on ´ optima, que adem´ as coincide con la soluci´ on obtenida con la adaptaci´ on para la ciudad de Nis [2] 5.3. Dificultad 5.3.1. Pruebas de rendimiento Matlab con Parallel Computing Toolbox El uso de este Toolbox en Matlab, para las operaciones m´ as comunes es extremadamente sencillo y muy asequible para cualquiera que tenga un conocimiento m´ ınimo del uso de array en Matlab. 29 CAP´ ITULO 5. RESULTADOS Matlab lanzando kernel de CUDA La dificultad de lanzar un kernel de CUDA desde Matlab no tiene dificultad ninguna, es inmediato, s´ olo hay que saber crear arrays en GPU y seguir las instrucciones de la documentaci´ on del Parallel Computing Toolbox. CUDA memoria por defecto La inclusi´ on de la transparencia de la memoria para el programador, simplific´ o en gran medida la curva de aprendizaje, haciendo esta arquitectura mucho m´ as asequible para el programador medio. CUDA memoria compartida En cuanto a la dificultad en un primer instante, la implementaci´ on en CUDA parec´ ıa ser m´ as compleja, pero tras un breve periodo de aprendizaje el uso de memoria compartida es muy sencilla respecto a la mejora en rendimiento que tiene asociada. 5.3.2. Soluci´ on La dificultad de ambas implementaciones reside en la implementaci´ on del kernel, ya que aparte de esta funcionalidad hace poco m´ as que leer y escribir de fichero. La dificultad principal de esta implementaci´ on reside en decidir las fases de aprendizaje y los par´ ametros de entrada, ya que es muy f´ acil obtener resultados con un sobre ajuste, o una soluci´ on no satifactoria, ya sea por un sobre ajuste en una de las fases, o por que se excluya una de las entradas de la soluci´ on final. 30 Cap´ıtulo 6 Uso del software En este cap´ ıtulo dar´ e una serie de pasos para poner en funcionamiento el software incluido en el cd. En el cd viene incluido el c´ odigo de la implementaci´ on de la soluci´ on al TSM con una adaptaci´ on de SOM incluida en la carpeta Codigo y el c´ odigo de las pruebas de rendimiento en la carpeta Pruebas 6.1. Pruebas En la carpeta Pruebas, encontramos dos carpetas CUDA yMatlab con el c´ odigo de las pruebas de rendimiento hechas en CUDA C/C++ y Matlab respectivamente. Cada una de estas incluye una prueba que consiste en crear un array de ceros de cien posiciones en GPU, sumarle uno y volver el array a CPU. 31 CAP´ ITULO 6. USO DEL SOFTWARE 6.1.1. CUDA Para compilar este c´ odigo, hay que ir a la documentaci´ on de CUDA, buscar el sistema operativo en el listado e instalar los paquetes necesario. Luego, siguiendo los pasos de la documentaci´ on hay que compilar los archivo *.cu en las subcarpetas. En la carpeta sumaSimple podemos encontrar el c´ odigo de la prueba de rendimiento para CUDA con la memoria por defecto y en la carpeta sumaShared el c´ odigo de la prueba de rendimiento para CUDA con la memoria compartida. Cuando estos se ejecuten, imprimir´ an por pantalla el tiempo que llevan en realizar la suma. 6.1.2. Matlab Para ejecutar este c´ odigo se necesita tener el Parallel Computing Toolbox. Para ejecutar el c´ odigo de sumaSimple.cu no se necesita ning´ un paso o configuraci´ on espacial, esta prueba de rendimiento es la que mide el tiempo para el uso de las funciones propias de GPU de el Parallel Computing Toolbox. Lo que imprime en el terminal de salida de Matlab es el tiempo que lleva la suma. En el caso de sumaKernel.cu, tenemos que antes compilar el kernel kernel.cu tambi´ en en esta carpeta, para ello, antes de ejecutar el script de Matlab por primera vez, hay que lanzar el siguiente c´ odigo system(’nvcc - ptx kernel.cu’), luego se ejecuta el script de forma normal. Lo que imprime en el terminal de salida de Matlab es el tiempo que lleva la suma. 32 CAP´ ITULO 6. USO DEL SOFTWARE 6.2. C´ odigo Como se puede observar, en la carpeta Codigo hay tres carpetas, dos de ellas referentes a las implementaciones en CUDA C/C++ y Matlab llamadas CUDA yMatlab respectivamente, y otra carpeta Resultados que contiene los resultados de las ejecuciones, los datos de entrada y un script en Matlab de visualizaci´ on. Antes de poder ejecutar el c´ odigo hay que establecer el path donde se van a encontrar los datos de entrada y donde se van a escribir los resultados, este puede ser la misma carpeta Resultados. Esto se hace cambiando la ruta que hay en el archivo path al deseado dentro de las carpetas CUDA yMatlab, y es necesario que los datos de entrada se encuentren aqu´ ı. Cuando se ejecutan ambas versiones de la implementaci´ on personalizada, la de CUDA y la de Matlab, saldr´ a una ventana para que el usuario introduzca los datos de compilaci´ on. Esta ventana pedir´ a al usuario siete entradas: 1. nombre del archivo que contiene las coordenadas del mapa. Cada l´ ınea de este documento se compone de dos n´ umeros separados por espacio estos corresponden a un punto. Para el ejemplo incluido hay que introducir inputOrig.txt este archivo tiene que estar en la carpeta indicada en el archivo path. 2. n´ umero de iteraciones de la primera fase de aprendizaje. Para el ejemplo incluido 50. 3. suma del n´ umero de iteraciones de las fases dos y tres. Para el ejemplo incluido 500. 4. n´ umero de la iteraci´ on de la suma anterior, a partir de la cual la segunda fase se convierte en la tercera. Para el ejemplo incluido 100. 5. n´ umero de veces m´ as grande que tiene que ser el c´ ırculo de neuronas con respecto al n´ umero de entradas. Para el ejemplo incluido 3. 33 CAP´ ITULO 6. USO DEL SOFTWARE 6. valor de la tasa de aprendizaje de las dos primeras fases. Para el ejemplo incluido 0.1. 7. valor de la tasa de aprendizaje de la tercera fase. Para el ejemplo incluido 0.5. Tras coger los datos de entrada, el programa calcula un camino bueno para la entrada y lo guarda en una nueva carpeta dentro de la carpeta indicada en el archivo path. La carpeta nueva tiene como nombre [CUDA kMATLAB]−{time} − {var1}−{var2}−{var3}−{var4}−{var5} − {var6}− {var7}. 6.2.1. CUDA Tras compilar el c´ odigo siguiendo la documentaci´ on de CUDA, y ejecutarlo, nos encontramos con una ventana como la de la figura 6.1. Figura 6.1: Ventana para la entrada CUDA. 34 CAP´ ITULO 6. USO DEL SOFTWARE 6.2.2. Matlab Para ejecutar este c´ odigo hay que compilar primero el kernel kohonen.cu que se encuentra en la misma capreta Matlab con el siguiente comando system(’nvcc -ptx kernel.cu’). Ahora se puede ejecutar el script kohonen.m que lanzara una ventana como en la figura 6.2. Figura 6.2: Ventana para la entrada Matlab. 6.2.3. Resultados Para ver los resultados obtenidos por el software explicado anteriormente se lanza el script drawMap.m y este mostrar´ a por pantalla una lista de 35