3 Fundamental Los Conceptos de Paralelo

19
3 Fundamental Los conceptos de paralelo Los discutidos en los capítulos anteriores, la programación paralela utiliza hilos para permitir que múltiples operaciones de proceder simultáneamente. El toda concepto de centros de programación en paralelo en el diseño, desarrollo, y el despliegue de hilos dentro de una aplicación y la coordinación entre los temas y sus respectivas operaciones. En este capítulo se examina cómo dividir las tareas de programación en trozos que son adecuados para enhebrar. A continuación, aplica estas técnicas al parecer serial problema de la difusión de errores. Diseñar para Temas Los desarrolladores que estén familiarizadas con la programación paralela en general sentirse cómodo con los modelos tradicionales de programación, tales como objetos programación orientada a objetos (POO). En este caso, un programa comienza en un definido punto, tales como el main () función, y funciona a través de una serie de tareas en la sucesión. Si el programa se basa en la interacción con el usuario, el principal instrumento de procesamiento es un bucle en el que se manejan los eventos de usuario. De permitido cada caso-un clic de botón, por ejemplo, el programa realiza una secuencia establecida de acciones que finalmente termina con una espera de la siguiente acción del usuario. En el diseño de este tipo de programas, los desarrolladores disfrutar de una relativamente simple programar mundo porque sólo una cosa que está sucediendo en un momento dado momento. Si las tareas del programa deben ser programadas de un modo específico, es porque el desarrollador impone un cierto orden en las actividades. En cualquier punto en el proceso, un paso generalmente fluye hacia la siguiente, que conduce a una conclusión previsible, sobre la base de parámetros predeterminados. Para pasar de este modelo lineal a un modelo de programación paralela, diseñadores deben repensar la idea de flujo del

Transcript of 3 Fundamental Los Conceptos de Paralelo

Page 1: 3 Fundamental Los Conceptos de Paralelo

3 Fundamental Los conceptos de paralelo

Los discutidos en los capítulos anteriores, la programación paralela utiliza hilos para permitir que múltiples operaciones de proceder simultáneamente. El todaconcepto de centros de programación en paralelo en el diseño, desarrollo, y el despliegue de hilos dentro de una aplicación y la coordinación entre los temas y sus respectivas operaciones. En este capítulo se examina cómo dividir las tareas de programación en trozos que son adecuados para enhebrar. A continuación, aplica estas técnicas al parecer serial problema de la difusión de errores.

Diseñar para TemasLos desarrolladores que estén familiarizadas con la programación paralela en general sentirse cómodo con los modelos tradicionales de programación, tales como objetos programación orientada a objetos (POO). En este caso, un programa comienza en un definido punto, tales como el main () función, y funciona a través de una serie de tareas en la sucesión. Si el programa se basa en la interacción con el usuario, el principal instrumento de procesamiento es un bucle en el que se manejan los eventos de usuario.  De permitido cada caso-un clic de botón, por ejemplo, el programa realiza una secuencia establecida de acciones que finalmente termina con una espera de la siguiente acción del usuario.En el diseño de este tipo de programas, los desarrolladores disfrutar de una relativamente simple programar mundo porque sólo una cosa que está sucediendo en un momento dado momento. Si las tareas del programa deben ser programadas de un modo específico, es porque el desarrollador impone un cierto orden en las actividades. En cualquier punto en el proceso, un paso generalmente fluye hacia la siguiente, que conduce a una conclusión previsible, sobre la base de parámetros predeterminados.Para pasar de este modelo lineal a un modelo de programación paralela, diseñadores deben repensar la idea de flujo del proceso. En lugar de ser limitada por una secuencia de ejecución secuencial, los programadores deben identificar las actividades que se pueden ejecutar en paralelo. Para ello, se hay que ver sus programas como un conjunto de tareas con dependencias entre ellos. Rompiendo programas hacia abajo en estas tareas individuales y la identificación de dependencias se conoce como descomposición. Un problema puede ser descompuesto en varias maneras: por tarea, por los datos, o por el flujo de datos. Tabla 3.1 resumen estas formas de descomposición. Como veréis en breve, estas diferentes formas de descomposición reflejan diferentes tipos de actividades de programación.

Tabla 3.1Resumen de las principales formas de descomposición

Page 2: 3 Fundamental Los Conceptos de Paralelo

La descomposición de tareasLa descomposición de un programa por las funciones que realiza la tarea se llama descomposición. Es una de las maneras más sencillas de lograr paralelo ejecución. Con este enfoque, las tareas individuales están catalogadas. Si dos de los que pueden ejecutarse simultáneamente, está previsto que se lo indique el desarrollador. Ejecución de tareas en paralelo de esta manera por lo general requiere una ligera modificaciones a las funciones individuales para evitar conflictos y para indican que estas tareas ya no son secuenciales.Si estuviéramos hablando de jardinería, la descomposición de tareas sugeriría que los jardineros pueden asignar las tareas basadas en la naturaleza de la actividad: si dos jardineros se dieron cita en la casa de un cliente, se podría cortar el césped, mientras que Por otro desmalezado. Siega y el deshierbe son funciones separadas rotos a cabo como tal. Para su cumplimiento, los jardineros se asegurarían de tener algún tipo de coordinación entre ellos, de modo que el herbicida no está sentado en el medio de un césped que necesita ser cortado.En términos de programación, un buen ejemplo de la descomposición de tareas es software de procesamiento de textos, como Microsoft Word. Cuando el usuario abre un documento de gran extensión, él o ella puede empezar a introducir texto a la derecha de distancia. Mientras que el usuario introduce texto, documento de paginación se produce en el fondo, como se puede ver fácilmente por el rápido aumento de recuento de páginas que aparece en la barra de estado. Introducción de texto y la paginación son dos separados tareas que sus programadores estallaron por la función para ejecutarse en paralelo. Tenía los programadores no están diseñados de esta forma, el usuario se verá obligado a esperar para todo el documento que se paginado antes de poder entrar en cualquier texto. Muchos de ustedes probablemente recuerdan que esta espera fue común en los principios Procesadores de texto de PC.

Descomposición de datos

Page 3: 3 Fundamental Los Conceptos de Paralelo

Descomposición de datos, también conocida como paralelismo de datos de nivel, se descompone tareas de los datos en los que trabajan en lugar de por la naturaleza de la tarea.Los programas que se descomponen a través de la descomposición de datos generalmente tienen muchos hilos que realizan el mismo trabajo, sólo en los diferentes elementos de datos. Para ejemplo, considere la posibilidad de volver a calcular los valores en una hoja de cálculo grande. Más bien que tiene un hilo de realizar todos los cálculos, la descomposición de datos sugeriría que tiene dos hilos, cada uno realizando los cálculos de media, o n subprocesos que realizan 1 / nª el trabajo.Si los jardineros utilizan el principio de la descomposición de datos para dividir su trabajo, sería tanto cortar la mitad de la propiedad y luego los dos malezas la mitad de las camas de flores. Al igual que en la informática, la determinación de qué tipo de descomposición es más eficaz depende mucho de las limitaciones de la sistema. Por ejemplo, si el área a cortar es tan pequeño que no necesita dos cortadoras, esa tarea se realiza mejor por un solo jardinero que es decir, la descomposición de tareas es la mejor opción, y la descomposición de datos podría aplicarse a otras secuencias de tareas, como por ejemplo cuando se hace el corte y los dos jardineros comienzan escarda en paralelo.A medida que el número de núcleos de procesador de descomposición aumenta, los datos permite que el tamaño del problema a ser aumentada. Esto permite más trabajo a hacerse en la misma cantidad de tiempo. Para ilustrar, considere el ejemplo la jardinería. Dos jardineros más se añaden al equipo de trabajo.En lugar de asignar los cuatro jardineros para una yarda, podemos podemos asignar los dos nuevos jardineros a otro patio, el aumento efectivo de nuestra tamaño total del problema. Suponiendo que los dos nuevos jardineros pueden realizar la misma cantidad de trabajo como los dos originales, y que los dos yardas tamaños son los mismos, hemos duplicado la cantidad de trabajo realizado en el mismo cantidad de tiempo

Datos de descomposición de flujoMuchas veces, cuando se descompone un problema, el problema fundamental no es lo tareas deben hacer el trabajo, pero la forma como fluye la información entre las diferentes tareas. En estos casos, la descomposición de flujo de datos se rompe por un problema cómo fluyen los datos entre las tareas.El problema del productor / consumidor es un ejemplo bien conocido de cómo los datos flujo afecta a una capacidad para ejecutar los programas en paralelo. Aquí, la salida de una tarea, el productor, se convierte en la entrada a otro, el consumidor. La dos tareas son realizadas por diferentes hilos, y la segunda, la de los consumidores, no se puede iniciar hasta que el productor termina una parte de su trabajo.Usando el ejemplo de la jardinería, un jardinero prepara las herramientas-queEs decir, se pone gas en la cortadora de césped, limpia las tijeras, y otras tareas similares tanto para los jardineros a utilizar. No jardinería puede ocurrir hasta que este paso es sobre todo terminado, momento en el cual puede comenzar el verdadero trabajo de jardinería. La retraso causado por la primera tarea crea una pausa para la segunda tarea, después de que ambas tareas se puede seguir de forma paralela. En términos informáticos, esta modelo en particular se produce con frecuencia.En las tareas de programación comunes, el problema del productor / consumidor ocurre en varios escenarios típicos. Por ejemplo, los programas que deben confiar en la lectura de un archivo de adaptarse a este escenario: los resultados del archivo se convierten de E / S la

Page 4: 3 Fundamental Los Conceptos de Paralelo

entrada a la siguiente etapa, que puede ser roscado. Sin embargo, ese paso no puede comenzar hasta que la lectura sea completa o ha progresado lo suficiente para que otro proceso para poner en marcha. Otro común ejemplo de programación está analizando: un archivo de entrada debe ser analizada o analizada semánticamente, antes de las actividades de back-end, como el código generación en un compilador, puede comenzar.El problema del productor / consumidor tiene varias dimensiones interesantes:La dependencia creada entre el consumidor y el productor puede causar retrasos significativos si este modelo no se ha implementado correctamente. Un diseño sensible al rendimiento busca entender la la naturaleza exacta de la dependencia y disminuir el retraso se impone. También tiene como objetivo evitar las situaciones en las que los consumidores hilos están al ralentí a la espera de las discusiones de productores.En el caso ideal, el hand-off entre el productor y consumidor esté completamente limpia, como en el ejemplo del archivo parser. La salida es independiente del contexto y el consumidor tiene sin necesidad de saber nada sobre el productor. Muchas veces,

Sin embargo, los componentes de productores y consumidores no disfrutan una división tan limpio del trabajo, y la programación de su interacción requiere una planificación cuidadosa.Si el consumidor está terminando, mientras que el productor es totalmente hecho, un hilo permanece inactivo mientras otros subprocesos están ocupados trabajar lejos. Esta cuestión viola un objetivo importante de el procesamiento en paralelo, que es el de equilibrar las cargas de manera que todos disponibles temas se mantienen ocupados. Debido a la relación lógica entre estos hilos, que puede ser muy difícil de mantener hilos igualmente ocupado.En la siguiente sección, vamos a echar un vistazo a este patrón se permite que desarrolladores para resolver el problema del productor / consumidor en un escalable la moda.

Implicaciones de diferentes descomposicionesDiferentes descomposiciones ofrecen diferentes beneficios. Si el objetivo, por ejemplo, está la facilidad de programación y tareas pueden ser claramente dividida por funcionalidad, a continuación, la descomposición de tareas es más a menudo que no es el ganador.Descomposición de datos añade algo de complejidad adicional a nivel de código para las tareas, por lo que se reserva para los casos en que los datos se divide con facilidad y el rendimiento es importante.La razón más común para enhebrar una aplicación es rendimiento. Y en este caso, la elección de descomposiciones es más difícil. En muchos casos, la elección está dictada por el problemaDominio: algunas tareas son mucho más adecuado para un tipo de descomposición.Pero algunas de las tareas no tienen claro sesgo. Consideremos, por ejemplo, el procesamiento imágenes en una secuencia de vídeo. En formatos con ninguna dependencia entre marcos, tendrá la opción de descomposición. En caso de que elija la tarea descomposición, en el que un hilo hace decodificación, otro color equilibrio, y así sucesivamente, o la descomposición de datos, en la que cada hilo hace todo el trabajo en un fotograma y luego se mueve a la siguiente? Para volver a la la analogía de los jardineros, la decisión tomaría esta forma: Si dos jardineros tienen que cortar dos zonas de césped y malezas dos parterres, cómo en caso de que proceda? Si una jardinera sólo pode-es decir,

Page 5: 3 Fundamental Los Conceptos de Paralelo

que seleccione la tarea basada en la descomposición o deben cortar los dos jardineros juntos entonces malezas juntos?

En algunos casos, la respuesta surge rápidamente-por ejemplo, cuando un existe restricción de recursos, como un solo corte. En otros, donde cada jardinero tiene una cortadora, la respuesta viene sólo a través de una cuidadosa análisis de las actividades que lo componen. En el caso de los jardineros, tarea descomposición se ve mejor porque el tiempo de puesta en marcha para la siega es salvado si sólo una segadora está en uso.  En última instancia, determina el derecho responder por el uso de la aplicación de la programación paralela de cuidado planificación y ensayo. El momento y la evaluación empírica juega un más papel importante en las decisiones de diseño que realice en la programación paralela que lo hace en la programación de un solo subproceso estándar.

Desafíos que enfrentaráEl uso de hilos que permite mejorar notablemente el rendimiento permitir que dos o más de las actividades se produzcan simultáneamente. Sin embargo, los desarrolladores no pueden dejar de reconocer que los hilos añaden una medida de complejidad que requiere una consideración cuidadosa para navegar correctamente.Esta complejidad se debe al hecho inherente de que más de una actividad que está ocurriendo en el programa. Gestión de actividades y sus simultáneas posible interacción que conduce a enfrentar cuatro tipos de problemas:La sincronización es el proceso por el cual dos o más hilos coordinar sus actividades. Por ejemplo, un hilo espera otra para terminar una tarea antes de continuar.La comunicación se refiere a los problemas de ancho de banda y la latencia asociado con el intercambio de datos entre los hilos.El equilibrio de carga se refiere a la distribución del trabajo a través de múltiples hilos de manera que todos ellos realizan más o menos la misma cantidad de trabajar.La escalabilidad es el reto de hacer un uso eficiente de un mayor número de hilos cuando el software se ejecuta en más apto sistemas. Por ejemplo, si un programa está escrito para hacer un buen uso de cuatro núcleos de procesador, que se escala correctamente cuando se ejecuta en un sistema con ocho núcleos de procesador?Cada uno de estos temas se deben manejar con cuidado para maximizar la aplicación rendimiento. Los capítulos siguientes describen muchos aspectos de estos problemas y la mejor manera de hacerles frente para sistemas multi-core.

Paralelo Programación de patronesDurante años, los programadores orientados a objetos han estado utilizando patrones de diseño para diseñar lógicamente sus aplicaciones. Programación paralela no es diferente de los problemas de programación de programación paralelos orientados a objetos generalmente se dividen en uno de varios patrones bien conocidos. Algunos de los más

Page 6: 3 Fundamental Los Conceptos de Paralelo

patrones comunes de programación en paralelo y su relación con la descomposiciones antes mencionados se muestran en la Tabla 3.2.

Tabla 3.2Patrones comunes de programación paralelaPatrónDescomposiciónParalelismo de tareas a nivel deTareaDivide y vencerásTarea / DatosGeometric Data descomposiciónTuberíaFlujo de datosWavefrontFlujo de datos

En esta sección, vamos a dar una breve descripción de cada patrón y el tipos de problemas que cada patrón se puede aplicar a. Patrón Paralelismo de tareas de nivel superior. En muchos casos, la mejor manera de ejecución paralela lograr es centrarse directamente en las tareas a sí mismos. En este caso, el patrón de paralelismo a nivel de tarea hace tiene más sentido. En este patrón, el problema se descompone en un conjunto de tareas que operan de forma independiente. A menudo es necesario eliminar las dependencias entre las tareas o dependencias separadas mediante la replicación. Problemas que se ajustan a este patrón incluyen la los llamados problemas embarazosamente paralelos, aquellos donde no hay dependencias entre temas y datos replicados problemas, aquellos en los que las dependencias entre los hilos puede ser eliminado de los hilos individuales.Divide y vencerás Patrón. En el patrón de división y conquista, el problema se divide en un número de sub-paralelo problemas.Cada sub-problema se resuelve de forma independiente. Una vez que cada sub-problema se resuelve, los resultados se agregan en la final solución. Dado que cada sub-problema puede ser resuelto de forma independiente, estos sub-problemas se pueden ejecutar de forma paralela. El divide y vencerás es ampliamente utilizado en la secuencia algoritmos como una especie de combinación. Estos algoritmos son muy fáciles de paralelizar. Este patrón general hace un buen trabajo de la carga equilibrar y presenta una buena localidad; que es importante para los uso de la caché eficaz.Patrón de descomposición geométrica. La descomposición geométrica patrón ción se basa en la paralelización de las estructuras de datos utilizado en el problema a resolver. En la descomposición geométrica, cada hilo es responsable de operar en "trozos" de datos. Este patrón puede aplicarse a problemas tales como el flujo de calor y de las olas propagación. Patrón Pipeline. La idea detrás de este patrón se es idéntico a la de una línea de montaje. La manera de encontrar la concurrencia aquí es para romper el cálculo en una serie de etapas y tienen cada obra rosca en un escenario diferente al mismo tiempo.

Page 7: 3 Fundamental Los Conceptos de Paralelo

Wavefront Patrón. El patrón de frente de onda es útil cuando el procesamiento de elementos de datos a lo largo de una diagonal en una de dos dimensiones rejilla. Esto se muestra en la Figura 3.1

Los números en la Figura 3.1 ilustran el orden en que los datos elementos se procesan.  Por ejemplo, los elementos en la diagonal que contiene el número "3" son dependientes de elementos de datos "1" y "2" en trámite con anterioridad. Los datos sombreadas elementos en la figura 3.1 indican los datos que ya ha sido procesada. En este patrón, es crítico para reducir al mínimo el tiempo de inactividad dedicado por cada hilo. El balanceo de carga es la clave del éxito de este patrón.Para una mirada más amplia y profunda en el diseño de la programación paralela patrones, consulte el libro de Patrones de Programación Paralela (Mattson2004).

Un problema Motivar: Difusión de errorPara ver cómo se puede aplicar los métodos antes mencionados a una práctica problema de computación, considerar el algoritmo de difusión de error que se utiliza en muchos gráficos por ordenador y los programas de procesamiento de imágenes. Originalmente propuesto por Floyd y Steinberg (Floyd 1975), difusión de errores es una técnica para la visualización de imágenes digitales de tono continuo en los dispositivos que tienen limitada gama de colores (tonos). Impresión de 8 bits en escala de grises en la imagen para una impresora negro y blanco es problemático. La impresora, que es un nivel de bi dispositivo, no se puede imprimir la imagen de 8 bits de forma nativa. Se debe simular múltiples tonos de gris mediante el uso de una técnica de aproximación. Un ejemplo de un imagen antes y después del proceso de difusión de error se muestra en la Figura 3.2.La imagen original, compuesto por 8 bits en escala de grises píxeles, se muestra en la a la izquierda, y el resultado de la imagen que ha sido procesado utilizando el error algoritmo de difusión se muestra a la derecha. La imagen de salida se compone de píxeles de sólo dos colores: blanco y negro.

Page 8: 3 Fundamental Los Conceptos de Paralelo

Imagen de 8 bits original en la imagen de 2 bits a la izquierda, resultante a la derecha.  En la resolución de esta publicación, se ven similares.

Las mismas imágenes que el anterior, pero ampliada al 400 por ciento y recortar un 25 por ciento para mostrar los detalles de píxeles. Ahora se puede ver claramente la prestación negro-blanco de 2 bits en el derecho y de 8 bits en escala de grises a la izquierda.Figura 3.2 Difusión de error de salida Algoritmo

El algoritmo básico de difusión de error hace su trabajo de una forma sencilla de tres paso del proceso:1. Determinar el valor de salida dado el valor de entrada de la corriente píxel. Este paso a menudo utiliza cuantificación, o en el caso binario, umbralización. Para un niño de 8 bits en escala de grises que se muestra en un 1 bit dispositivo de salida, todos los valores de entrada en el rango [0, 127] son para ser se muestra como un 0 y todos los valores de entrada entre [128, 255] están a se mostrará como 1 en el dispositivo de salida.2. Una vez que se determina el valor de salida, el código calcula la error entre lo que se debe mostrar en el dispositivo de salida y lo que realmente se muestra. Como ejemplo, suponer que el valor de píxel de entrada actual es 168. Dado que es más grande que nuestro valor de umbral (128), que determina que el valor de salida será un 1. Este valor se almacena en la matriz de salida. Para calcular el error, el programa debe normalizar la primera salida, por lo que es en el misma escala que el valor de entrada.  Es decir, para los fines de calcular el error de la exhibición, el píxel de salida debe ser 0 si el píxel de salida

Page 9: 3 Fundamental Los Conceptos de Paralelo

es 0 o 255 si el píxel de salida es 1. En este caso, la Indicador de error es la diferencia entre el valor real que debería haber sido visualizado (168) y el valor de salida (255), que es -87.3. Por último, el valor de error se distribuye sobre una base fraccional a la píxeles vecinos de la región, como se muestra en la Figura 3.3.

Figura 3.3Distribución de valores de error de píxeles vecinosEste ejemplo utiliza las ponderaciones de error Floyd-Steinberg se propaguen errores a los píxeles vecinos. 7/16ths del error se calcula y se añaden al píxel a la derecha del píxel actual que se está procesando.5/16ths del error se añade al píxel en la fila siguiente, directamente debajo el píxel actual. Los errores restantes se propagan de una manera similar.Aunque se pueden utilizar otros sistemas de ponderación de error, todo error de difusión algoritmos siguen este método general.El proceso de tres pasos se aplica a todos los píxeles de la imagen. Ficha 3.1 muestra una implementación sencilla C del algoritmo de difusión de error, utilizandoFloyd-Steinberg error pesos.

/ *************************************** La implementación inicial del algoritmo de difusión de error.*************************************** /void error_diffusion (ancho entero sin signo,Altura int sin firmar,unsigned short ** InputImage,unsigned short ** OutputImage){por (unsigned int i = 0; i <altura, i + +){por (unsigned int j = 0; j <ancho; j + +){/ * 1. Calcular el valor del píxel de salida * /if (InputImage [i] [j] <128)OutputImage [i] [j] = 0;másOutputImage [i] [j] = 1;

Page 10: 3 Fundamental Los Conceptos de Paralelo

/ * 2. Calcular el valor de error * /int err = InputImage [i] [j] - 255 * OutputImage [i] [j];/ * 3. Distribuya el error * /InputImage [i] [j +1] + = err * 7/16;InputImage [i +1] [j-1] + = err * 3/16;InputImage [i +1] [j] + = err * 5/16;InputImage [i +1] [j +1] + = err * 1/16;}}}Ficha 3.1Implementación en lenguaje C del algoritmo de difusión de error

Análisis de la difusión de error AlgoritmoA primera vista, se podría pensar que el algoritmo de difusión de error es un inherentemente proceso en serie. El enfoque convencional distribuye a errores los píxeles ya que se calculan. Como resultado, el píxel anterior es error debe ser conocido con el fin de calcular el valor de la siguiente píxel. Esta interdependencia implica que el código sólo puede procesar un píxel la vez. No es tan difícil, sin embargo, para abordar este problema de una manera que es más adecuado para un enfoque multiproceso.Un enfoque alternativo: Parallel Difusión de erroresPara transformar el algoritmo convencional de difusión de error en un enfoque que es más propicio a una solución paralela, considere las diferentes descomposición que anteriormente estaban cubiertas en este capítulo. Que sería apropiado en este caso? Como sugerencia, considere la Figura 3.4, que revisita la distribución de error se ilustra en la Figura 3.3, a partir de un poco diferentes perspectivas.

Figura 3.4Error-Difusión de errores Cálculo del pixel recepción dePerspectivaTeniendo en cuenta que un píxel no se puede procesar hasta que sus predecesores espaciales han sido procesados, el problema parece prestarse a un enfoque donde tenemos un productor-o en este caso, varios productores- producción de datos (valores de error) que un consumidor (el píxel actual) utilizar para calcular el píxel de salida adecuada. El flujo de datos de error a la píxel actual es crítica. Por lo tanto, el problema parece romper en una descomposición de flujo de datos.

Ahora que hemos identificado el enfoque, el siguiente paso es determinar la mejor patrón que se puede aplicar a este problema en particular. Cada hilo de ejecución independiente debe procesar una cantidad igual de trabajo(Equilibrio de carga). ¿Cómo debe dividirse el trabajo? Una forma, sobre la base de el algoritmo presentado en la sección anterior, sería tener un hilo que procesan los píxeles incluso en una fila determinada, y otro hilo que procesar los píxeles impares en la misma fila. Este enfoque es ineficaz

Page 11: 3 Fundamental Los Conceptos de Paralelo

Sin embargo, cada hilo se bloquea esperando que el otro para completar, y el rendimiento podría ser peor que en el caso secuencial.Para subdividir eficaz la labor de los temas, necesitamos una manera de reducir (o, idealmente, eliminar) la dependencia entre píxeles. Figura 3.4 ilustra un punto importante que no es obvio en la Figura 3.3-que enPara que un píxel sea capaz de ser procesado, debe tener error de tres valores (con la etiqueta eA, eB, y la CE 1En la Figura 3.3) de la fila anterior, y un valor de error desde el píxel que está inmediatamente a la izquierda en la actual fila. Por lo tanto, una vez que estos píxeles se procesan, el píxel actual pueden completar su procesamiento. Este orden sugiere una implementación donde cada hilo procesa una fila de datos. Una vez que una fila ha completado procesamiento de los primeros pocos píxeles, el hilo responsables de la siguiente fila puede comenzar su tratamiento. La figura 3.5 muestra esta secuencia.

Múltiples hilos son capaces de procesar múltiples filas simultáneamente.Figura 3.5Difusión de errores en paralelo para Multi-thread, Situación Multi-fila

1Suponemos eA = eD = 0 en el borde izquierdo de la página (para los píxeles en la columna 0), y que eC = 0 en el borde derecho de la página (para los píxeles en la columna W-1, donde W = el número de píxeles en la imagen).

Observe que una pequeña latencia se produce al comienzo de cada fila. Este latencia se debe al hecho de que los datos de error de la fila anterior deben ser calculado antes de la fila actual se puede procesar. Estos tipos de latencia es generalmente inevitable en las implementaciones de productores y consumidores;Sin embargo, se puede minimizar el impacto de la latencia como se muestra aquí.El truco consiste en derivar la carga de trabajo de particionado apropiado para que cada hilo de ejecución funciona tan eficientemente como sea posible. En este caso, incurrir en una latencia de dos píxeles antes de que pueda comenzar el proceso de la siguiente conversación.Una página 8.5 "X 11", suponiendo 1.200 puntos por pulgada (dpi), tendría10.200 píxeles por fila. La latencia de dos píxeles es insignificante aquí.La secuencia en la Figura 3.5 ilustra el flujo de datos común a la patrón de frente de onda.Otras alternativas

Page 12: 3 Fundamental Los Conceptos de Paralelo

En la sección anterior, hemos propuesto un método de difusión de errores que cada hilo procesa una fila de datos a la vez. Sin embargo, se podría considerar la subdivisión del trabajo a un nivel más alto de granularidad.Instintivamente, al particionar trabajo entre hilos, uno tiende a mirar para tareas independientes. La forma más sencilla de paralelización de este problema sería para procesar cada página por separado. En términos generales, cada página sería un conjunto de datos independientes, y por lo tanto, no se tiene ningún interdependencias. Entonces, ¿por qué nos proponemos en lugar de una solución basada en filas de procesamiento de páginas individuales? Las tres razones principales son:Una imagen puede ocupar varias páginas. Esta aplicación sería imponer una restricción de una imagen por página, lo que podría o no ser adecuado para la aplicación dada.El aumento de uso de memoria. Un 8,5 x Página 11 pulgadas a 1.200 dpi consume 131 MB de RAM. Los resultados intermedios deben estar guarda, por lo tanto, este enfoque sería menos eficiente de la memoria.Una aplicación puede, en un caso de uso común, imprimir sólo una de una sola página a la vez. subdividir el problema en el nivel de página ofrecería ninguna mejora en el rendimiento de la secuencia caso.Un enfoque híbrido sería la de subdividir las páginas y regiones de procesos de una página en un hilo, como se ilustra en la Figura 3.6.

Varios subprocesos de procesamiento de múltiples secciones de páginaFigura 3.6Difusión de errores en paralelo para Multi-thread, Situación Multi-páginaTenga en cuenta que cada hilo tiene que trabajar en las secciones de página diferente.Esto aumenta la latencia de inicio implicados antes de que puedan comenzar las discusiones trabajar. En la Figura 3.6, Tema 2 incurre en un 1/3 de la página de inicio de latencia antes de que puede empezar a procesar los datos, mientras que el hilo 3 incurre un inicio 2/3 página latencia. Aunque algo mejorado, el enfoque híbrido sufre limitaciones similares a las del esquema de partición basado en páginas describen anteriormente. Para evitar estas limitaciones, usted debe centrarse en la base de la fila aplicación de difusión de error se ilustra en la Figura 3.5.Puntos claveEste capítulo explora los diferentes tipos de arquitecturas de computadora y cómo que permiten el desarrollo de software paralelo. Los puntos clave a tener enmente al desarrollo de soluciones para las arquitecturas de computación en paralelo son:Descomposiciones caen en una de tres categorías: tareas, datos y flujo de datos.Particiones paralelismo de tareas a nivel de los trabajos entre los hilos base en las tareas. Datos rompe descomposición las tareas basadas en los datos que el Temas trabajar.

Descomposición de flujo de datos se desglosa el problema en términos de cómo fluyen los datos entre las tareas.La mayoría de los problemas de programación paralelos caen en uno de varios bien patrones conocidos. Las restricciones de sincronización, comunicación, equilibrio de carga, escalabilidad y debe ser tratado de obtener el mayor beneficio de un programa paralelo.

Page 13: 3 Fundamental Los Conceptos de Paralelo

Muchos de los problemas que parecen ser de mayo de serie, a través de un sencillo transformación, se adaptará a una aplicación paralela.