# Paralelismo (informática)

En la informática, el paralelismo es la simple aplicación de múltiples CPU a un problema único. Se trata de un concepto intuitivo y atractivo. Considérese un problema científico o de ingeniería computacional en el que se ha estado trabajando. Si ejecutarlo en una sola CPU da como resultado 10 horas, ¿por qué no usar 10 CPU y obtener los resultados después de solo una hora? Para la ciencia computacional, supera algunas de las limitaciones impuestas por las computadoras con una sola CPU, pudiendo resolver problemas más grandes y complejos cuyos datos de entrada o resultados intermedios superan la capacidad de memoria de una CPU. De esta forma, las simulaciones se pueden ejecutar con una resolución más doña fina y un fenómeno físico se puede modelar de manera más realista.
En la práctica, el paralelismo tiene un precio elevado. En los procesos paralelos, la gramática implica una curva de aprendizaje pronunciada, además de un esfuerzo intensivo; el programador debe pensar en la aplicación de nuevas formas y puede terminar reescribiendo prácticamente todo el código. El entorno de ejecución de una computadora paralela es inherentemente inestable e impredecible. Las técnicas para depurar y ajustar el rendimiento de los programas en serie no se extienden fácilmente al mundo paralelo. Es posible trabajar meses en la paralelización de una aplicación sólo para descubrir que produce resultados incorrectos o que funciona más lento que antes.
El paralelismo es una forma de computación en la cual varios cálculos pueden realizarse simultáneamente, basado en el principio de dividir los problemas grandes para obtener varios problemas pequeños, que son posteriormente solucionados en paralelo. Hay varios tipos diferentes de paralelismo: nivel de bit, nivel de instrucción, de datos y de tarea. El paralelismo ha sido empleado durante muchos años, sobre todo para la Computación de alto rendimiento.

## Condiciones previas para el paralelismo

Existen tres factores que establecen los objetivos de rendimiento de la aplicación. Primero, ¿con qué frecuencia se utilizará la aplicación antes de que se necesiten cambios? Si la respuesta es miles de veces entre revisiones, esta es una aplicación altamente productiva que probablemente requiera esfuerzo significativo del programador para mejorar su rendimiento.
El segundo factor es el tiempo que se necesita actualmente para ejecutar la aplicación. Supongamos que se esperan días para obtener los resultados, reducir ese tiempo a una fracción puede mejorar su productividad significativamente. Por el contrario, si se puede medir el tiempo de ejecución en minutos es poco probable que se esté satisfecho con la recompensa en términos de mejora del rendimiento y esfuerzo requerido. Tenga en cuenta que estas son medidas relativas, si su aplicación es un servicio de emergencia en tiempo real como un sistema de gestión, incluso unos pocos segundos de mejora podrían ser significativos.
En tercer lugar, ¿en qué medida está satisfecho con la resolución actual o la complejidad de los resultados? Si la velocidad o la capacidad de memoria de las computadoras limita a una cuadrícula cuyas unidades son mucho más toscas de lo que se quiere, digamos, se representan enviando la superficie del océano en unidades de 10 grados cuando lo que realmente se necesita es una granularidad de 2 grados, el paralelismo puede ser la única manera factible de romper esa restricción.

## Aplicaciones

Como la computación paralela se vuelve cada día más grande y rápida, muchos problemas considerados anteriormente muy largos y costosos se han podido solucionar. El paralelismo se ha utilizado para muchas temáticas diferentes, desde bioinformática (para hacer plegamiento de proteínas) hasta economía (para hacer simulaciones en el ámbito financiero). Los problemas típicos encontrados en el paralelismo son:
* Simulación de Montecarlo
* Lógica combinacional (como las técnicas de fuerza bruta)
* Graph traversal
* Programación dinámica
* Métodos de ramificación y poda
* Modelo en grafo
* Simulación de autómata finito

## Aplicación de las reglas generales: tres casos de estudio

* La paralelización en la renderización de una imagen se lleva 150 horas de tiempo de computadota necesarias por cada 1000 pasos ocupando un gigabyte o más de espacio en disco.
* El primer caso de estudio fue un éxito ya que se presentaron mejoras en el rendimiento general siendo ahora 116 horas para 1800 pasos de tiempo, pero cambió el cuello de botella de rendiminto a la fase de renderizado.
* Dado que la fase de renderizado se había mantenido independiente de la simulación en sí podría usarse para renderizar otro tipo de imágenes, esto se hizo para ver cuánto rendimiento se puede exigir desde el renderizado a través del paralelismo.
Un sistema de memoria compartida vuelve indicando la preferencia, pero con la memoria distribuida del sistema podría funcionar, dando suficientes cálculos entre interacciones de la CPU. Entonces ahora toda la fase de renderizado consume sólo 71 segundos: 6 para configuración e inicialización, 47 para el cálculo de rayos, 13 para trazar y 5 para escribir la salida.
Claramente las reglas generales indican que la paralelización no garantiza, dado que la intención del caso del mundo real fue para empujar los límites del rendimiento. Al canalizar el casting de rayos y trazar cálculos, es posible reducir el tiempo de ejecución en unos pocos segundos por imagen, sin embargo, la cantidad de esfuerzo requerido fue sustancial.

## SIMD

Los multiordenadores SIMD, también llamados matriz de procesadores, son máquinas muy fáciles de programar. Ofrecen la oportunidad de utilizar su memoria de una manera eficiente.

## Problemas de rendimiento

Uno de los problemas de rendimiento está relacionado con la pérdida o desperdicio del esfuerzo de la CPU. Cuando una operación es condicional, por poner un ejemplo, donde se tenga que dividir el vector A por el vector B, únicamente donde el elemento B es distinto a cero, todas las CPU realizan la operación y los resultados se descartan de cualquiera de los CPU donde la condición es falsa. La condición representa una serie de cuello de botella, ya que la máquina tiene varios CPU, de los cuales solo algunos pueden contrarrestar todas las ganancias de rendimiento obtenidas por arreglo de operaciones.