Diseño de algoritmos paralelos

Documentos relacionados
Introducción a las sentencias de control

Programación 2. Grado en Estadística Aplicada. Curso Generación de números pseudoaleatorios. Manejo de ficheros de texto.

Clase adicional 2. Estructuras básicas de control. Temas

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas

Prof. Dr. Paul Bustamante

Práctica 1: Una primera aproximación a la programación de sistemas concurrentes y distribuidos en C++

Natalia Partera Jaime Alumna colaboradora de la asignatura

Expresión, Operador, Operando, Asignación, Prioridad

El lenguaje C. 1. Estructuras. Principios de Programación Definicion de estructuras

Problemas de Recursividad

Los números enteros. > significa "mayor que". Ejemplo: 58 > 12 < significa "menor que". Ejemplo: 3 < 12 Cualquier número positivo siempre es mayor

Declaración de variables (integer, single, double, boolean, etc.) en Visual Basic. Dim. Ejemplos. (CU00309A)

CAPÍTULO 10 ALGORITMOS DE ORDENACIÓN Y BÚSQUEDA Búsqueda en listas Resumen Ejercicios Problemas


Representación de los números naturales

Algoritmos de Ordenación

Números enteros. 1. En una recta horizontal, se toma un punto cualquiera que se señala como cero.

UNIDAD 2: INTRODUCCIÓN AL LENGUAJE DE PROGRAMACiÓN R

CAPÍTULO 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

Modulo 11. Clases y Objetos en Java

Complejidad de Algoritmos

INSTITUTO TECNOLOGICO DE LAS AMERICAS CARRERA DE TECNOLOGO EN REDES DE LA INFORMACION SISTEMAS OPERATIVOS I

Arreglos Unidimensionales En este tipo de arreglo se hace uso de un índice solamente para hacer referencia a una posición particular del arreglo.

Sistemas Operativos Tema 5. Procesos José Miguel Santos Alexis Quesada Francisco Santana

Tema 3. Programación orientada a objetos en Java (Parte 1)

Multiplicación de enteros Algoritmo clásico 1234*5678 = 1234* (5* *100+7*10+8) = 1234*5* *6* *7* *8 Operaciones bási

Tema 7: Polimorfismo. Índice

CLAVE ASIGNATURA REQUISITOS HORA/SEMANA CREDITOS TI-8 PROGRAMACION II 80% DE ASISTENCIA 4 6

Curso de Computación Científica en Clusters

DISEÑO CURRICULAR ALGORITMOS, ESTRUCTURAS Y PROGRAMACIÓN I

UNIDAD 1. NÚMEROS NATURALES Y OPERACIONES

MINI ENSAYO DE MATEMÁTICA Nº 1

en coma flotante Oliverio J. Santana Jaria Sistemas Digitales Ingeniería Técnica en Informática de Sistemas Curso

En este capitulo se estudiarán los conceptos relacionados a métodos, como lo son sobrecarga, métodos estáticos.

REPASO ARRAYS MULTIDIMENSIONALES EN JAVA. DECLARACIÓN Y USO. EJEMPLOS Y EJERCICIOS RESUELTOS. (CU00905C)

Algoritmos. Diseño de algoritmos por inducción. Alberto Valderruten. Dept. de Computación, Universidade da Coruña

CURSOSO. Aritmética: Númerosnaturalesyenteros. Númerosracionalesyfraciones. MATEMÁTICAS. AntonioF.CostaGonzález

Unidad 1. Las fracciones.

INTERFACES SET Y SORTEDSET DEL API DE JAVA. CLASES HASHSET Y TREESET. EJEMPLO. DIFERENCIAS ENTRE ELLAS. (CU00921C)

Tema 05: Tablas hash. M. en C. Edgardo Adrián Franco Martínez edgardoadrianfrancom

Indice del curso básico programación desde cero Visual Basic Nivel I (CU00302A)

Polinomios. 1.- Funciones cuadráticas

8. Vectores (arrays)

Prof. Dr. Paul Bustamante

FUNDAMENTOS DE INFORMÁTICA

MODELO DE CASCADA PURA. Son métodos que indican cómo hacer más eficiente el desarrollo de sistemas de

TEMA 2: Algoritmos y Programas. Fundamentos de Informática (Grados en Ingenierías Industriales)

CLASE DATE DEL API JAVA. MÉTODOS BEFORE, AFTER, TOLOCALESTRING, TOGMTSTRING Y GETTIME. EJEMPLOS. (CU00924C)

Tema: Clases y Objetos en C++. Parte II.

MANUAL DE EXCEL AVANZADO

Introducción Programación Modular y a Métodos: Consideremos el siguiente ejercicio:

GENERAR NÚMEROS ALEATORIOS EN JAVA. CLASE RANDOM Y MÉTODO NEXTINT. EJERCICIO EJEMPLO RESUELTO. (CU00672B)

SESIÓN 1 PRE-ALGEBRA, CONCEPTOS Y OPERACIONES ARITMÉTICAS BÁSICAS

Sistemas Operativos. (Procesos)

PROGRAMA DE CURSO. Horas Docencia Horas de Trabajo SCT. Obligatorio Plan Común

Forma Básica Clase Java

Grado en Química Bloque 1 Funciones de una variable

Diseño de compiladores Recordando la clase anterior

Modelo de Cómputo. Programación concurrente

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

PLANEACIÓN ESTRATÉGICA

Introducción al Testing de Estructural

Representación de decimales.

descripción del argumento identificador tipo longitud condición restricción

UNIDAD 1: NÚMEROS NATURALES

TEMA 10. EL CONJUNTO DE LOS NÚMEROS ENTEROS

INGENIERIA DE SISTEMAS 1 ESTRUCTURAS DE DATOS (Listas simples) INTRODUCCIÓN A LAS ESTRUCTURAS DE DATOS

Tema 4 Genericidad en Java. Programación Orientada a Objetos Curso 2013/2014

Sistemas Operativos. Clase 2: Administración de procesos.

PROGRAMACIÓN ALGORITMOS y DIAGRAMAS

Introducción a C# y la plataforma.net. Pablo Zaidenvoren 2013

ESCUELA DE INGENIERIA Informática Y Sistemas

Introducción. Reglas para dibujar un diagramas de flujo.

Introducción a MATLAB

Apuntes de Programación y estructuras de datos. Tipos de datos

3. Estructuras iterativas

SISTEMA DE NUMERACIÓN BINARIO

TEMA 1 FUNDAMENTOS DE PROGRAMACIÓN

EJERCICIOS DE PROGRAMACION EN LENGUAJE JAVA

TEMA 2: CICLO DE VIDA DEL SOFTWARE. Profesora: Elisa Herrmann

La ayuda y referencia de Visual Basic y otros recursos como herramientas para los programadores. (CU00306A)

Tema 4. Control de flujo. Programación Programación - Tema 4: Control de Flujo

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Programación I. Práctica parcial: el juego de los barquitos (ENTREGA OBLIGATORIA)

Introducción a Extreme Programming

1.2. Es Java un lenguaje ideal para aprender a programar? 1.4. Cuáles son las versiones y distribuciones Java y cuál usar?

TEORIA DE NUMEROS (I) REGLAS DE DIVISIBILIDAD

Introducción al análisis numérico

Un string nulo es aquél que no contiene caracteres, pero es un objeto de la clase String. Sin embargo,

2. Indica cuál de las siguientes afirmaciones es cierta:

+18 = =

CARTA DESCRIPTIVA (FORMATO MODELO EDUCATIVO UACJ VISIÓN 2020)

Introducción a C# y la plataforma.net

ÁREA DE INGENIERÍA QUÍMICA Prof. Isidoro García García. Operaciones Básicas de Transferencia de Materia. Tema 1

Tema 2. El lenguaje JAVA

CAPÍTULO II LA CADENA DE SUMINISTRO

Computación distribuida

Encapsulación: clases y objetos

Transcripción:

PROGRAMACIÓN CONCURRENTE TEMA 7 Diseño de algoritmos paralelos ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA DEPARTAMENTO DE CIENCIAS DE LA COMPUTACIÓN

DISEÑO DE ALGORITMOS PARALELOS - TEMA 7.2 Algoritmos sobre arrays ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA DEPARTAMENTO DE CIENCIAS DE LA COMPUTACIÓN

DISEÑO DE ALGORITMOS PARALELOS Algoritmos sobre arrays Introducción Suma Ordenación Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 3

ALGORITMOS SOBRE ARRAYS Introducción Los algoritmos más usados en la programación son aquellos que procesan arrays (o listas) de elementos En este tema se paralelizarán los algoritmos básicos sobre arrays: Suma Ordenación Búsqueda Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 4

DISEÑO DE ALGORITMOS PARALELOS Algoritmos sobre arrays Introducción Suma Ordenación Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 5

SUMA Algoritmo secuencial Se pretende sumar un array de números enteros de forma paralela El algoritmo secuencial es muy sencillo int[] valores = new int[1000]; int suma = 0; for(int i=0; i<valores.length; i++){ suma += valores[i]; System.out.println("Suma = "+suma); Al paralelizarse se pueden estudiar las bases para la paralelización de otros tipos de algoritmos más complejos Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 6

SUMA Algoritmo secuencial La operación de suma tiene las propiedades: Asociativa: Se pueden sumar dos operandos y el resultado sumarle a otro operando en cualquier orden Conmutativa: El orden de los operandos no afecta al resultado Cualquier operación con estas propiedades puede paralelizarse con el mismo esquema Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 7

SUMA Diseño del algoritmo paralelo La suma se puede paralelizar como un problema de descomposición de datos El conjunto de datos se puede dividir en chunks iguales y la computación es similar por cada elemento Esto permite hacer una asignación estática: Asignar a cada hilo una parte del array Cada hilo suma en una variable local y al terminar hace accesible el valor al hilo main El hilo main suma las sumas parciales de cada hilo Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 8

SUMA Implementación del algoritmo paralelo private double[] valores; private double[] sumacompar = new double[num_threads]; private void suma(int numthread) { int sumalocal = 0; for (int i = start; i < end; i++) { sumalocal += valores[i]; sumacompar[numthread] = sumalocal; private void inicializaarrayvalores() { valores = new double[num_vals]; for (int i = 0; i < NUM_VALS; i++) { valores[i] = i; Suma de los valores del chunk asignado a cada hilo Generación un array de ejemplo para probar la suma Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 9

SUMA Introducción inicializaarrayvalores(); Thread[] threads = new Thread[NUM_THREADS]; for (int i = 0; i < NUM_THREADS; i++) { final int numthread = i; Thread t = new Thread(()-> suma(numthread)); threads[i] = t; t.start(); Creación de hilos para que ejecuten el método suma( ) int suma = 0; for (int i = 0; i < NUM_THREADS; i++) { threads[i].join(); suma += sumacompar[i]; Espera por cada hilo y suma del valor que ha calculado para obtener la suma completa System.out.println("Suma de los elementos del array:"+suma); Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 10

SUMA Evaluación Eficiencia El cálculo de los límites del chunk es sobrecarga (código de coordinación incorporado al algoritmo secuencial) Esta paralelización tiene sentido si los chunks son lo suficientemente grandes para que ese tiempo sea despreciable Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 11

SUMA Evaluación Simplicidad Conceptualmente la paralelización es muy sencilla Hay mucho código nuevo porque: La librería Java es muy explícita en muchas operaciones (creación de hilo, espera para la terminación de varios, etc ) El código secuencial es muy sencillo Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 12

SUMA Evaluación Portabilidad Las ideas aplicadas se pueden usar en un modelo de paso de mensajes por el array compartido para las sumas de cada chunk se puede sustituir por el envío de la suma al proceso principal Escalabilidad El código escala bien con un mayor número de cores Si el chunk es demasiado pequeño, la sobrecarga de coordinar los hilos puede ser importante Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 13

DISEÑO DE ALGORITMOS PARALELOS Algoritmos sobre arrays Introducción Suma Ordenación Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 14

ALGORITMOS SOBRE ARRAYS Ordenación Existen muchos algoritmos para ordenar arrays de elementos Estudiaremos cómo paralelizar los dos más famosos: Burbuja: El más sencillo (aunque ineficiente) QuickSort: El más eficiente (aunque complejo) Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 15

ORDENACIÓN BURBUJA Algoritmo secuencial Se pretende ordenar un array de números enteros con el método de la burbuja Con este método se recorre el array verificando si cada par de elementos consecutivos están ordenados correctamente y si no es así, se intercambian entre sí Se realizan pasadas hasta que cada par de elementos consecutivos está ordenado Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 16

ORDENACIÓN BURBUJA Algoritmo secuencial for (int i = NUM_VALS - 1; i > 0; i--) { boolean intercambio = false; for (int j = 0; j < i; j++) { if (valores[j] > valores[j + 1]) { int temp = valores[j]; valores[j] = valores[j + 1]; valores[j + 1] = temp; intercambio = true; Se hacen tantas pasadas como elementos en el array. En cada pasada se omite un elemento porque se ordenó en la pasada anterior Si dos elementos adyacentes no están bien ordenados, se intercambian entre sí if(!intercambio){ break; Si en una pasada no se hace ningún intercambio, el array está ordenado Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 17

ORDENACIÓN BURBUJA Algoritmo secuencial int i = NUM_VALS; while (true) { i--; if (i <= 0) { break; Otra forma de escribir el algoritmo con un while(true) en vez de un for boolean intercambio = false; for (int j = 0; j < i; j++) { if (valores[j] > valores[j + 1]) { int temp = valores[j]; valores[j] = valores[j + 1]; valores[j + 1] = temp; intercambio = true; if (!intercambio) { break; Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 18

ORDENACIÓN BURBUJA Diseño del algoritmo paralelo Para paralelizar el algoritmo de la burbuja se pretende que varios hilos puedan realizar las pasadas sobre el array concurrentemente Sincronización entre hilos Si no hay sincronización, los hilos se pueden adelantar entre sí (provocando condiciones de carrera) Si se sincroniza cada par de elementos puede haber demasiada sobrecarga por esa sincronización Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 19

ORDENACIÓN BURBUJA Diseño del algoritmo paralelo Hay que sincronizar los hilos, pero no sincronizarlos en cada elemento Solución: Dividir el array en varias zonas iguales En cada zona sólo puede trabajar un hilo (poner las zonas bajo exclusión mutua) Para aprovechar los recursos y que todos los hilos puedan trabajar: crear más zonas que hilos Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 20

ORDENACIÓN BURBUJA Implementación del algoritmo paralelo int tamannozona = (NUM_VALS / NUM_ZONAS) + 1; while (!fin) { //Inicializado a false int numzona = 0; boolean intercambio = false; Cada zona está bajo EM. En la zona 0 se determina el último elemento a evaluar locks[numzona].lock(); int i = icompartido--;//inicializado a NUM_VALS-1 if (i <= 0) { fin = true; locks[numzona].unlock(); break; int finzona = tamannozona; for (int j = 0; j < i; j++) { if (valores[j] > valores[j + 1]) { int temp = valores[j]; valores[j] = valores[j + 1]; valores[j + 1] = temp; intercambio = true; if (j == finzona) { locks[numzona].unlock(); numzona++; locks[numzona].lock(); finzona += tamannozona; locks[numzona].unlock(); if (!intercambio) { fin = true; Variable global que cuenta las pasadas y guarda el último elemento que hay que evaluar El algoritmo finaliza cuando el último elemento a evaluar es 0 Al llegar al final de cada zona, se libera la EM y se pasa a la siguiente EM (que habrá liberado el hilo anterior) Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 21

ORDENACIÓN BURBUJA Evaluación Eficiencia El algoritmo original no es muy eficiente, y la versión paralela tampoco lo es porque comparte la misma esencia La paralelización impone bastante sobrecarga porque cada hilo, en cada pasada, debe entrar en la sección crítica de cada zona (y puede haber muchas pasadas) Simplicidad El código de separación en zonas dificulta la comprensión del algoritmo original Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 22

ORDENACIÓN BURBUJA Evaluación Portabilidad El algoritmo paralelo propuesto para memoria compartida no se puede usar en un modelo de paso de mensajes porque habría mucha información que enviar y recibir Escalabilidad Mayor número de hilos implica mas zonas y más sobrecarga en el acceso a cada una de ellas. Cuando el algoritmo avanza, las pasadas son más cortas (y tienen menos zonas) y muchos hilos no conseguiran una zona libre Tema 7.2 Diseño de algoritmos paralelos - Algoritmos sobre arrays 23