Descargar el archivo PDF
Transcripción
Descargar el archivo PDF
Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández (Recibido: 15 de agosto de 2011; aprobado: 26 de septiembre de 2011) Resumen Este trabajo presenta los principales resultados y recomendaciones prácticas que resultan de un estudio reciente sobre algunas variantes paralelas de un algoritmo de optimización por cúmulo de partículas (PSO), puestas en práctica en una unidad de procesamiento de gráficos (dispositivo GPU), con capacidad para administrar múltiples hilos (multi-hilos), empleando CUDA (Arquitectura unificada de dispositivo computador), el modelo de programación paralela para estos casos. Se demuestra que, con la ayuda de un dispositivo GPU multi-hilos, es posible obtener versiones paralelas del algoritmo PSO por medio de una programación paralela simple y directa, aprovechando el poder de cómputo de un dispositivo GPU que puede ser equivalente a un cluster en una computadora personal convencional. En particular, se ofrecen recomendaciones prácticas para el buen uso de un dispositivo GPU multi-hilos. El algoritmo PSO es una alternativa bien conocida para resolver problemas de optimización global con base en una heurística bio-inspirada, que por su naturaleza poblacional resulta ideal para su programación paralela. El algoritmo PSO tiene buen desempeño, baja complejidad computacional y pocos parámetros. Estas técnicas heurísticas han sido extensamente estudiadas en los últimos veinte años y, aún hoy, la comunidad científica está interesada en alternativas tecnológicas que aceleren estos algoritmos a fin de aplicarlos a problemas más grandes y más complejos. Palabras clave - GPU multi-hilos, PSO, GPU de uso general, programación paralela, optimización global. Gerardo Abel Laguna Sánchez: Doctor en Ciencias de la Computación, [email protected]. Departamento de Ingeniería Eléctrica, Universidad Autónoma Metropolitana – Iztapalapa, Av. San Rafael Atilxtco 186 Iztapalapa, (C.P. 09340), México, D.F., México. Mauricio Olguín Carbajal: Doctor en Ciencias de la Computación, [email protected], Instituto Politécnico Nacional IPN, Av. Luis Enrique Erro S/N, Unidad Profesional Adolfo López Mateos, Zacatenco, Delegación Gustavo A. Madero (C.P. 07738), México, D.F., México. Nareli Cruz-Cortés: Doctora en Ciencias, [email protected]. Centro de Investigación en Computación - CIC, Instituto Politécnico Nacional – IPN,IPN, Av. Juan de Dios Bátiz, Esq. Miguel Othón de Mendizabal | Col. Nueva Industrial Vallejo Delegación Gustavo A. Madero (C.P. 07738), México, D.F, México. Ricardo Barrón-Fernández: Doctor en Ciencias de la Computación, [email protected] de Investigación en Computación - CIC, Instituto Politécnico Nacional – IPN Centro de Investigación en Computación CIC-IPN. Av. Juan de Dios Bátiz, Esq. Miguel Othón de Mendizabal, Col. Nueva Industrial Vallejo Delegación Gustavo A. Madero (C.P. 07738), México, D.F, México. El artículo es resultado del proyecto de investigación SIP-20100379 (IPN) “Graficación, ondeletas y sus aplicaciones”, financiado mediante recursos de la SIP-IPN, el fondo I0013/91434 (CONACyT) y la beca de doctorado #210397 (CONACyT), del que resultó una tesis doctoral desarrollada al interior del grupo de investigación del Laboratorio de Inteligencia Artificial del Centro de Investigación en Computación del Instituto Politécnico Nacional. Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 59 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández On a Parallel Programming of Particle Swarm Optimization Algorithm in a Multithreading GPU Device Abstract This article presents the main results and practical issues from a recent study about some parallel variants for a Particle Swarm Optimization (PSO) algorithm, implemented on a Graphic Process Unit (GPU) device with multi-thread support and using CUDA (Compute Unified Device Architecture), the most recent model of parallel programming for these cases. It is shown that, with the help of a multithreading GPU, it is possible to significantly improve the PSO algorithm performance by means of a simple and straightforward parallel programming, getting the computing power similar to a cluster in a conventional personal computer. Particularly, we expose some practical considerations in order to get a good GPU application. PSO algorithm is a well known alternative for global optimization based on a bio-inspired heuristic, which, as a population-based one, is a good candidate to be parallelized. PSO algorithm has good performance, low computational complexity and few parameters. These heuristic techniques have been widely studied in the last twenty years and the scientific community is still interested in technological alternatives that accelerate these algorithms in order to apply them to bigger and more complex problems. Keywords – Multithreading GPU, PSO, general purpose GPU, parallel programming, global optimization. Em relação a programação paralela de um algoritmo de otimização por conglomerado de partículas em um dispositivo GPU multi-hilos Resumo Este trabalho apresenta as principais conclusões e recomendações práticas resultantes de um estudo recente de algumas variantes paralelas de um algoritmo de otimização por conglomerado de partículas (PSO), implementado em uma unidade de processamento gráfico (GPU dispositivo), capaz de gerenciar múltiplos hilos (multi-hilos), usando CUDA (Arquitectura unificada de dispositivo computador ), o modelo de programação paralela para esses casos. se mostra que com a ajuda de um dispositivo GPU ulti-hilos é possível obter versões paralelas do algoritmo PSO através de uma programação paralela simple e direta paralela, aproveitando o poder de computação do dispositivo GPU que pode ser equivalente a um cluster em um computadorpessoal convencional. Em particular, nós fornecemos recomendações práticas para o uso adequado de um dispositivo GPU multi-hilos. O algoritmo PSO é uma alternativa bem conhecida para resolver problemas de otimização global baseado em uma heurística bio-inspirados heurística, que pela sua natureza é ideal para a programação paralela. O algoritmo PSO tem bom desempenho, baxa complexidade computacional e poicos parâmetros. Estas técnicas heurística têm sido extensivamente estudadas nos últimos 20 anos e ainda hoje, a comunidade científica está interessada em alternativas tecnologias que aceleram estes algoritmos, a fim de aplicar a problemas maiores e mais complexos. Palavras - chave – GPU multi-hilos, PSO, GPU de uso geral, programação paralela, otimização global. 60 Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández I. Introducción Algunas técnicas bio-inspiradas, como el cómputo evolutivo [1], optimización por colonia de hormigas [2][3] y PSO [4], fueron propuestas como alternativas para solucionar problemas de optimización difíciles, obteniendo soluciones aceptables en un tiempo razonable. Debido a que estas técnicas trabajan con una población de individuos, pueden probar diferentes soluciones en forma simultánea, siguiendo reglas específicas y usando procesos estocásticos subyacentes. Estas técnicas heurísticas han sido aplicadas en prácticamente todos los campos del conocimiento, obteniendo buenos resultados, incluso al ejecutarse en computadoras personales comunes (por ejemplo, ver [5]). Aquí se entiende por “buenos resultados” a la combinación de encontrar soluciones muy cercanas al óptimo en un tiempo razonable o, como suele decirse formalmente, en “tiempo polinomial”. Las técnicas heurísticas obtienen soluciones aceptables en un tiempo “razonablemente corto”, comparadas con los métodos tradicionales tales como las técnicas deterministas y enumerativas. Estas últimas pueden resultar poco prácticas, especialmente al solucionar problemas de optimización difíciles, ya que prueban cada una de las posibles soluciones de un problema. No obstante, el tiempo “razonable”, que las técnicas heurísticas pueden consumir, puede estar en el orden de segundos, minutos, o hasta horas, según el problema. De este modo, los algoritmos más simples, como PSO, se han hecho muy atractivos debido a su baja complejidad computacional, que resulta en tiempos de ejecución más cortos. Sin embargo, en los casos donde se necesita obtener una solución de tiempo real, hasta los algoritmos más simples pueden parecer lentos. Esta situación ha motivado la búsqueda de nuevas formas de acelerar el desempeño de estas heurísticas. Recientemente, se ha propuesto explotar el poder computacional disponible en las tarjetas gráficas de las computadoras personales, a fin de solucionar problemas de propósito general [6], surgiendo, con ello, la idea del dispositivo GPU de procesamiento de propósito general (GPGPU, por sus siglas en inglés). Desde entonces, tanto los fabricantes como los desarrolladores han considerado esta nueva aplicación de la computación como un área de investigación prometedora, considerando la amplia variedad de posibles aplicaciones que pueden aprovechar el paralelismo disponible en los dispositivos GPU actuales. Desde que los primeros algoritmos bio-inspirados fueron reportados, la idea de su programación paralela fue vista como una consecuencia lógica de su naturaleza poblacional [7]. En particular, para el caso de un algoritmo PSO, podemos usar los modelos paralelos desarrollados para algoritmos evolutivos [8]: el modelo global, el modelo de isla y el modelo de difusión. En este trabajo se presentan algunas variantes paralelas para el algoritmo PSO: dos variantes globales y una que se denominó “incrustada”, todas puestas en práctica en un dispositivo GPU multi-hilos. Se reportan los resultados obtenidos usando el modelo de programación CUDA, que permite al programador escribir el código con el enfoque de múltiples hilos, además de ofrecer operaciones paralelas en la memoria gráfica [9]. La idea principal es mostrar que, con la ayuda de un dispositivo GPU multi-hilos, es posible mejorar el desempeño de algoritmo PSO secuencial en forma considerable, por medio de una programación paralela simple y directa, con lo que se logra el poder computacional de un cluster en un computadora personal convencional. Este trabajo es organizado como sigue. En la Sección II se presenta el trabajo relacionado encontrado en la literatura especializada. En la Sección III se hace una semblanza histórica y se bosqueja la arquitectura general del dispositivo GPU. En la Sección IV se ofrece una breve descripción del algoritmo PSO. En la Sección V se presentan algunas consideraciones prácticas en nuestra realización. En la Sección VI se presentan los resultados experimentales y en la Sección VII se discuten los mismos. Finalmente, en la Sección VIII se ofrecen las conclusiones de este trabajo. II. Trabajo relacionado La programación paralela, por lo general, implica la migración de un código secuencial existente hacia alguna arquitectura paralela, distribuida o, incluso, concurrente. El algoritmo PSO no es la excepción y encontramos reportes, sobre las primeras tentativas de aprovechar su paralelismo implícito, tan solo algunos años después de su presentación en 1995 [4]. Por ejemplo, el trabajo de J.F. Schutte en 2003 Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 61 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández [10]. No obstante, el interés sobre la programación paralela de PSO es todavía un tema muy actual, lo que es evidente en algunos trabajos de investigación recientes, donde proponen aplicar algoritmos PSO paralelos para solucionar problemas de optimización muy complejos (ver [11], [12] y [13]). En la literatura especializada, podemos encontrar propuestas de paralelismo con diversos enfoques para cada heurística. Aunque un enfoque básico es el de procesos concurrentes que corren en sólo un procesador (ver [14]), la mayor parte de las realizaciones paralelas son por lo general diseñadas para ser ejecutadas en sistemas distribuidos (es decir, varios procesadores en una red). En estos sistemas distribuidos la sobrecarga (overhead), debida a la intercomunicación entre los diferentes procesadores, es un factor que afecta significativamente el desempeño de la aplicación paralela. A causa de esto, es comprensible que algunas realizaciones paralelas para PSO fueran propuestas adoptando estrategias de comunicación (como en [15], [16] y [17]). Incluso, recientemente, es posible encontrar propuestas para la programación paralela del algoritmo PSO con el enfoque de vectores paralelos, en [18][19]. Finalmente, debemos notar que la mayor parte de los primeros trabajos sobre la programación paralela de algoritmos poblacionales en un dispositivo GPU se centraron, por razones históricas, en los algoritmos evolutivos y genéticos (ver [20], [21], [22] y [23]). En algunos casos las experiencias obtenidas fueron aplicadas, más tarde, a la programación paralela del algoritmo PSO (como en [24]). Sin embargo, es hasta hace muy poco tiempo que se presentó el primer estudio empírico, en cuanto a la programación paralela de alguna heurística poblacional en un dispositivo GPU, explotando el enfoque de múltiples hilos concurrentes con el nuevo modelo de programación paralela CUDA [25]. Esto en consideración de que CUDA, como herramienta de programación paralela, fue introducida muy recientemente [26]. III. Unidad de procesamiento de gráficos (dispositivo GPU) A. Breve semblanza histórica El dispositivo seleccionado, para probar las variantes paralelas propuestas para el algoritmo PSO, es undispositivoGPU 62 comúnmente usado como coprocesador gráfico en sistemas de vídeo con altos requerimientos de cómputo, como es el caso de la mayoría de los juegos de vídeo actuales. Un dispositivoGPU tiene su fundamento en la arquitectura del procesador vectorial, que permite la ejecución de operaciones matemáticas en múltiples datos de forma simultánea. En contraste, los procesadores de los CPU comunes no pueden manejar más de una operación al mismo tiempo. Al principio, los procesadores vectoriales eran comúnmente usados en computadoras científicas [27], pero más tarde fueron desplazados por arquitecturas de múltiples núcleos. Sin embargo, no fueron completamente eliminados porque muchas arquitecturas para gráficos realizados por computadora, tales como los dispositivos GPU, los usan como la base de su hardware. Así, la gran demanda de juegos y producciones de vídeo de aspecto realista en tiempo real ha llevado a la producción de dispositivos GPU más poderosos y ha impulsado a los fabricantes de tarjetas de vídeo a desarrollar arquitecturas con múltiples núcleos, administración de múltiples hilos y con un poder computacional similar al de la primera supercomputadora vectorial Cray. Actualmente, la tendencia en el desarrollo de los dispositivos GPU permite prever la consolidación de un nuevo modelo de programación paralela, donde el dispositivo GPU no sólo aumenta su original capacidad del cómputo paralelo sino que, además, adquiere un papel más preponderante como administrador de múltiples hilos [28]. B. Arquitectura del dispositivo GPU El dispositivo GPU usado en este trabajo es el de la tarjeta NVIDIA GeForce 8600GT, con una arquitectura unificada de gráficos y cómputo que el fabricante llama Tesla, y que se conforma por un arreglo escalable de múltiples procesadores (multiprocesador) con administración de múltiples hilos (ver Figura 1). Cada multiprocesador consiste en ocho núcleos de procesamiento, una unidad de instrucciones multi-hilos y memoria compartida en el circuito integrado. Cada multiprocesador controla la creación, administración y ejecución de los hilos activos en el hardware, con capacidad para cientos de hilos (teóricamente hasta 512), todo dentro del concepto denominado por NVIDIA como “una instrucción - múltiples hilos” (SIMT, por sus siglas en in- Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández glés) [28]. Ya que el multiprocesador asigna cada hilo a un núcleo y cada hilo es ejecutado independientemente de los demás, con su propia dirección de instrucciones así como registros de estado, NVIDIA ofrece algunas herramientas de programación con funciones enfocadas en el manejo y optimización de múltiples hilos. Figura 1. Arquitectura del dispositivo GPU NVIDIA empleado multiprocesador disponible. Con CUDA, en el programa, se arranca la ejecución de los kernel paralelos mediante la siguiente sintaxis extendida de llamada a función: kernel<<<dimGrid, dimBlock>>>(...parámetros...); dondedimGrid y dimBlock son parámetros especializados que especifican, respectivamente, la dimensión (en bloques) de la rejilla de procesamiento paralelo y la dimensión (en hilos) de los bloques. Figura 2. Jerarquía de la memoria del GPU NVIDIA Fuente: NVIDIA [28]. Fuente: NVIDIA [28]. La herramienta de programación CUDA está diseñada para soportar el esquema de “una instrucción - múltiples hilos”, de tal manera que múltiples hilos pueden ser ejecutados sobre muchos datos. La herramienta CUDA permite que los programadores escriban el código paralelo usando lenguaje C estándar mas algunas extensiones de NVIDIA. La herramienta CUDA permite organizar el paralelismo en un sistema jerárquico de tres niveles: rejilla, bloque e hilo. El proceso comienza cuando el procesador anfitrión (CPU anfitrión) invoca una función para el dispositivo GPU, llamada kernel, luego de lo cual se crea una rejilla (o arreglo) con bloques de múltiples hilos, para distribuirla en algún Durante la ejecución del kernel, los hilos tienen acceso a seis tipos de memoria dentro del dispositivo GPU, según la siguiente jerarquía (o niveles de acceso), predefinidos por NVIDIA (ver Figura 2): • Memoria global. Es una memoria de lectura/escritura y se localiza en la tarjeta del dispositivo GPU. • Memoria para constantes. Es una memoria rápida (cache) de lectura y se localiza en la tarjeta del dispositivo GPU. • Memoria para texturas. Es una memoria rápida (cache) de lectura y se localiza en la tarjeta del dispositivo GPU. • Memoria local. Es una memoria de lectura/escritura para los hilos y se localiza en la tarjeta del dispositivo GPU. Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 63 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández • Memoria compartida. Es una memoria de lectura/escritura para los bloques y se localiza dentro del circuito integrado del dispositivo GPU. • Memoria de registros. Es la memoria más rápida, de lectura/escritura para los hilos y se localiza dentro del circuito integrado del dispositivo GPU. La memoria compartida y los registros son los más rápidos, pero su tamaño está limitado porque es memoria ubicada dentro del circuito integrado. Por otra parte, la memoria localizada en la tarjeta del dispositivo (local, global, para constantes y para texturas) es grande pero presenta mayor latencia en los accesos, en comparación con la memoria alojada dentro del circuito integrado. Ya que el multiprocesador ejecuta paralelamente los hilos en grupos de 32, llamados “tejidos” (warp), los hilos pueden tener un acceso más eficiente a la memoria global, siempre que este acceso se realice en bloques de justo la “mitad de un tejido” (half-warp), mediante lecturas/escrituras simultáneas de/a memoria, fusionadas en una sola transacción en masa (coalesced) de memoria, ya sea de 32, 64, o 128 bytes [28]. C. Programación paralela del dispositivo GPU Es muy importante hacer énfasis en que, debido a los tiempos relativamente grandes de retardo (latencia) y al bajo ancho de banda en las trasferencias de memoria, entre la computadora anfitrión y el dispositivo GPU, es altamente recomendable dividir la aplicación, de tal manera que cada parte del sistema (hardware) haga únicamente el trabajo que mejor realiza. El uso del dispositivo GPU es recomendado únicamente cuando [28][29]: - La complejidad de las operaciones justifica el costo de mover datos, de y hacia el dispositivo GPU. El escenario ideal es aquel en el que muchos hilos ejecutan una cantidad considerable de trabajo. Entonces, ya que las transferencias deben ser minimizadas, los datos deberían mantenerse en el dispositivo GPU tanto como sea posible. - La aplicación tiene numerosos datos que pueden ser calculados simultáneamente en paralelo. Esto típicamente involucra operaciones aritméticas sobre un gran conjunto de datos, donde la misma operación puede ser realizada sobre miles de elementos al mismo tiempo. 64 - La aplicación puede ser dividida en operaciones simples, que pueden ser asignadas a numerosos hilos ejecutándose en paralelo. - El tamaño de los tipos numéricos, usados para variables y arreglos dentro del código del dispositivo GPU, son congruentes tanto con los patrones de memoria como con las instrucciones aritméticas más ágiles, a fin de alcanzar el mejor desempeño del dispositivo GPU (por ejemplo, el empleo de accesos de memoria en masa, así como el uso de tipos enteros, flotantes de precisión simple y funciones aritméticas intrínsecas compatibles). Con estas consideraciones en mente, lo primero que se tiene que hacer es determinar cuál es la parte del código secuencial que mejor se puede programar en forma paralela usando el dispositivo GPU, de acuerdo con las recomendaciones de arriba. Típicamente se elige como posibles candidatos a todos los segmentos de código que son especialmente demandantes de recursos computacionales (tanto tiempo de procesamiento como memoria). Finalmente, se procede a delegar al dispositivo GPU aquellos segmentos de código que cumplen con las recomendaciones prácticas antes mencionadas. Típicamente, una aplicación y código con CUDA debe incluir los siguientes pasos: 1.- El computador (CPU) anfitrión llama al cuerpo principal del programa (main()). 2.- Se reserva memoria dentro del dispositivo GPU. 3.- Se copian los datos del CPU anfitrión al dispositivo GPU. 4.- El CPU anfitrión llama a la función kernel. 5.- El dispositivo GPU ejecuta el código paralelamente. 6.- Se copian los resultados de vuelta a la memoria del CPU anfitrión. 7.- Se libera la memoria reservada dentro del dispositivo GPU. Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández La aplicación, así conformada, delega al dispositivo GPU la ejecución paralela de tantos hilos como lo determina el tamaño de la rejilla de bloques y el tamaño de cada bloque de hilos. Concretamente, cuando se arranca la ejecución del kernel se define tanto el número de hilos por bloque (blockDim) como el número de bloques que conforman a la rejilla (gridDim). La multiplicación de estos dos parámetros resulta en el total de hilos que serán administrados por el multiprocesador que el sistema designó para la ejecución del kernel. En todo esto, se asume que el multiprocesador puede ejecutar concurrentemente, cuando mucho, el número de hilos en un solo bloque. Sin embargo, el multiprocesador puede planificar la ejecución de un número total de hilos que rebase, por mucho, al tamaño de un solo bloque. Esto lo logra distribuyendo el trabajo de todos los bloques, durante los intervalos de tiempo disponibles, conforme se va presentando la oportunidad. IV. El algoritmo de optimización por cúmulo de partículas La idea principal del algoritmo de PSO consiste en el movimiento de partículas o individuos que “vuelan” en busca de un óptimo global en un espacio n-dimensional en forma cooperativa. En cada una de las iteraciones del algoritmo se actualiza la posición de las partículas mediante una regla simple donde el movimiento del individuo, aunque esencialmente aleatorio, está bajo la influencia de su propia experiencia (aprendizaje individual) y por el ambiente (influencia social) [30]. El algoritmo fue originalmente propuesto por Kennedy y Eberhart [4], en 1995, y trabajaba con la posición x y el cambio de la posición v (que fue llamado velocidad, por analogía) para cada partícula. Más tarde, el algoritmo fue mejorado por Shi y Eberhart [31], en 1998, introduciendo el concepto de la inercia w. Denotando pbx la solución con la mejor aptitud encontrada por la partícula, hasta el momento, y gbx la solución con la mejor aptitud global encontrada dentro de la población, hasta el momento. Entonces el algoritmo PSO puede ser descrito como sigue [32]: A. Algoritmo 1 1.-Inicializar cada partícula de la población en forma aleatoria, obteniendo los valores para los vectores n-dimensionales de posición x y velocidad v. 2.-Calcular la aptitud de la posición xi de cada partícula. Si la aptitud actual es mejor que pbx, entonces actualizar a pbx. 3.-Determinar la posición de la partícula con la aptitud más alta y actualizar, en su caso, agbx. 4.-Para cada dimensión d, de cada partícula i, actualizar la velocidad v según Ec. (1): donde C1 y C2 son constantes que ponderan, respectivamente, la influencia del aprendizaje de individuo y la influencia social. r1 y r2 son variables aleatorias, entre 0 y 1 que representan el libre albedrío en movimiento de cada partícula. w es la inercia del sistema calculada según Ec. (2): (2) donde Wmax, Wmin, itermax e iter son, respectivamente, el valor máximo para la inercia, el valor mínimo para la inercia, el número máximo de iteraciones y la iteración actual. (1) 5.-Actualizar la posición x de cada partícula según Ec. (3): (3) 6.-Repetir los pasos 2-5 hasta alcanzar la condición de terminación (ya sea número de iteraciones o precisión). V. Puesta en práctica de las variantes paralelas del algoritmo PSO en el Dispositivo GPU En lo general, el proceso de programación paralela de un algoritmo poblacional con un dispositivo GPU multi-hilos Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 65 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández comprende las etapas sugeridas por Ian Foster [33]: división, agrupamiento, comunicación y mapeo. En la división, los datos, que corresponden y representan a los individuos que conforman la población, se reparten entre los hilos de procesamiento. En el agrupamiento, se identifican los datos asociados a cada individuo. En el tercer paso, se comunican los individuos mediante el uso de la memoria compartida del dispositivo GPU. Finalmente, en el mapeo, las tareas ejecutadas por un individuo se asignan a un hilo. Al respecto de la clasificación de los modelos de programación paralela para el algoritmo PSO, se adoptó por la misma clasificación propuesta para los algoritmos evolutivos [8]: 1.-Variante paralela con enfoque global. Existe un procesador principal (maestro) y varios esclavos. En este modelo, el maestro distribuye a los esclavos el trabajo relativo a la evaluación de la función de aptitud. 2.-Variante paralela con el enfoque migratorio (también llamado enfoque de islas). En este modelo, la población es dividida en varias sub-poblaciones (demes) de tal manera que diferentes procesadores manejan el mismo algoritmo en cada sub-población. Finalmente, después de un cierto tiempo (llamado época), los procesadores pasan a una etapa de intercomunicación donde intercambian información y comparten las soluciones encontradas hasta el momento. 3.-Variante paralela con enfoque de difusión. Este puede ser visto como un caso extremo del modelo de islas, donde la población de cada isla es sólo un individuo y donde hay tantas islas como individuos existentes. Partiendo de dicha clasificación, se programaron algunas variantes paralelas para el algoritmo PSO que se detallan adelante. El objetivo principal fue programar variantes paralelas para el dispositivo GPU que emplearan código CUDA en vez de los antiguos métodos, complejos y laboriosos, que trabajan únicamente con operaciones paralelas en la memoria gráfica (texturas, etc.). Esto con el fin de evaluar la mejora en el desempeño que podría ser alcanzada por el dispositivo GPU, mediante una estrategia de programación paralela relativamente simple. Así, las variantes paralelas propuestas en este trabajo se diferencian de las que se presentan en [24] porque no se emplea el antiguo estilo de 66 programación paralela del dispositivo GPU, que se enfoca más bien en emplear operaciones paralelas sobre múltiples datos, lo que se conoce como enfoque SIMD (“una instrucción - múltiples datos”) [9]. En cambio, las aplicaciones paralelas propuestas aquí trabajan con el nuevo modelo de programación paralela CUDA, concebido para aprovechar la característica de administración de multi-hilos de los dispositivos GPU de NVIDIA, lo que permite manejar múltiples hilos concurrentes en forma muy eficiente. NVIDIA llama esta característica SIMT (“una instrucción - múltiples hilos”) [28] y se ofrece como una característica adicional a las tradicionales operaciones paralelas sobre la memoria. Este nuevo modelo de programación ofrecido con la herramienta CUDA permite a los programadores escribir códigos paralelos para el dispositivo GPU de forma más natural, con lo que el dispositivo GPU se convierte en una verdadera herramienta para la programación paralela de propósito general. De hecho, se prevé que este nuevo modelo de la programación paralela sea la referencia para la especificación futura de un modelo de programación universal que hará posible la programación paralela que programa, no sólo en los dispositivos GPU, sino en cualquier arquitectura de múltiples núcleos o plataforma de súper cómputo que aparezca en el futuro [9][26][ 28]. Así las cosas, las tres variantes paralelas para el algoritmo PSO que se reportan aquí son: dos variantes globales y una más que se denominó “incrustada” en vista de que ésta es una variante especial del modelo de difusión. Respecto del enfoque global, tenemos dos variantes que fueron programadas en el dispositivo GPU: 1.-Global_ev: Donde se programa en forma paralela únicamente al proceso de evaluación de la función objetivo (función de aptitud). 2.-Global_ev+up: Donde se programan en forma paralela todos los cálculos matemáticos, tanto para la función de aptitud, como para la velocidad, posición e inercia. A la tercera variante paralela, considerando que el modelo de difusión es un caso extremo del enfoque de isla, decidimos llamarla variante incrustada porque en este caso, excluyendo la inicialización, todo el algoritmo PSO corre en el dispositivo GPU, de tal manera que puede ser visto Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández como una caja negra, desde el punto de vista de procesador anfitrión. Más aún, mientras que en el modelo de difusión hay un procesador por partícula, en nuestra variante incrustada se emplea un hilo, y no un procesador, por partícula. Se programó como código de referencia al Algoritmo 1, el algoritmo secuencial de PSO, ejecutándose en un solo núcleo y un solo hilo del dispositivo GPU, a fin de evaluar en forma justa el desempeño de variantes paralelas. En todas las variantes paralelas se empleó la misma estrategia de programación, que consistió en la creación de un hilo por cada partícula PSO. La regla fue sustituir todos los lazos secuenciales (especialmente aquellos donde las iteraciones estaban en función del número de partículas) por una sola llamada al kernel multi-hilos. Con ello, el algoritmo PSO secuencial y sus variantes paralelas tienen esencialmente la misma estructura. No obstante, mientras que en los lazos del código secuencial, cada iteración es independiente la una de las otras, en el código paralelo, tales lazos pueden ser directamente transformados en kernels paralelos, donde las operaciones de cada iteración del lazo original se realizan por un hilo independiente [9]. En la Figura 3 se representa la estructura del algoritmo PSO secuencial que se programó para ser ejecutado por un solo núcleo de procesamiento dentro del dispositivo GPU. Podemos observar los siguientes bloques funcionales [30]: - Inicialización de la población. Aquí se inicializa cada partícula de la población en forma aleatoria. - Evaluación de función de aptitud. - Comparación. Se determina si un individuo tiene mejor aptitud que el mejor registrado. - Imitación (actualización). Cada individuo actualiza su posición, tanto por la influencia de su propia experiencia como por el ambiente social. Figura 3. Estructura de algoritmo PSO secuencial Fuente: Autores. Intencionalmente, a fin de ilustrar cómo se realiza la programación paralela en forma directa, el código secuencial ha sido organizado destacando los lazos que están en términos de número de partículas. La idea principal es crear un hilo por cada partícula PSO. Note que en la realización práctica de la variante secuencial del algoritmo PSO (Figura 3) todos los módulos funcionales son ejecutados, para todas las partículas, en un solo núcleo e hilo del dispositivo GPU. En la primera de las variantes paralelas, Global_ev, sólo se programa en forma paralela al módulo de evaluación de la función de aptitud (Figura 4). Note que el lazo correspondiente fue sustituido por una llamada a un kernel que distribuye el trabajo en múltiples hilos dentro del dispositivo GPU. En la segunda variante paralela, Global_ev+up, se distribuye al dispositivo GPU todo cálculo aritmético, sustituyendo al módulo de evaluación de la función de aptitud y al módulo de actualización de posición por las llamadas a los kernel asociados (Figura 5). Finalmente, en la tercera variante paralela, la denominada incrustada, únicamente el módulo de inicialización se ejecuta en el procesador anfitrión (Figura 6), ya que hay llamadas a los kernel asociados con los módulos de evaluación, comparación y de imitación, todo ello realizado dentro del dispositivo GPU hasta que se alcanza la condición de terminación. Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 67 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández Figura 4. Estructura de la variante de Global_ev para el algoritmo PSO paralelo En todo esto, deben tomarse en cuenta algunas consideraciones prácticas para lograr una realización funcional del algoritmo PSO paralelo en un dispositivo GPU: A. Sobrecarga (overhead) Fuente: Autores. Figura 5. Estructura de la variante Global_ev+up para el algoritmo PSO paralelo El dispositivoGPU presenta cierta sobrecarga de comunicación debido a las transferencias de memoria entre el CPU anfitrión y el dispositivo GPU. Como estas transferencias son relativamente lentas, cualquier código paralelo para un dispositivoGPU debe minimizar su empleo. Considerando la sobrecarga de comunicación, es de esperarse que las variantes globales (Global_ev y Global_ev+up) resulten más lentas que la incrustada, debido a los intercambios de información entre el CPU anfitrión y el dispositivo GPU durante la ejecución del algoritmo. El intercambio de información es necesario, sobretodo en lo relativo a las variantes globales, ya que el procesador anfitrión debe conocer la información generada, tanto en el módulo de actualización como en el de evaluación, antes de tomar cualquier decisión. B. Sincronización Fuente: Autores. Figura 6. Estructura de la variante incrustada para el algoritmo PSO paralelo Antes de cualquier alternativa de toma de decisión, por ejemplo durante el proceso de comparación, todos los hilos que se ejecutan deben estar sincronizados en los puntos donde se requiere disponer la información sin ambigüedad. Este punto es de particular importancia cuando los hilos tienen que comunicarse entre sí para compartir la información, como lo es en nuestro caso. C. Competencia Se debe tener cuidado al trabajar con variables globales que pueden ser revisadas simultáneamente por varios hilos. Se necesitan medidas precautorias apropiadas para enfrentar exitosamente este problema. Específicamente, en el algoritmo PSO esta situación puede presentarse con la variable que aloja el índice al mejor global. En estos casos, es una buena práctica emplear una estrategia de comunicación del tipo maestro-esclavo, adicional a la sincronización de los hilos, a fin de garantizar que sólo uno de los hilos actualiza las variables globales con base en la información de todos los demás. Fuente: Autores. 68 Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández D. Generación de números aleatorios. Este es un tema fundamental para la correcta operación del algoritmo PSO y se hace especialmente crítico cuando la generación de los números aleatorios es realizada dentro del dispositivo GPU. Es necesario garantizar que cualquier llamada a la función rand(), o equivalente que se ejecuta dentro del dispositivo GPU, generará números aleatorios de buena calidad (números diferentes para cada llamada y para cada hilo). Si dicha condición no se garantiza, ello podría provocar que el algoritmo no converja debido, fundamentalmente, a una diversidad pobre. Es justamente, por lo antes expuesto, que en la realización de la variante incrustada el módulo de inicialización permanece fuera del dispositivo GPU. Específicamente, las semillas para los números aleatorios son inicializadas por el anfitrión a razón de una por cada hilo creado. 1) F01 - Función de Rosenbrock generalizada. (Ec. (4)) con dimensiones n= 30, 60, 120. 2) F02 - Función de Rastrigin Generalizada.(Ec. (5)) VI. Experimentos y resultados A. Procedimiento experimental Los experimentos fueron realizados en una computadora personal con procesador Duo Core de Intel con sistema operativo Linux, que en este trabajo llamamos el CPU anfitrión. El dispositivo GPU es una tarjeta gráfica NVIDIA GeForce 8600GT, con 256 Mbytes de la memoria de trabajo y 4 multiprocesadores, cada uno con 8 núcleos, para hacer un total de 32 núcleos de procesamiento. El objetivo esencial es evaluar el desempeño de las variantes paralelas propuestas para PSO en comparación con la variante secuencial. El desempeño se midió en función de la complejidad de la función de aptitud, el número de partículas y el número de iteraciones [25], pero aquí únicamente se reportan los resultados más representativos, en particular los que están en términos del número de partículas. Los algoritmos fueron probados para solucionar algunas conocidas funciones de referencia (bench mark) de optimización global y numérica [34]. Las siguientes funciones fueron seleccionadas porque todas ellas son multi-modales y presentan una complejidad significativa en lo relativo a la evaluación de la aptitud [27]: (4) (5) con dimensiones n= 30, 60, 120. 3) F03 - Función de Griewank Generalizada. (Ec. (6)) (6) con dimensiones n= 30, 60, 120. Los siguientes experimentos fueron realizados para medir el desempeño de cada una de las variantes PSO programadas: experimento A, Mediciones del tiempo relativo de procesamiento consumido por cada uno de los módulos funcionales (es decir, el de evaluación, comparación y actualización) dentro del algoritmo PSO secuencial; y experimento B, medición, para cada una de las variantes paralelas de PSO, del desempeño en función de número de partículas. Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 69 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández El objetivo de experimento A es medir, como una referencia, el tiempo de procesamiento consumido por cada uno de los módulos funcionales dentro del algoritmo PSO secuencial. En este experimento los parámetros del algoritmo PSO fueron fijados a 30 dimensiones, 20 vecinos, y 2000 iteraciones, mientras que se varió el número de partículas. La variante PSO secuencial fue ejecutada múltiples veces para cada una de las 3 funciones de referencia probadas, obteniendo el tiempo promedio consumido, en segundos, para cada uno de los módulos funcionales, así como la proporción, en porcentaje, del tiempo total consumido. Los resultados de este experimento permitieron determinar, en forma empírica, cuáles eran los módulos del algoritmo PSO que más convenía programar en forma paralela. El experimento B se realizó para probar la dependencia del desempeño de las variantes PSO en términos de uno de sus parámetros fundamentales: el número de partículas. Después de observar que la optimización de la función de referencia F03 era la que más tiempo de procesamiento tomaba a la variante secuencial de PSO, se eligió a ésta para reportar sus resultados a fin de ilustrar el comportamiento general observado durante la optimización de las tres funciones de referencia probadas. B. Métricas de desempeño para el procesamiento paralelo A fin de evaluar y graficar el desempeño de todas las variantes paralelas de PSO, se definieron las siguientes métricas: - El aceleramiento, que mide la reducción alcanzada en el tiempo de ejecución, y - la eficiencia, que mide el aprovechamiento de los núcleos de procesamiento disponibles. Primero, definimos el costo computacional, C, como el tiempo de procesamiento (en segundos) que consume un algoritmo. Entonces, el rendimiento computacional, V, se define como el inverso del costo computacional, según se observa en Ec. (7): 70 El aceleramiento, S, es entonces un índice que mide qué tan rápida es la variante de interés en comparación con la variante de referencia, ver Ec. (8): (8) donde es el rendimiento de la variante paralela de interés y es el rendimiento de la variante de referencia, en nuestro caso, la variante secuencial. Finalmente, definimos la eficiencia paralela E como la razón que resulta de dividir el aceleramiento entre el número de núcleos de procesamiento, según se muestra en Ec. (9): (9) donde n es el número de núcleos de procesamiento en el dispositivo GPU (en nuestro caso, 32 núcleos). VII. Discusión de resultados A. Experimento A Se obtuvieron las mediciones del tiempo relativo de procesamiento consumido por cada uno de los módulos funcionales (es decir, evaluación, comparación y actualización) dentro de la variante secuencial de PSO. Los resultados experimentales mostraron que, después de optimizar la tres funciones n-dimensionales de referencia (F01, F02 y F03), la evaluación de función de aptitud consumió una proporción relativamente baja del tiempo de procesamiento total, en comparación con los cálculos empleados durante la actualización de la velocidad y de la posición (Tabla 1). Esto se debe a que las operaciones de actualización, aunque con menor complejidad aritmética, son calculadas más veces que la evaluación de función de aptitud. Además, el proceso que genera los números aleatorios puede consumir una cantidad significativa del tiempo de procesamiento cuando el mismo procesador que ejecuta el algoritmo PSO es también quien genera los números aleatorios. (7) Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández Tabla 1. Distribución del costo computacional en función del número de partículas Función F01 F02 F03 Costo de evaluación 2.84 % 27.54 % 39.86 % Proporción del tiempo de ejecución total con 30 dimensiones, 2000 iteraciones Partículas 64 256 Costo de comparación Costo de Costo de comparación Costo de y actualización evaluación y actualización evaluación 96.59 % 3.03 % 97.25 % 2.03 % 70.34 % 26.93 % 69.38 % 27.16 % 55.24 % 41.31 % 55.81 % 14.88 % Fuente: Autores. 1024 Costo de comparación y actualización 97.28 % 69.43 % 35.93 % Así, los resultados experimentales permiten afirmar que, para los tres problemas de optimización n-dimensionales, representados por F01, F02 y F03, la mayor parte del tiempo de procesamiento del algoritmo PSO es consumido por las tareas de actualización (posición y velocidad) y no por la tarea de evaluación de la función de aptitud. Resumiendo, los resultados experimentales permiten afirmar que el desempeño de las variantes paralelas Global_ev y Global_ev+up es menor que el de la incrustada, lo que se debe, fundamentalmente, a la sobrecarga de comunicación que resulta de los intercambios de información entre el computador anfitrión y el dispositivo GPU. B. Experimento B Figura 7. Tiempo de procesamiento consumido por las variantes de PSO, durante la optimización de F03, como función del número de partículas Se obtuvieron las mediciones de la dependencia del desempeño, para cada una de las variantes paralelas de PSO, en términos de número de partículas. En la Figura 7 Se observa que el desempeño de la variante incrustada es prácticamente invariante al incremento en el número de partículas. En general, los resultados experimentales muestran que el desempeño mejora cuando el número de operaciones matemáticas distribuidas al dispositivo GPU también aumenta. En lo relativo al error (la diferencia entre la solución encontrada y el óptimo), observamos, en todas las variantes, que al aumentar las iteraciones es posible obtener una solución muy cercana al óptimo global. Por ejemplo, al fijar 10,000 iteraciones como un punto de partida, se observó que la variante secuencial tenía un error pequeño y muy uniforme [25]. Es notable cómo la variante incrustada comienza con un error ligeramente mayor que las otras variantes, pero cuando aumenta el número de iteraciones, la solución obtenida logra la misma precisión para 30,000 y 60,000 iteraciones que, por otra parte, se ejecuta en tan sólo una fracción del tiempo consumido por la variante secuencial, a pesar de realizar el mismo número de iteraciones. De hecho, con 60,000 iteraciones la variante incrustada tiene un error inferior que el secuencial, con las mismas iteraciones, en una relación de 5 a 1 [25]. Fuente: Autores. C. Discusión sobre las métricas de desempeño En general, el comportamiento observado es consistente para todas las funciones de referencia probadas. Los resultados experimentales permiten afirmar que el desempeño de las variantes paralelas mejora notablemente conforme más cálculos son distribuidos al dispositivo GPU. Las métricas de desempeño para todas las variantes paralelas de PSO se presentan en las Figuras 8 y 9. Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 71 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández Figura 8. Aceleramiento para las variantes paralelas de PSO como función del número de partículas En general, podemos apreciar un mejor desempeño de las variantes paralelas con relación a la variante secuencial. Por ejemplo, la optimización de la función de Griewank generalizada (F03, con elevado costo computacional, para 60 dimensiones, 60,000 iteraciones y 256 partículas) le toma 214.13 segundos a la variante secuencial, 136.3 segundos a la variante de Global_ev, y 39.89 segundos a la variante Global_ev+up. Pero la variante incrustada, la mejor variante, fue ejecutada en tan solo 7.66 segundos, lo que representa un aceleramiento de 27.97, comparado con la variante secuencial, y una eficacia de prácticamente 1 (recuerde que en nuestro caso el dispositivo GPU se compone de 32 núcleos). Fuente: Autores. VII. Conclusión y trabajo futuro Figura 9. Eficiencia para las variantes paralelas de PSO como función de número de partículas Fuente: Autores. Comparando las Figuras 8 y 9, podemos notar que al aumentar el número de partículas, la eficiencia para las variantes Global_ev y Global_ev+up se mantiene prácticamente constante, pero se incrementa el aceleramiento. Esto se debe a que la sobrecarga de comunicación aumenta proporcionalmente al número de partículas en el caso de estas variantes (Global_ev y Global_ev+up). En contraste, la variante incrustada aumenta su eficiencia al aumentar el número de las partículas. 72 En este trabajo se presentaron los resultados y recomendaciones prácticas que emanan de un estudio reciente relativo al desempeño de tres variantes paralelas del algoritmo de optimización por cúmulo de partículas (PSO) en un dispositivo GPU multi-hilos, usando a CUDA como el más reciente modelo de programación paralela. Los resultados experimentales muestran que con estas herramientas computacionales es posible obtener códigos paralelos, para un algoritmo poblacional dado, con una mejora significativa en el desempeño y mediante una programación paralela simple y directa. En general, se demuestra que un código paralelo que únicamente aprovecha la característica multi-hilos del dispositivo GPU (es decir, exclusivamente la distribución del trabajo en hilos, sin usar operaciones paralelas en datos múltiples), por lo menos, produce un aceleramiento proporcional al número de núcleos del dispositivo GPU, comparado con el algoritmo secuencial corriendo en un sólo hilo de un único núcleo, con lo que se obtiene el poder de cómputo de un cluster en una computadora personal convencional. También se demuestra que el desempeño total del dispositivo GPU mejora cuando aumenta la cantidad de tareas simples distribuidas en los hilos del dispositivo GPU. Este comportamiento se observa en el desempeño de las tres variantes paralelas propuestas, pero es más evidente en la variante incrustada, donde el desempeño alcanzado es considerablemente mejor. Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández Finalmente, se prevé que el desarrollo de los dispositivos GPU y su nuevo modelo de programación paralela, en un futuro cercano, haga realidad el sueño de disponer de súper-cómputo científico en computadoras personales convencionales. En futuras investigaciones se prevé emplear la totalidad de las capacidades del dispositivo GPU, es decir, emplear operaciones paralelas sobre múltiples datos además de la capacidad de administrar múltiples hilos, para aumentar aún más el desempeño de los algoritmos paralelos propuestos. VIII. Referencias [1] A. E. Eiben and J.E. Smith, Introduction to Evolutionary Computing, Natural Computing Series Springer, 2003. [2] M. Dorigo and T. Stützle, The Ant Colony Optimization Metaheuristic: Algorithms, Applications, and Advances, Handbook of Metaheuristics, Kluwer Academic Publishers, 2002, pp. 251-285. [3] M. Dorigo and K. Socha, “Ant Colony Optimization”, in Handbook of Approximation Algorithms and Metaheuristics, T.F. Gonzalez, Ed., Chapman & Hall, 2007, pp. 26.1-26.14. [4] J. Kennedy and R. Eberhart, “Particle Swarm Optimization”, in Proceedings of IEEE Conference on Neural Networks, 1995, pp. 1942-1948. [5] E. Tsang and P. Isasi, “Editorial Special Issue: Computational Finance and Economics”, IEEE Transactions on Evolutionary Computation, Vol. 13, No. 1, pp. 1-2. 2009. [6] J. Owens et al., “A Survey of General-purpose Computation on Graphics Hardware”, Computer Graphics Forum, Vol. 26 No. 1, pp. 80-113. 2007. [7] E. Cantú-Paz, Efficient and Accurate Parallel Genetic Algorithms, Kluwer, 2000. [8] M. Belal and P. El-Ghazawi, “Parallel Models for Particle Swarm Optimizers”, International Journal of Intelligent Computing and Information Sciences, IJICIS, Vol. 4 No. 1, pp. 100-111, January, 2004. [9] J. Nickolls et al., “Scalable Parallel Programming with CUDA”, ACM Queue, pp. 40-53, March/April, 2008.[En Línea] Disponible en http://mags.acm.org/ queue/20080304/?u1=texterity. [10] J.F. Schutte et al., “Parallel Global Optimization with the Particle Swarm Algorithm”, International Journal for Numerical Methods in Engineering, Vol. 61 No. 13, pp. 1-24, 2003. [11] N. Jin and Y. Rahmat-Samii, “Parallel Particle Swarm Optimization and Finite-difference Time-domain (PSO/FDTD) Algorithm for Multiband and Wideband Patch Antenna Designs”, IEEE Transactions on Antennas and Propagation, Vol. 53 No. 11, pp. 34593468, November, 2005. [12] S. Cui and D. Weile, “Application of a Parallel Particle Swarm Optimization Scheme to the Design of Electromagnetic Absorbers”, IEEE Transactions on Antennas and Propagation, Vol. 53 No. 11, pp. 36163624, November 2005. [13] H. Ma et al., “Research on Parallel Particle Swarm Optimization Algorithm Based on Cultural Evolution for the Multi-level Capacitated Lot-sizing Problem”, in Proceedings IEEE Control and Decision Conference, July 2008, pp. 965-970. [14] S. Baskar and P.Suganthan, “A Novel Concurrent Particle Swarm Optimization”, in Proceedings IEEE Congress on Evolutionary Computation, 2004, pp. 792-796. [15] J. Chang et al., “A Parallel Particle Swarm Optimization Algorithm with Communication Strategies”, Journal of Information Science and Engineering, Vol. 21 No. 4, pp. 809-818, 2005. [16] L. Bo et al., “Parallelizing Particle Swarm Optimization”, IEEE Pacific Rim Conference on Communica- Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74 73 Sobre la programación paralela de un algoritmo de optimización por cúmulo de partículas en un dispositivo GPU multi-hilos G. A. Laguna-Sánchez, M. Olguín-Carbajal, N. Cruz-Cortés, R. Barrón-Fernández tions, in Computers and Signal Processing, PACRIM, Aug.2005, pp. 288-291. [17] S. Mostaghim et al., “Multi-objective Particle Swarm Optimization on Computer Grids”, in Proceedings of the 9th Annual Conference on Genetic and Evolutionary Computation, July 2007, pp. 869-875. [18] K. Parsopoulos et al., “Multiobjective Optimization Using Parallel Vector Evaluated Particle Swarm Optimization”, in Proceedings of the IASTED International Conference on Artificial Intelligence and Applications (AIA), July 2007, pp. 869 - 875. [19] I. Schoeman and A. Engelbrecht, “A Parallel Vectorbased Particle Swarm Optimizer, Adaptive and Natural Computing Algorithms”, in Proceedings of the International Conference in Coimbra. 2005, pp. 268-271. [20] S. Harding and W Banzhaf, “Fast Genetic Programming on GPUs”, in Proceedings of the 10th European Conference on Genetic Programming, ser. Lecture Notes in Computer Science, M. Ebner et al., Eds., Vol. 4445, April 2007, pp. 90-101. [21] S. Harding and W. Banzhaf, “Fast Genetic Programming and Artificial Developmental Systems on GPUs”, in Proceedings of the 21st International Symposium on High Performance Computing Systems and Applications, May 2007, p. 2. [22] W. B. Langdon and W. Banzhaf, “A SIMD Interpreter for Genetic Programming on GPU Graphics Cards”, in EuroGP, ser. LNCS, Vol. 4971, March 2008, pp. 73-85. [23] D. Robilliard et al., “Population Parallel GP on the G80 GPU”, in Lecture Notes in Computer Science, Vol. 4971, 2008, pp. 98-109. [24] J. Li et al., An Efficient Fine-grained Parallel Particle Swarm Optimization Method Based on GPU-acceleration, International Journal of Innovative Computing, Information and Control, Vol. 3 No. 6(B), p. 1707, Dec 2007. 74 [25] G. Laguna, M. Olguín, N. Cruz, R. Barrónand J. Álvarez, “Comparative Study of Parallel Variants for a Particle Swarm Optimization Algorithm Implemented on a Multithreading GPU”. Journal of Applied Research and Technology (JART). ISSN: 1665-6423. Vol.7 No.3, pp. 292-309, 2009. [26] T. Halfhill, “Parallel Processing with CUDA”, Microprocessor Report, www.MPRonline.com, 2008. [En Línea] Disponible en http://www.nvidia.com/docs/ IO/55972/220401_Reprint.pdf. [27] A. Mzoughi, O. Lafontaine, and D. Litaize, “Performance of the Vectorial Processor VECSM2* Using Serial Multiport Memory”, in Proceedings of the 10th International Conference on Supercomputing, 1996, pp. 390-397, Toulouse Cedex, France. [28] NVIDIA CUDA C Programming Guide, Version 3.2, NVIDIA Corporation, California, USA, 2010. [29] CUDA C best practices guide, version 3.2. NVIDIA Corporation, California, USA, 2010. [3e0]J. Kennedy and R. Eberhart, Swarm Intelligence, Morgan Kaufmann Academic Press, 2001. [31] Y. Shi and R. Eberhart, “A Modified Particle Swarm Optimizer”, in IEEE International Conference on Evolutionary Computation Proceedings, May, 1998, pp. 69-73. [32] M. O’Neill, and A. Brabazon, “Self-Organising Swarm (SOSwarm)”, Soft Comput, Vol.12, pp. 1073-1080, Jan. 2008. [33] Foster Ian, Designing and Building Parallel Programs: Concepts and Tools for Parallel Software Engineering, Addison Wesley, 1995. [34] E. Mezura-Montes, J. Velázquez-Reyes and C. A. Coello-Coello, “A Comparative Study of Differential Evolution Variants for Global Optimization”, GECCO, July 2006, pp. 485-492. Intekhnia | Vol. 6 | No. 2 | Julio - diciembre de 2011 | ISSN: 1900-7612 | pp. 59 - 74