• No se han encontrado resultados

Desarrollo de un solver paralelo para algoritmos de búsqueda exhaustiva aplicado a la resolución del puzzle Eternity II

N/A
N/A
Protected

Academic year: 2020

Share "Desarrollo de un solver paralelo para algoritmos de búsqueda exhaustiva aplicado a la resolución del puzzle Eternity II"

Copied!
73
0
0

Texto completo

(1)

Facultad de Ciencias Exactas, Universidad Nacional del Centro de la Provincia de Buenos Aires

Desarrollo de un solver paralelo

para algoritmos de búsqueda

exhaustiva aplicado a la resolución

del puzzle Eternity II

Trabajo final de Tesis de grado de Ingeniería de sistemas

Alumnos

:

Emiliano Castellanos, Juan Cruz Aguirre

Directores​:

Dr. Pablo Rafael Rinaldi - Dr. Juan Pablo D’Amato

(2)
(3)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

AGRADECIMIENTOS

A los directores Juan y Pablo por su dirección y tiempo prestado, al Programa Barriadas de la Universidad por darme la oportunidad de ser parte de ellos, a Eugenia por ayudarme a organizarme en nuestros proyectos laborales, a Software del Centro por la flexibilidad en mis horarios de trabajo que me permitían seguir con la carrera, a Liliana por darme un hogar durante estos años en Tandil, a mi abuela por ser la primera con quien compartía la alegría de aprobar un final, a mis amigos y familiares que estuvieron en los altibajos de este camino y a mis abuelos por el abrazo que me gustaría poder darles en este momento.

Juan Cruz

 

 

(4)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

RESUMEN

Este trabajo se basa en la búsqueda de una solución a un problema de alta complejidad (tipo NP) utilizando herramientas de programación en paralelo.

A su vez, hoy en día, en la mayoría de los ámbitos científicos deben resolverse problemas computacionales muy complejos y con altos requerimientos en tiempo y recursos. Para resolver este tipo de problemas, el paralelismo se ha convertido en una de las herramientas computacionales de mayor relevancia. Para esto, no sólo es necesario contar con hardware que permita realizar cómputo paralelo, sino también con lenguajes de programación para el desarrollo de aplicaciones con paralelismo.

(5)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

ÍNDICE DE CONTENIDO

AGRADECIMIENTOS 2

RESUMEN 3

ÍNDICE DE CONTENIDO 4

ÍNDICE DE FIGURAS 6

ÍNDICE DE TABLAS 8

INTRODUCCIÓN 9

Rompecabezas Eternity II 11

OBJETIVO 13

Organización del trabajo 14

ESTADO DEL ARTE 15

Backtracking 16

El espacio de búsqueda 16

La técnica de backtracking 17

Nociones de Programación paralela 19

Arquitecturas de hardware multinúcleo 21

Paralelización de un algoritmo tipo backtracking 22

Esquema maestro esclavo 24

Asignación estática de tareas 25

Asignación dinámica de tareas 27

Estudio de la parametrización de los algoritmos 29

Parte secuencial 29

Cantidad de hilos paralelos 30

Según el tipo de asignación 31

Estática 31

Dinámica 31

Métricas de performance 31

Tiempo de ejecución 31

Speedup 32

Eficiencia 33

Desbalance de carga 33

Escalabilidad 33

DISEÑO Y MODELADO DEL ALGORITMO Y ESTRUCTURAS 36

(6)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Piezas del puzzle 36

Generador de tableros modelo 37

Restricciones 37

Método de alocación 38

Selección de colores nuevos 41

Color prioritario 41

Balanceado con color aleatorio 42

Balanceado con color pivot 43

Características del árbol de resolución 44

IMPLEMENTACIÓN DE LA SOLUCIÓN 46

Backtracking Lineal 46

Master - Slave 47

Generador de tareas 48

Manager sin divisiones dinámicas 50

Manager con divisiones dinámicas 52

Manager con lista de espera 55

RESULTADOS 59

Nivel de corte del generador de tareas 59

Cantidad de Hilos Óptima 62

Influencia de la cantidad de colores y el tamaño de un tablero sobre el tiempo de

resolución 64

Tiempos de resolución y speedup por solución implementada 65

CONCLUSIONES Y TRABAJO FUTURO 68

(7)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

ÍNDICE DE FIGURAS

Figura 1.1: Representación de una instancia de solución del Puzzle Eternity II 12

Figura 2.1: Espacio de nodos generado por un recorrido de árbol (fuerza bruta) 16

Figura 2.2: Árbol desbalanceado con dos hojas que representan soluciones 17

Figura 2.3: Representación gráfica de la ley de Amdahl 20

Figura 2.4: Arquitectura básica GPU 22

Figura 2.5: Distribución de subárboles en distintos procesadores 23

Figura 2.6: Representación esquema maestro esclavo con comunicaciones 24

Figura 2.7: Asignación estática de trabajos a los hilos de ejecución y procesador Master

26

Figura 2.8: Asignación dinámica de tareas entre cuatro procesadores esclavos disponibles y procesador Master

27

Figura 2.9: Asignación dinámica de tareas entre dos procesadores esclavos disponibles

28

Figura 2.10: Árboles de búsqueda de un mismo problema generando el backtracking inicial a diferentes alturas.

30

Figura 2.11: Variación de la eficiencia del sistema al dejar fijo el tamaño del problema y aumentar la cantidad de procesadores

34

Figura 2.12: Variación de la eficiencia del sistema al aumentar el tamaño del problema y dejar fijo la cantidad de procesadores

35

Figura 3.1: Representación de una ficha con lados instanciados. 37

Figura 3.2: Tableros solución, resultado de poner en el primer lugar las distintas fichas que encajan en los extremos

38

Figura 3.3: Tablero vacío con orden de generación e índices de filas y columnas 39

Figura 3.4: Tablero con la primera ficha colocada respetando las restricciones 40

Figura 3.5: Tablero con la segunda ficha colocada respetando las restricciones 40

Figura 3.6: Primera ficha generada con el generador de modelos desbalanceado 41

(8)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Figura 3.8: Cantidad de trabajos posibles según los distintos niveles del árbol de exploración para un tablero de tamaño N = 7

45

Figura 3.9: Cantidad de trabajos posibles según los distintos niveles del árbol de exploración para un tablero de tamaño N = 8

45

Figura 4.1: Esquema pseudo-código del método de backtracking 46

Figura 4.2: Demostración de un recorrido en profundidad en un árbol de exploración

47

Figura 4.3: Árbol de búsqueda con nivel de corte igual tareas 49

Figura 4.4: Diagrama de flujo del Manager sin divisiones 51

Figura 4.5: Diagrama de flujo del Manager con generación de subtareas a partir de las tareas en estado de exploración

53

Figura 4.6: diagrama de secuencia del Manager con lista de espera 56

Figura 4.7: Cambio en el recorrido realizado por una tarea al encontrar el flag habilitado

57

Figura 5.1: Variación del tiempo total de resolución según el nivel del back Inicial. Tablero N = 8, C = 8

(9)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

ÍNDICE DE TABLAS

Tabla 3.1: Distribución de colores para una instancia de tablero de tamaño N = 4 42 Tabla 3.2: Distribución de colores para distintas instancias del mismo algoritmo 43 Tabla 3.3: Ejemplo de distribución de colores para distintas representaciones 44 Tabla 5.1: Variación de tiempos y cantidad de tareas por nivel corte del

backtracking inicial (MacBook Air , Intel Core i5, 1,3 GHz)

59

Tabla 5.2: Variación de cantidad de tareas por nivel de corte del generador de tareas. Tablero N=8, C=8

61

Tabla 5.3: Variación de tiempo de resolución según cantidad de hilos usados (MacBook Air , Intel Core i5, 1,3 GHz)

62

Tabla 5.4: Variación de tiempo de resolución según cantidad de hilos usados (Intel Core i7, 2,6 GHz , 8 núcleos)

62

Tabla 5.5: Variación de tiempo de resolución según cantidad de hilos usados (Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz, 48 núcleos)

63

Tabla 5.6: Variación de tiempo de resolución según cantidad de colores usados (Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz, 48 núcleos)

64

Tabla 5.7: Resolución de un tablero N=8, C=8. Cantidad de hilos usados = 12. (MacBook Air, Intel Core i5, 1,3 GHz)

65

Tabla 5.8: Resolución de un tablero N=8, C=8. Cantidad de hilos usados = 12 (Intel Core i5, 2.50GHz, 4 núcleos)

65

Tabla 5.9: Resolución de un tablero N=8, C=8. Cantidad de hilos usados = 24 (Intel Core i7, 2,6 GHz , 8 núcleos)

66

Tabla 5.10: Resolución de un tablero N=8, C=8. Cantidad de hilos usados = 150. (Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz, 48 núcleos)

(10)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

INTRODUCCIÓN

En la Ciencia de la Computación existe una continua demanda de mayor poder de procesamiento por parte de los sistemas informáticos. Existen numerosas áreas en las que se requiere realizar grandes cantidades de cálculos, o trabajar con un importante volumen de datos, y en todos los casos realizarlo en un período de tiempo razonable de acuerdo al problema a resolver [1].

Desde el surgimiento de las computadoras seriales, su velocidad se ha incrementado para cumplir con las necesidades de las aplicaciones del mundo real. Sin embargo, la limitación física fundamental impuesta por la velocidad de la luz hace imposible obtener mejoras indefinidamente, y una manera natural de evitar esta saturación e incrementar el poder de cómputo es utilizar múltiples procesadores (en una o más máquinas) trabajando de manera conjunta para resolver el problema. En este sentido, el paralelismo es un concepto intuitivo porque el mundo real es esencialmente paralelo [2].

Las causas anteriormente mencionadas han llevado a aumentar la importancia del procesamiento paralelo y distribuido dentro de la Ciencia de la Computación e incrementar el interés en su investigación y desarrollo, convirtiéndose en una de las áreas que más profundamente han transformado a la disciplina [3].

Los objetivos principales del paralelismo están relacionados con la posibilidad de ajustar el modelo de arquitectura y software al mundo real, y con reducir el tiempo necesario para resolver problemas mediante la utilización de múltiples procesadores, además de mejorar la eficiencia de los mismos.

Existen diferentes razones que justifican la importancia que ha adquirido el procesamiento paralelo y distribuido. Entre ellas pueden mencionarse [4] :

● El crecimiento de la potencia de cómputo, dado por la evolución de la tecnología de los componentes y las arquitecturas de procesamiento.

● La existencia de problemas computacionales en los cuales el tiempo de resolución utilizando una máquina secuencial es inaceptable.

● La transformación y creación de algoritmos que explotan la concurrencia implícita del problema a resolver, de modo de distribuir el procesamiento minimizando el tiempo de respuesta. Naturalmente esta transformación también debe adaptarse a la arquitectura física de soporte.

● La capacidad del cómputo distribuido/paralelo de reducir el tiempo de procesamiento en problemas de cálculo intensivo (simulaciones, búsquedas, cómputo científico) o de grandes volúmenes de información (bases de datos, imágenes, entre otros).

● La existencia de sistemas en los que no es tan importante la velocidad de cómputo sino con tiempos de respuesta críticos.

(11)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Esta evolución conduce a un gran esfuerzo por transformar el procesamiento secuencial en paralelo. Naturalmente, la creación de algoritmos paralelos/distribuidos, o la transformación de un algoritmo secuencial en paralelo, se encuentran lejos de ser un proceso directo y está influida por la arquitectura física de soporte. Un sistema paralelo es la combinación de un algoritmo paralelo y la máquina sobre la cual éste se ejecuta [5]

La performance obtenida en el sistema paralelo está dada por una compleja relación en la que intervienen factores como el tamaño del problema, la arquitectura de soporte, la distribución de procesos en procesadores, la existencia o no de un algoritmo de balanceo de carga, entre otros. Existe un gran número de métricas para evaluar sistemas paralelos (tiempo efectivo, speedup, eficiencia), y las mismas deben ser adaptadas de acuerdo a la evolución de las arquitecturas paralelas.

Este proyecto está destinado a los usuarios potenciales de paralelismo, como ingenieros y cientı ́ficos que se deben enfrentar a problemas con un coste computacional elevado. Una correcta solución paralela a un problema hasta ahora resuelto de manera secuencial, puede suponer una reducción significativa en el tiempo empleado para resolverlo.

Sin embargo, estos nuevos procedimientos paralelos traen consigo nuevos parámetros de ajuste que hasta ahora no existı́an como tales: número de procesadores a utilizar en la ejecución, número de hilos, tamaños de los bloques de comunicación, y otros tipos de parámetros especı́ficos de los algoritmos que se utilicen para resolver el problema.

Un profesional, acostumbrado a este tipo de soluciones, conoce esta problemática. No obstante, incluso un usuario experto serı́a incapaz, a primera vista, de dar con los parámetros de ejecución óptimos o simplemente adecuados para ejecutar cada una de las rutinas en máquinas totalmente distintas. La elección de estos parámetros es un proceso decisivo en el tiempo de ejecución total de nuestras rutinas. Deberemos seleccionarlos correctamente para hacer que el tiempo de ejecución sea mı ́nimo, pues dependiendo de su valor este podrá aumentar y disminuir de manera considerable.

En el mundo como lo conocemos hoy en día, la gente esta mas y mas demandante lo cual aumenta la importancia de métodos optimizados en software, juegos, etcétera.

(12)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Rompecabezas Eternity II

El objetivo de esta sección es presentar un nuevo conjunto de problemas conocidos como rompecabezas (puzzles) de coincidencias de lados, un problema que se ha demostrado pertenece a la familia de NP-completo, modelandolos como problemas de satisfacción de restricciones (CSP), por sus siglas en inglés.

Los “Problemas de satisfacción de restricciones” (CSP), son problemas matemáticos definidos como un conjunto de objetos tal que su estado debe satisfacer un número de restricciones o limitaciones. Los CSP representa las entidades de un problema como una colección homogénea finita de restricciones sobre variables, las que son resueltas por métodos de satisfacción de restricciones. Los CSP son el tema de una intensa investigación en Inteligencia Artificial e Investigación de operaciones, dado que la generalidad en su formulación provee un principio básico para analizar y resolver problemas de distintos tipos. Los CSP a menudo muestran gran complejidad, requiriendo una combinación de métodos heurísticos y búsqueda combinatoria para ser resueltos en un tiempo razonable.

El juego Eternity II viene luego del Eternity I el cual tuvo miles de fanáticos alrededor del mundo, desde que hace 18 años un estudiante ganó un millón de dólares por resolver el rompecabezas en solo 5 meses.

El Eternity II, creado por Christopher Monckton, es un rompecabezas de coincidencia de bordes que tiene como objetivo ubicar 256 fichas cuadradas en una grilla de 16 x 16.

(13)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Figura 1.1: Representación de una instancia de solución del Puzzle Eternity II

"Nuestros cálculos indican que si se usara la máquina más poderosa del mundo y corriera desde ahora hasta el proyectado fin del universo, puede que no tropiece con una de las soluciones”​ (Christopher Monckton, The Times, in 2005).

Este problema fue diseñado para ser dificil de resolver por cómputos de fuerza bruta. La cantidad de configuraciones posibles para el rompecabezas Eternity II, asumiendo que todas las piezas son distintas e ignorando las piezas fijas con posiciones predeterminadas, es 256! x 4 256, aproximadamente 1 1, 5 x 10661.

Un límite superior del posible número de combinaciones puede obtenerse teniendo en cuenta las restricciones de los bordes del tablero y la pieza con posición fijada en el centro:

aproximadamente [7]

x 4! x 56! x 195! x 4

(14)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

OBJETIVO

El objetivo propuesto para este trabajo es encontrar una forma de explorar todo el árbol de soluciones posibles de un algoritmo de backtracking, sabiendo que hay situaciones en las que los tiempos son extremadamente altos, existe la hipótesis de que aprovechando la ventaja que brindan los procesadores multi-núcleo se podría paralelizar el problema de forma tal que cada núcleo se encuentre operando la mayor parte posible del tiempo.

Se propone generar un administrador de hilos que funcione como balanceador de carga, a partir del cual se pueda mantener a los procesadores trabajando la mayor parte posible del tiempo sin saturar a los mismos y considerando los tiempos de sincronización.

El caso de estudio sobre el que se propone trabajar corresponde al rompecabezas Eternity II. El mismo presenta un escenario que es acorde para la exploración mediante diferentes técnicas de recorridos.

Administrar la memoria y formas de representación del problema para poder recorrer el árbol completo de soluciones de forma paralela y desde posiciones distintas del mismo. Debe considerarse que no es objetivo de este trabajo encontrar una solución sino explorar el árbol en su totalidad.

(15)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Organización del trabajo

Para cumplir el objetivo propuesto en este trabajo se debe ahondar en distintos aspectos de interés, por este motivo en cada uno de los siguientes capítulos, se introduce al lector en una sección específica. A continuación se realizará una breve descripción de los contenidos de cada uno de los capítulos.

Capítulo 2: Presenta una introducción a los conceptos relacionados a las soluciones de problemáticas de complejidad NP, como así también una investigación acerca de la paralelización de ciertos algoritmos y los distintos aspectos de medición de los mismos.

Capítulo 3: En esta sección se hace una explicación de la estructura de datos utilizada para la representación tanto del tablero como de las fichas del Eternity II, a su vez se describe la forma en la que fueron seleccionados los colores para los lados de las fichas de tal forma que se respeten las restricciones que se mencionan y con el objetivo de encontrar un balance en la distribución de los mismos.

Capítulo 4: Dentro de la búsqueda de una solución óptima, en este capítulo se detalla el diseño y la implementación de los distintos algoritmos implementados que debieron ser atravesados para obtener conclusiones y seleccionar el mecanismo adecuado según los resultados obtenidos. Se detallan soluciones tanto lineales como paralelas con el fin de realizar comparaciones entre las mismas.

Capítulo 5: ​En este capítulo se detallan las mediciones que se obtuvieron como resultado de los algoritmos desarrollados para diferentes instancias del puzzle utilizado como caso de estudio.

(16)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

ESTADO DEL ARTE

En teoría de la computación un problema puede clasificarse como decidible o indecidible, entre otras clasificaciones, según la respuesta que se pueda dar del mismo dependiendo sus datos de entrada, en esta investigación vamos a trabajar sobre los del primer tipo. Se dice que ciertos problemas son decidibles, porque las máquinas de Turing que los resuelven pueden justamente decidir, cualquiera sea la instancia y los datos de entrada, si es positiva o negativa.

Caracterizados los problemas decidibles dentro del marco de la jerarquía de la computación, se los va a estudiar desde el punto de vista de los recursos que requieren las máquinas de Turing para resolverlos. Nos referiremos fundamentalmente al tiempo, es decir a la cantidad de pasos efectuados por las MT.

Como las instancias de un problema pueden ser de cualquier tamaño, y en general una MT que lo resuelve tarda más (efectúa más pasos) a medida que las entradas son más grandes, resulta natural definir el tiempo de ejecución en términos del tamaño de las entradas. Se distinguen dos clases temporales, P y NP.

La clase P agrupa a los problemas que se resuelven en tiempo determinístico polinomial, y NP es la clase de los problemas que se resuelven en tiempo no determinístico polinomial.

Los algoritmos asociados a los problemas de NP de los que no se conocen resoluciones eficientes se basan en explorar el espacio completo de posibles soluciones, o al menos una parte amplia del mismo que los lleva a consumir tiempo exponencial (en contraste con los algoritmos que resuelven problemas de tipo P). Esta es una constante observada en cientos de problemas de NP, en áreas tan diversas como la teoría de grafos, el álgebra, la aritmética, la teoría de autómatas, la lógica, etc. Si se probara P = NP se estaría demostrando entonces que estos algoritmos de “fuerza bruta” pueden sustituirse por sofisticadas resoluciones ejecutadas eficientemente.

Aunque cualquier solución a un problema NP-completo puede ser rápidamente verificada (en tiempo polinomial) no se conoce una forma eficiente para localizar una solución en el primer intento; la característica más notable de los problemas NP-completos es que no existe una solución no rápida a ellos. El tiempo requerido para resolver el problema usando cualquier algoritmo actual conocido incrementa muy rápido a medida que el tamaño del problema aumenta.

(17)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

cuarenta años, se han encontrado cientos de problemas NP-completos. Históricamente, el primero fue el problema SAT, de satisfactibilidad de las fórmulas booleanas, en nuestro caso tomaremos como ejemplo conductor un problema de satisfacción de restricciones, se trata de un rompecabezas comercial llamado “Eternity puzzle II“ [6].

Backtracking

Se procederá a mencionar las caracterı ́sticas de la técnica de ​backtracking ejecutado

secuencialmente y los principales problemas que han de hallarse en este tipo de recorridos.

El espacio de búsqueda

Uno de los aspectos más importantes que se debe conocer a la hora de estudiar una determinada técnica algorı́tmica es el espacio de soluciones (árbol de búsqueda) por donde se va a realizar el recorrido. En el caso de la técnica que se va a estudiar, dicho recorrido será realizado por un escenario con estructura de árbol.

Si se representase las soluciones encontradas como una tupla de n elementos donde cada uno de ellos pueda tomar un total de h valores, el árbol por el que se realizaría el recorrido tendría una estructura similar a la de la Figura 2.1

Figura 2.1: Espacio de nodos generado por un recorrido de árbol (fuerza bruta)

(18)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Figura 2.2: Árbol desbalanceado con dos hojas que representan soluciones.

Recorrer todo este espacio de búsqueda supondrá un coste demasiado elevado que no se podrá permitir en todos los problemas. Por ejemplo, en un problema de investigación operativa donde se pretende encontrar el mejor camino desde una dirección origen a un destino en función del tráfico, no podrı́amos permitirnos que el tiempo de decisión fuesen varias horas, y serı ́a conveniente resolverlo lo antes posible aunque el resultado encontrado no sea el óptimo [8]. Sin embargo, en ocasiones la necesidad de aplicar este tipo de técnicas se debe a que se busca resolver problemas de optimización donde se deberán recorrer todas las posibles soluciones para poder obtener nuestra solución final, que además queremos que sea la óptima.

La técnica de backtracking

Backtracking es un tipo de algoritmo general para encontrar todas (o algunas)

soluciones a ciertos problemas computacionales, especialmente problemas de satisfacción de restricciones, donde incrementalmente se construyen candidatos a las soluciones y se abandona a un candidato tan pronto como se determina que el candidato no conduce a una solución válida.

(19)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Backtracking solo se puede aplicar para problemas que admiten el concepto de una "solución parcial candidata" y una prueba relativamente rápida de si dicha solución parcial puede conducir a una solución válida. Cuando es aplicable, la técnica de backtracking es mucho más rápida que la búsqueda por fuerza bruta debido a que puede eliminar una gran cantidad de candidatos con una simple prueba.

La técnica presenta más inconvenientes de computación en problemas donde se persigue optimizar una función objetivo o encontrar todas las soluciones a un problema. En estos casos será necesario realizar una búsqueda exhaustiva y sistemática en el espacio de soluciones por lo que suele resultar ineficiente.

El algoritmo de backtracking enumera un conjunto de candidatos parciales, que en principio podrían ser completados de varias formas para dar a todas las posibles soluciones de un problema dado. La completitud se hace de manera incremental, por una secuencia de pasos a través de los candidatos parciales.

Conceptualmente, los candidatos parciales son representados como nodos de una estructura de árbol, el árbol de búsqueda, cada candidato parcial es padre del candidato que difiere de él por un simple paso; las hojas del árbol son candidatos parciales que ya no podrán ser extendidos.

El algoritmo de ​backtracking atraviesa este árbol de búsqueda de forma recursiva

desde la raíz hacia abajo en ​depth-first ​orden. En cada nodo c, el algoritmo verifica si c puede ser completado hacia una solución válida. Si no puede, todo el subárbol con raíz en c es salteado (podado). De lo contrario, el algoritmo verifica si c es una solución válida, y si es así y enumera recursivamente todos los sub árboles de c.

Por lo tanto, el árbol de búsqueda actual es atravesado por el algoritmo es solo una parte del potencial árbol. El costo total del algoritmo es el número total de nodos del árbol actual multiplicado por el costo de obtener y procesar cada nodo. Este hecho debe ser considerado cuando se elige el árbol potencial de búsqueda y las restricciones de poda.

(20)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Nociones de Programación paralela

Los Sistemas Paralelos integran los algoritmos de procesamiento (software) con la arquitectura de soporte (hardware). Cuando se quiere obtener buen rendimiento de una arquitectura multiprocesador, es necesario conocer con un alto nivel de detalle la configuración de hardware disponible y analizar (en base a este dato) los métodos y algoritmos de software a utilizar [11].

La necesidad que surge para resolver problemas que requieren tiempo elevado de cómputo da lugar a lo que hoy en día se conoce como computación paralela. Mediante el uso concurrente de varios procesadores se resuelven problemas de manera más rápida que lo que se puede realizar con un solo procesador.

Una arquitectura paralela es una colección de elementos de procesamiento que se comunican y cooperan. Las aplicaciones paralelas aprovechan esto con el objetivo de resolver un problema común, tratando de reducir el tiempo de ejecución de la aplicación, y/o resolver problemas de mayor tamaño.

En algunos casos el costo del paralelismo puede ser alto en término del esfuerzo de programación requerido: debe pensarse en la aplicación de técnicas nuevas, reescribiendo completamente el código secuencial considerando que las técnicas de debugging y mejoras de performance secuenciales no se extienden fácilmente al mundo paralelo. Por otro lado los problemas son paralelizables en distintos grados. Para algunos, asignar particiones a otros procesadores podría significar mayor consumo de tiempo que realizar el procesamiento localmente. Otros problemas pueden ser esencialmente secuenciales. Un problema puede tener distintas formulaciones paralelas, lo que puede resultar en beneficios variados, y todos los problemas no son igualmente adecuados para el procesamiento paralelo.

Esto lleva a que la construcción de algoritmos paralelos signifique un desafío ya que, entre otras cuestiones, es necesario tener en cuenta la arquitectura sobre la cual se ejecutará el programa, el modelo de comunicación utilizado y la manera de dividir el problema y los datos.

Por otro lado, existen distintas alternativas de implementación sobre sistemas de cómputo paralelo con hardware de procesamiento homogéneo o heterogéneo y con acoplamiento fuerte o débil de sus componentes. Estas alternativas abren una amplia gama de posibilidades que se traducen a su vez en costos que se deben evaluar fundamentalmente desde el punto de vista de la relación costo/rendimiento. Se debe tener en cuenta que el costo involucrado no está referido solamente al hardware específico de procesamiento sino que involucra también el desarrollo y/o la adaptación de los algoritmos a la arquitectura de procesamiento.

(21)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

algoritmos paralelos logran una aceleración óptima. La mayoría tienen una aceleración casi lineal para un pequeño número de elementos de procesamiento, y pasa a ser constante para un gran número de elementos de procesamiento.

Figura 2.3: Representación gráfica de la ley de Amdahl

La aceleración potencial de un algoritmo en una plataforma de computación en paralelo está dada por la ley de Amdahl, formulada originalmente por Gene Amdahl en la década de 1960. Ésta señala que una pequeña porción del programa que no pueda paralizarse va a limitar la aceleración que se logra con la paralelización. Los programas que resuelven problemas matemáticos o ingenieriles típicamente consisten en varias partes paralelizables y varias no paralelizables (secuenciales). Si α es la fracción de tiempo que un programa necesita para procesar partes no paralelizables, luego:

S

=

1α

= lim

P→∞

1 + α P 1−α

Fórmula 2.1: ​ ley de Ahmdal. El incremento de velocidad de un programa utilizando múltiples procesadores en computación distribuida está limitada por la fracción secuencial

del programa

(22)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Esto pone un límite superior a la utilidad de añadir más unidades de ejecución paralelas. [12] [13] [14]

Fórmula 2.2​:​- aceleración o ganancia en velocidad conseguida en el sistema completo debido a la mejora de uno de sus subsistemas.

Fm = fracción de tiempo que el sistema utiliza el subsistema mejorado

Am = factor de mejora que se ha introducido en el subsistema mejorado.

Arquitecturas de hardware multinúcleo

En los tiempos actuales, las computadoras multiprocesador se están volviendo un estándar, mientras que los aumentos de velocidad en procesadores individuales han disminuido. Por lo tanto la clave para obtener aumentos en performance es justamente aprovechar, mediante paralelismo, los múltiples procesadores al ejecutar un programa. [33] La “unidad de procesamiento central” (CPU) está diseñada para el procesamiento en serie: se compone de unos pocos núcleos muy complejos que pueden ejecutar unos pocos programas al mismo tiempo. Por otro lado, la “unidad de procesamiento de gráficos” (GPU) es un procesador de propósito específico: está optimizada para trabajar con grandes cantidades de datos y realizar las mismas operaciones sobre un gran conjunto de datos. La GPU tiene cientos o miles de núcleos sencillos que pueden ejecutar el mismo código específico sobre muchos datos a la vez. Las tareas de las que se encarga la GPU requieren un alto grado de paralelismo.

Una tarjeta gráfica, con sus miles de núcleos trabajando en paralelo, puede multiplicar por 100 el rendimiento de una CPU en ciertas operaciones. La computación acelerada por GPU consiste en el uso de una unidad de procesamiento de gráficos GPU, junto a una CPU para acelerar el funcionamiento de las aplicaciones de aprendizaje profundo, análisis e ingeniería. Hoy en día, los aceleradores de GPU, permiten el funcionamiento de centro de datos con eficiencia energética en laboratorios gubernamentales, universidades, empresas, y pequeñas y medianas empresas en todo el mundo. Tienen un papel muy importante en la aceleración de aplicaciones en plataformas, que abarcan desde la inteligencia artificial hasta automóviles, drones y robots. [31]

(23)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

el procesamiento en serie secuencial, mientras que una GPU cuenta con una arquitectura en paralelo enorme que consiste de miles de núcleos más pequeños y eficaces, y que se diseñaron para resolver varias tareas al mismo tiempo.

Figura 2.4: Arquitectura básica GPU

Paralelización de un algoritmo tipo

backtracking

Existen distintos enfoques para la paralelización de estrategias de búsqueda exhaustiva o backtracking. Un modelo de paralelización orientada a nodos consiste en evaluar y expandir nodos en paralelo [15]. Esta estrategia generalmente tiene un proceso

Master el cual maneja una estructura de datos central llamada set activo [16]. El proceso

Master envía/recibe nodos hacia/desde procesos esclavos, los cuales son responsables de

subdividir estos nodos. Por ejemplo, para generar nodos más restringidos que el nodo padre. Esta es la razón por la cual el modelo orientado a nodos es conocido también como modelo maestro/esclavo.

El grado de paralelismo en el modelo maestro/esclavo es limitado y fuertemente dependiente en las características de la función de evaluación de los nodos y el factor de ramaje de un nodo (y también depende del tipo de asignación de las tareas estatico o dinamico). Los algoritmos de árboles de búsqueda paralelo y los esqueletos sistemas de memoria compartida y distribuida usualmente aplican al modelo de programación orientada a nodos.

(24)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

soluciones al mismo tiempo en distintos procesadores. En problemas de búsqueda de solución aumentan las posibilidades de encontrar la solución en menos tiempo. En la Figura 2.7 tenemos un ejemplo donde se dispone de tres procesadores (P0, P1 y P2) y se asigna a cada uno de ellos un subespacio del árbol de soluciones.

Figura 2.5: Distribución de subárboles en distintos procesadores

Un paradigma de programación es una clase de algoritmos que resuelven problemas distintos, pero que tienen la misma estructura de control [17]. Para cada paradigma puede escribirse un programa general que define la estructura de control común; éste es llamado esqueleto algorítmico, programa genérico o “template” de programa [18]. En la programación paralela pueden distinguirse una serie de paradigmas que permiten encuadrar los problemas en alguno de ellos y simplifican la tarea del programador. Unos pocos de ellos son usados repetidamente para desarrollar la mayoría de las aplicaciones paralelas.

La selección del paradigma es determinado por la disponibilidad de recursos de cómputo paralelo, y por el tipo de paralelismo inherente en el problema. Los recursos de cómputo pueden definir el nivel de granularidad que puede soportar en forma eficiente el sistema, mientras que el tipo de paralelismo refleja la estructura paralela de la aplicación y/o los datos.

(25)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Esquema maestro esclavo

En el paradigma Maestro/Esclavo, un proceso actúa como coordinador (maestro) dirigiendo a todos los otros que funcionan como trabajadores (esclavos). El maestro es responsable de descomponer el problema en tareas pequeñas, distribuirlas entre los diferentes procesos, y recibir los resultados parciales para componer la solución final del problema. Los esclavos o trabajadores realizan un procesamiento muy simple: reciben una tarea a realizar, la procesan, y envían los resultados al maestro. Este ciclo puede repetirse hasta que el maestro no tenga más tareas para resolver [19].

En la Figura 2.8 se refleja como el proceso maestro es el encargado de asignar el trabajo a cada uno de los procesos esclavos. Los procesos esclavos enviarán información al maestro cuando lo consideren necesario. Las comunicaciones entre dos procesos esclavos se realizarán a través del proceso maestro.

Figura 2.6: Representación esquema maestro esclavo con comunicaciones

Se ha hablado en general de la distribución del espacio de búsqueda entre los distintos procesadores, de momento es necesario analizar la forma en la que el proceso maestro asigna los diferentes espacios de búsqueda a sus procesos esclavos. En el caso de la técnica de backtracking podrı́amos realizar el recorrido en varias etapas. Se recorre primero el árbol de búsqueda hasta un determinado nivel ​i​. Una vez alcanzado este nivel, se guarda la información de los nodos encontrados al nivel i.

Posteriormente se van haciendo nuevos recorridos desde los nodos almacenados hasta el último nivel. Cada uno de estos recorridos se puede considerar un backtracking independiente. En la Figura 2.7 se ha realizado un ​backtracking​ inicial hasta el nivel ​i​ = 1.

(26)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

corresponderá con el total de trabajos que puede asignar a los procesos esclavos, también conocidos como backtracking secundarios. Una vez finalizado el backtracking inicial es posible considerar al proceso maestro como un esclavo más y es explicado a continuación.

Cuando se utiliza el método de reducción con un nivel de ​backtracking inicial lo suficientemente grande con el objetivo de obtener muchas tareas pendientes sucede que el proceso maestro luego de crear las tareas iniciales se detiene y libera el uso de la CPU. Como inicialmente muchas tareas pendientes habrían sido creadas, los hilos que finalizan siempre encontrarán una siguiente tarea para ejecutar sin necesidad de despertar al proceso maestro para obtenerla. Entonces, si se usa un número de hilos mayor a la cantidad de núcleos que tiene la CPU, se logra que el ​Manager libere el uso de la CPU, que es igual a considerarlo como un proceso esclavo más en términos de eficiencia. De lo contrario, si por ejemplo se utiliza un CPU de 4 núcleos y 3 hilos son creados sumado el proceso maestro, en ese caso por más que el maestro se detenga y libere la CPU, ningún otro hilo lo usuaria y resultaría en un núcleo ocioso.

Son estos últimos backtrackings secundarios los que realmente se realizan en paralelo, no podrán empezar hasta que el proceso maestro no haya terminado el primer recorrido.

Se reconoce otro aspecto interesante entonces que son las comunicaciones entre todos los procesadores con el objetivo de poder realizar el trabajo de forma independiente pero a la vez conjunta. Respecto al momento en el cual el maestro realiza la distribución de los datos, existen dos opciones básicas [20]​​: ​asignación estática y asignación dinámica​.

Asignación estática de tareas

Se puede asignar de manera estática los trabajos entre los distintos procesadores. A cada procesador se le asignan un número de estos trabajos. Cada procesador comienza a buscar una solución en el espacio de búsqueda que le corresponda. No son necesarias las comunicaciones entre ellos. Cada procesador únicamente puede dedicarse a resolver aquellos problemas que le han sido asignados en un principio.

Es posible dividir el total de tareas a asignar entre el número de procesadores que disponemos y asignar a cada uno el número de tareas contiguas que le correspondan. En ocasiones las podas se encuentran localizadas en un cierto área del espacio de estados. Si realizamos la asignación por bloques puede que a algunos procesadores se le asignen trabajos donde el porcentaje de podas sea muy superior al de otros puntos del espacio de búsqueda. Esto desequilibraría la distribución de los trabajos y no se estaría aprovechando completamente el paralelismo.

En la figura 2.9 se ilustra la situación en la que a dos procesadores se les asignan dos tareas a cada uno las cuales son generadas por el procesador que ejecuta el ​Master (P0) las

(27)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Figura 2.7: Asignación estática de trabajos a los hilos de ejecución y procesador Master

Considerando el tamaño de las tareas A,B,C, y D de 4,1,1 y 1 unidades de tiempo respectivamente.

Al finalizar ambas tareas en el tiempo t=2 el procesador P2 pudo haber tomado la tarea B del nodo 2 y ejecutarla en una unidad de tiempo. La solución finaliza todo el trabajo en t=4 cuando el procesador P1 haya terminado su única tarea. Sin embargo, el procesador P1 terminará sus tareas asignadas en 5 unidades de tiempo.

Esta situación se puede dar con cualquier tipo de asignaciones. Dado que no se conoce a priori si se divide el espacio de búsqueda de forma equitativa entre los procesadores disponibles, un procesador puede tener poco trabajo y estar la mayor parte del tiempo inactivo lo cual conduce a una situación de desaprovechamiento del paralelismo.

Teniendo en cuenta ese desequilibrio, se podría considerar otros mecanismos de distribución de tareas, pero en este trabajo no se conoce a priori cuales son los potenciales subárboles de búsqueda ni su tiempo de ejecución. Por tal motivo, analizar estos mecanismos de asignación de tareas resulta improductivo.​La complejidad que implica este cálculo para realizar una asignación de tareas ideal, tiene en este caso de estudio un costo injustificable en términos de eficiencia, es por eso que en los algoritmos no se usara ese tipo de inteligencia. Las heurísticas estarán orientadas a encontrar los nodos en los cuales sea más conveniente dividir una rama a partir de la cual poder paralelizar tareas. Se considera que un nodo X es mejor que un nodo Y para dividir si la división de X genera tareas de mayor tiempo de resolución que las que produciría la división de nodo Y.

Que la división de un nodo conduzca a la generación de tareas de mayor tiempo, producirá periodos más amplios en los que se utilizará la cpu para resolver el árbol y en consecuencia menores periodos en los que se utilizarían recursos en tareas de división

(28)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

En la asignación dinámica bajo demanda de tareas cada procesador sigue trabajando en una parte del espacio de búsqueda. El proceso maestro gestiona los subtrabajos pendientes y se encarga de distribuirlos a los esclavos bajo demanda, es decir, cuando un procesador esclavo termina todos los subtrabajos que le fueron asignados, solicita más trabajo al maestro. No existe una distribución de tareas fija. El proceso maestro actuará como coordinador de los demás procesos que están resolviendo problemas. En este caso el proceso maestro no actúa como los esclavos, y no se dedica a resolver problemas sino a coordinarlos. Los procesos esclavos se dedican a resolver problemas y comunicar las soluciones encontradas al proceso maestro.

En primera instancia se distribuye un cierto porcentaje de trabajo en forma estática (directa o predictiva de acuerdo a la arquitectura), y el resto se reparte bajo demanda, es decir que cuando algún proceso esclavo está libre le pide más trabajo al maestro. Cuando a priori no se conoce la cantidad de tareas a realizar o el tamaño de las mismas, este método reduce el desbalance de carga, a costa de incrementar la cantidad de comunicación y sincronización [21].

Figura 2.8: Asignación dinámica de tareas entre cuatro procesadores esclavos disponibles y procesador Master

En la Figura 2.10 el proceso ​maestro genera los trabajos iniciales, siendo ejecutado en

un procesador P0. Los nodos numerados son los que constituirían la bolsa de tareas.

Los subárboles que se muestran en la Figura 2.10 son asignados a 4 procesadores distintos bajo la suposición de que existen y están solicitando tareas para ejecutar. Al iniciarse cada uno de los hilos de ejecución solicitará al proceso ​maestro una tarea para

(29)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Figura 2.9: Asignación dinámica de tareas entre dos procesadores esclavos disponibles

Los subárboles con la pirámide pequeña tardan una unidad de tiempo en resolverse. Los subárboles con la pirámide grande tardan dos unidades de tiempo en resolverse. Suponiendo que en el instante ​T=0 el proceso maestro alcanza el nivel elegido de corte, si ahora se consideran solo 2 procesadores disponibles para ejecutar tareas a diferencia del caso anterior en el que había al menos cuatro, en el instante ​T=1 el proceso maestro asigna las dos primeras tareas a los dos procesadores que tiene disponibles. En el instante ​T=2 el procesador uno termina la tarea que tenı ́a asignada y solicita más trabajo al proceso maestro. El proceso maestro asigna el siguiente trabajo que tiene disponible, el trabajo tres al procesador uno. En el instante T=3 el procesador esclavo número uno y dos se encuentran disponibles para tomar nuevas asignaciones. El maestro va a proporcionar las tareas generadas a partir del nodo cuatro y cinco para los dos procesadores esclavos disponibles. Suponiendo que es el procesador uno el que toma el trabajo de recorrer el árbol de exploración D, el procesador dos va a recorrer el árbol E. En una unidad de tiempo solo el procesador dos habrá terminado su tarea asignada y el proceso ​Master podrá asignarle el trabajo F que se desprende del nodo 6, mientras tanto, el procesador uno continuará con el recorrido que ya tenía asignado.

De existir más asignaciones en la bolsa de tareas inicial el proceso maestro va a continuar asignando las tareas a los procesadores que vayan terminando las propias hasta resolverse todos los problemas.

(30)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

asignar en la bolsa de tareas (trabajos pendientes > 0). Por su parte los procesos esclavos enviarán solicitudes de trabajos al proceso maestro una vez que terminen sus tareas.

De alguna forma el proceso maestro va a informar a los los procesos esclavos que ya no quedan más trabajos por asignar, luego los esclavos cesarán sus solicitudes.

Estudio de la parametrización de los algoritmos

Explicadas las posibles variaciones del esquema paralelo de backtracking, se puede hacer un análisis acerca de los parámetros configurables que impactan de manera directa en el tiempo de ejecución.

Parte secuencial

(31)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Figura 2.10: Árboles de búsqueda de un mismo problema generando el backtracking inicial a diferentes alturas.

En la Figura 2.12 se muestra la distribución del espacio de búsqueda de un mismo problema generando hasta diferentes niveles el backtracking inicial. En la Figura 2.12 a) el backtracking inicial consume muy poco tiempo pero el desbalance de la carga de los subproblemas es demasiado grande y penalizará el tiempo de ejecución final. Por otro lado, en la Figura 2.12 b) se emplea más tiempo en el primer recorrido, pero el balanceo de los subproblemas mejora, aprovechándose mejor el paralelismo.

Se deberá intentar elegir el valor del parámetro ​k​ para el que se consiga obtener el menor tiempo de ejecución total. El valor óptimo para este parámetro dependerá de cada uno de los problemas, de la entrada a resolver y de la máquina donde se esté ejecu- tando el sistema.

Cantidad de hilos paralelos

(32)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Según el tipo de asignación

Estática

En este caso un posible parámetro de configuración es elegir que tipo de asignación estática se utilizará. Al no conocer cómo se balancea la carga en los subproblemas que se deben asignar se debe tener sumo cuidado al elegir un tipo de asignación que funcione bien para todos los casos. Incluso para dos entradas distintas para un mismo problema una misma asignación puede arrojar resultados completamente diferentes.

Si se consigue conocer a priori cómo se balancea la carga de trabajo en los nuevos subproblemas se podrı ́an asignar de manera tal que minimice el tiempo de ejecución total. Para ello sería posible utilizar las técnicas que se han estudiado para predecir el comportamiento de los problemas de backtracking secuenciales.

Dinámica

Dependiendo del paradigma de programación que sea utilizado, el envı́o de los trabajos a los procesos esclavos puede acarrear consigo tiempos de comunicación. El proceso maestro no siempre tendrı́a que distribuir los trabajos de uno en uno. Para no consumir excesivo tiempo en las comunicaciones podrı́a enviar diferente número de subtrabajos a cada uno de ellos. El número de subtrabajos a enviar serı ́a un parámetro del algoritmo sensible de configurar. Esta es una necesidad que se presenta con mayor frecuencia en ambientes distribuidos, donde la comunicación entre procesos tiende a ser más lenta.

Métricas de

performance

A la hora de seleccionar algoritmos paralelos para un determinado problema es importante tener en cuenta la performance o rendimiento que brinda cada alternativa y sus distintas variaciones según las variaciones de sus parámetros intervinientes. Las métricas de rendimiento, en general están asociadas al tiempo de procesamiento o a la aceleración o

speedup​ con respecto a una versión inicial

Tiempo de ejecución

(33)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

El tiempo de ejecución secuencial (Ts), para el caso de algoritmos secuenciales, se define como el tiempo transcurrido entre el comienzo y la finalización de la ejecución sobre un único procesador.

El tiempo de ejecución paralelo (Tp), consiste en el tiempo transcurrido entre el inicio del primero de los procesos y la finalización del último de ellos, ejecutándose en todas las unidades de procesamiento de la arquitectura. No siempre es fácil determinar el orden en el que los procesadores empiezan y terminan.

Esta métrica (Tp) está fuertemente vinculada con la arquitectura donde se ejecute el algoritmo por lo que es difícil que sea de utilidad a la hora de medir el rendimiento del mismo.

Speedup

A la hora de evaluar un sistema paralelo suele ser de interés saber cuánto mejora el rendimiento al paralelizar un algoritmo respecto a su mejor versión secuencial. El ​speedup

(S) es una medida que permite cuantificar el beneficio relativo en resolver un problema en paralelo respecto al secuencia.

Dadas las misma condiciones iniciales y parámetros de entrada, la función de speedup se define como el cociente entre el tiempo de ejecución de un programa secuencial, Ts, y el tiempo de ejecución de la versión paralela de dicho programa en ​p procesadores, Tp. Dado

que pueden haber distintas versiones secuenciales, se elige el Ts de la versión secuencial más rápida. Este índice indica la ganancia de velocidad que se ha obtenido con la ejecución en paralelo.

S =

T pT s

Fórmula 2.3: cálculo de Speedup

En el mejor de los casos, cuando la arquitectura es homogénea, el tiempo de ejecución de un programa en paralelo con ​p procesadores seráp veces inferior al de su ejecución en un solo procesador, teniendo todos los procesadores igual potencia de cálculo. Es por ello que el valor máximo que puede alcanzar el speedup de un algoritmo paralelo es p. A este valor límite se lo conoce como ​speedup óptimo​de la arquitectura paralela. En la práctica existen casos muy específicos en los que el speedup supera este límite y se dice que el sistema logra un speedup superlineal:

(34)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

● Al poder dividir los datos con que trabaja la aplicación en porciones que se distribuyen entre los procesadores, permite tener un mejor aprovechamiento de la memoria caché, reduciendo de forma drástica el tiempo de acceso a memoria, y por lo tanto el tiempo final de la aplicación. La mayoría de las veces que se da esta situación el algoritmo secuencial puede optimizarse dividiendo los datos de la misma forma que el paralelo y trabajando secuencialmente en cada porción. Pero hay un reducido grupo de problemas en los que esto no se puede realizar, y por lo tanto se obtiene speedup superlineal.

Eficiencia

La eficiencia (E) es una medida de la fracción de tiempo promedio para la cual los elementos de procesamiento del sistema paralelo son usados útilmente. Esta métrica se define como el cociente entre el speedup y la cantidad de procesadores de la arquitectura utilizada [22].

E

=

pS

Fórmula 2.4: cálculo de eficiencia

Desbalance de carga

Uno de los motivos principales que disminuyen el rendimiento de los sistemas paralelos es el tiempo en el que los procesadores se encuentran ociosos. Ocurre esencialmente cuando los trabajos a realizar no están distribuidos equitativamente entre las diferentes unidades de procesamiento que conforman la arquitectura paralela.

Se considera que el problema a resolver se divide en un número fijo de procesos que pueden ejecutarse en paralelo. Cada proceso realiza una cantidad conocida de trabajo.

Sin embargo, puede ocurrir que algunos procesadores terminen sus tareas antes que el resto y queden libres debido a que el trabajo no se haya repartido de una forma equitativa o porque algunos procesadores sean más rápidos que otros, o por ambas situaciones. La situación ideal es que todos los procesadores trabajen de una forma continua sobre las tareas disponibles para conseguir el mínimo tiempo de ejecución [23].

(35)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Se entiende por escalabilidad a la capacidad de adaptación y respuesta de un sistema con respecto al rendimiento del mismo a medida que aumentan de forma significativa el número de recursos de procesamiento asignados. Aunque parezca un concepto claro, la escalabilidad de un sistema es un aspecto complejo e importante del diseño. Su análisis es necesario para elegir la mejor combinación de algoritmo y arquitectura para resolver un problema bajo distintas restricciones sobre el crecimiento del tamaño del mismo o de los recursos de procesamiento.

En definitiva la escalabilidad suele indicar la capacidad del algoritmo de utilizar de forma efectiva un incremento en los recursos computacionales. Un algoritmo paralelo escalable suele ser capaz de mantener su eficiencia constante cuando aumentamos el número de procesadores incluso a base de aumentar el tamaño del problema. Si un algoritmo no es escalable, aunque se aumente el número de procesadores, no se conseguirá incrementar la eficiencia aunque se aumente a la vez el tamaño del problema, con lo que cada vez se irá aprovechando menos la potencia de los procesadores.

Es importante analizar el efecto de incrementar el tamaño de la arquitectura dejando fijo el del problema, y por otro lado incrementar el tamaño del problema dejando fijo el número de procesadores. Las Figuras 2.13 y 2.14 esquematizan estos comportamientos, junto con las siguientes observaciones:

● Para un determinado tamaño de problema, al aumentar la cantidad de elementos de procesamiento (recursos de cómputo) cae la eficiencia del sistema paralelo completo (Figura 2.13). Este es un fenómeno común a todos los sistemas paralelos.

(36)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

● Para una determinada cantidad de elementos de procesamiento (recursos de cómputo), al incrementar el tamaño del problema la eficiencia sube (Figura 2.14). Este es un fenómeno que no se da en todos los sistemas paralelos.

Figura 2.12: Variación de la eficiencia del sistema al aumentar el tamaño del problema y dejar fijo la cantidad de procesadores

(37)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

DISEÑO

Y

MODELADO

DEL

ALGORITMO

Y

ESTRUCTURAS

En esta sección, se detallan las estructuras de datos necesarias para representar el tablero del juego de manera tal que ocupe la menor cantidad posible de memoria, así como las diferentes maneras de generar tableros de prueba.

Representación del Tablero

El tablero es representado por una matriz de N*N que en cada posición almacena una ficha. Esta matriz está contenida por un objeto tablero que además tiene funciones útiles para la ejecución de las soluciones desarrolladas. Las principales funciones que tiene el tablero son:

- Insertar una ficha: inserta en la última posición libre la ficha pasada por parámetro. La primer ficha es insertada en la posición (0,0) y luego se completa el tablero fila por fila hasta insertar la ficha en la posición (N,N).

- Quitar la última ficha: Extrae del tablero la última ficha insertada.

- Comprobar si es solución parcial : comprueba que la última ficha insertada sea válida para esa posición. Que una ficha sea válida en una posición implica que cumpla con las restricciones que luego serán explicadas en el capítulo de generación de modelos. En la soluciones creadas en este trabajo por cada ficha que se inserta se invoca a esta función, por eso para comprobar que un tablero es solución parcial solo basta con evaluar la validez de la última ficha insertada.

- Comprobar si es solución final : Comprueba que la última ficha insertada sea válida y además que la posición sea (N,N). No es necesario comprobar la validez de todas las fichas por lo explicado en la función anterior.

Piezas del

puzzle

Cada pieza del rompecabezas tiene sus bordes en un lado marcado con diferentes combinaciones de colores, cada uno de los cuales debe coincidir con el lado adyacente de cada pieza cuando se completa el rompecabezas. Cada pieza se puede usar en solo 4 orientaciones.

(38)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Figura 3.1: Ficha con lados instanciados. Izq = 0, Arr = 0, Der = 0, Abj = 2. La ficha también tiene un id.

Generador de tableros modelo

El generador de modelos se define como un componente que tiene la responsabilidad de crear un tablero y las fichas que lo componen. Tiene dos variables principales:

- N : Es el tamaño de N filas por N columnas que tiene un tablero. Un tablero de NxN está compuesto por un total de N * N fichas.

Esta variable nos permite crear tableros de distintos tamaños y complejidades para testear los algoritmo creados en este trabajo.

- Cantidad de colores: Es la cantidad máxima de distintos colores que se permite a la hora de crear las fichas para un tablero de tamaño N.

Tanto la cantidad máxima de colores como la distribución de estos colores en las fichas son elementos claves para determinar la complejidad de resolución de un tablero.

En el capítulo de resultados se muestra con mayor detalle cómo la combinación de distintos valores de estos parámetros influyen sobre los tiempos de resolución .

Restricciones

Un paso importante es definir las restricciones que tendrá el problema para que de esta forma se pueda avanzar en la búsqueda de la solución de manera evolutiva creando soluciones parciales.

Las restricciones utilizadas fueron:

- Restringir las fichas para que sean diferentes: De esta forma queda garantizado que no aparezcan fichas repetidas.

- Forzar que los bordes adyacentes sean iguales: todo par de fichas adyacentes están separadas en el mismo color, horizontal y verticalmente.

(39)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

marcada con color negro) produce que una misma solución se encuentre 3 veces más como resultado ser el mismo dibujo rotado. Para evitar esta cuadruplicación de soluciones es que se decide dejar fija la primer ficha del tablero.

Solución 1 S1 rotada 90 S1 rotada 180 S1 rotada 270 Figura 3.2: Tableros solución, resultado de poner en el primer lugar las distintas fichas que

encajan en los extremos

Método de alocación

Como ha sido mencionado anteriormente, el puzzle Eternity II requiere para su inicialización un conjunto de fichas que complete el tablero respetando las restricciones.

Con tal propósito se consideró la necesidad de tener un generador de modelos que tenga como datos de salida una lista de fichas, para un tamaño de tablero indicado.

(40)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Figura 3.3: Tablero vacío con orden de generación e índices de filas y columnas

Al generarse una ficha se conocerán las restricciones que debe satisfacer dependiendo la posición del tablero que vaya a ocupar. Si la columna es la 0 o la N-1, debe setearse el color 0 (gris) en el borde izquierdo o derecho respectivamente. La misma situación se produce si la fila es la número 0 o la N-1 lo cual implica que se coloque el color 0 en el borde superior o inferior respectivamente.

Por otro lado existe la restricción de adyacencia que condiciona el color de una ficha, con el color de su ficha adyacente. Como el recorrido se realiza de izquierda a derecha y de arriba hacia abajo al generar una ficha para una posición (i,j) es necesario coincidir los colores del lado izquierdo de la ficha con el lado derecho de la ficha posicionada en (i-1,j) para todo 0 < i < N. De igual manera, para esa misma posición la ficha deberá coincidir su color del lado superior con el color de lado inferior de la ficha (i,j-1) para todo 0 < j < N.

(41)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Figura 3.4: Tablero con la primera ficha colocada respetando las restricciones

Para la generación de colores de los lados restantes de la ficha 1, al no tener restricciones de lados, los colores 1 (azul) y 2 (verde) se generan automáticamente a partir de una lógica explicada en la siguiente sección.

Existe una tercera restricción que consiste en que todas las fichas deben ser únicas, lo que significa que al generarse una ficha es necesario un análisis de las fichas ya generadas para evitar repeticiones.

Figura 3.5: Tablero con la segunda ficha colocada respetando las restricciones

En la Figura 3.5 se puede ver como la nueva ficha generada (0,1) cumple las tres restricciones: el borde superior en gris, el lado izquierdo coincidente con el lado derecho de la ficha inmediatamente a su izquierda (0,0) y no se repite dentro de las fichas ya ubicadas.

(42)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

Selección de colores nuevos

Los colores que se generan sin restricciones de adyacencia se eligen a partir de una estrategia que se fue refinando a medida que se avanzó en el análisis de los resultados obtenidos. A continuación se explica las diferentes estrategias utilizadas:

Color prioritario

Como primer enfoque, para seleccionar el color de una ficha que se está creando, se selecciona el menor color definido tantas veces como fuera posible, respetando la restricción de unicidad de la ficha.

Para el primer caso la ficha generada sería como se muestra en la Figura 3.6, en la cual se utiliza dos veces el color 1 (azul).

Figura 3.6: Primera ficha generada con el generador de modelos desbalanceado

La particularidad que presenta esta solución es que cada vez que se genera una nueva ficha, el color 1 tiene prioridad por sobre el resto y aparecerá con mayor frecuencia dentro del conjunto total de fichas. En la Figura 3.7 podemos ver la creación de la ficha para la posición adyacente.

Figura 3.7: Segunda ficha generada con el generador de modelos desbalanceado

Se puede ver que se cumple la condición de igual color de un lado que el lado opuesto de la pieza adyacente, también se cumple la restricción del borde con color 0 (gris) y la condición de unicidad.

(43)

Castellanos - Aguirre : Desarrollo de un solver paralelo aplicado a la resolución del puzzle Eternity II

color cantidad

0 8

1 15

2 8

3 1

Tabla 3.1: Distribución de colores para una instancia de tablero de tamaño N = 4

Esta situación de desbalance provoca que, a la hora de buscar una solución, exista una gran cantidad de fichas que puedan ser ubicadas en una misma posición. Si bien los tiempos que demora en generarse el árbol de búsqueda completo pueden ser muy altos (dependiendo el tamaño del tablero), la principal dificultad que este enfoque presenta es que la cantidad de soluciones encontradas es considerablemente alta, dentro del orden de las miles de soluciones, lo cual es una diferencia no trivial respecto de la situación real del Eternity II.

Balanceado con color aleatorio

La siguiente alternativa que fue planteada tiene como objetivo tener una distribución uniforme de colores y se compone de dos pasos fundamentales cuando se debe seleccionar los colores de una ficha que se está creando:

1 - La primer opción es seleccionar el color menos utilizado hasta el momento. Para esto se cuenta con un arreglo en el cual cada índice representa uno de los posibles colores y el valor en esa celda del arreglo representa cuántas veces fue usado hasta el momento ese color en otras fichas. Si luego de la asignación de los colores la ficha generada no existe hasta el momento se actualizan los contadores de los colores usados en cada costado y se procede a la generacion de la proxima ficha. En caso contrario, si la ficha generada ya coincide con una existente se procede al paso 2.

Referencias

Documento similar

If certification of devices under the MDR has not been finalised before expiry of the Directive’s certificate, and where the device does not present an unacceptable risk to health

In addition to the requirements set out in Chapter VII MDR, also other MDR requirements should apply to ‘legacy devices’, provided that those requirements

The notified body that issued the AIMDD or MDD certificate may confirm in writing (after having reviewed manufacturer’s description of the (proposed) change) that the

que hasta que llegue el tiempo en que su regia planta ; | pise el hispano suelo... que hasta que el

Para ello, trabajaremos con una colección de cartas redactadas desde allí, impresa en Évora en 1598 y otros documentos jesuitas: el Sumario de las cosas de Japón (1583),

dente: algunas decían que doña Leonor, &#34;con muy grand rescelo e miedo que avía del rey don Pedro que nueva- mente regnaba, e de la reyna doña María, su madre del dicho rey,

(*) Conforme a lo establecido en el apartado 1.6 del Real Decreto 373/2020, de 18 de febrero de 2020, por el que se desarrolla la estructura orgánica básica del Ministerio de

Tras establecer un programa de trabajo (en el que se fijaban pre- visiones para las reuniones que se pretendían celebrar los posteriores 10 de julio —actual papel de los