Está en la página 1de 2

Importancia de la programación paralela

Cuando se habla con alguna gente acerca de las mejoras para la programación en
paralelo, lo ven como una mera anécdota, algo que no va con ellos en absoluto. Si bien es
cierto que muchas aplicaciones que se hacen, como las de gestión por ejemplo, no suelen
sacarle partido, no es menos cierto que en muchas circunstancias nuestras aplicaciones
deben poder sacarle el máximo rendimiento al hardware del que disponemos.

Desde hace unos años lo más habitual en cualquier ordenador corriente es que
disponga de un procesador con al menos dos núcleos. En servidores o máquinas destinadas
a tareas más demandantes es muy frecuente que haya varios procesadores con al menos
cuatro núcleos. La tendencia es que cada vez haya más núcleos en los procesadores, ya
no sólo por rendimiento sino por las ventajas en cuanto a ahorro de energía, temperatura y
las limitaciones existentes en cuanto a aumentar la velocidad de frecuencia de reloj. Esto
implica que casi cualquier aplicación pueda trabajar en entornos con múltiples núcleos, lo
que hace realmente importante sacarle partido a la programación multi-subproceso.

Anteriormente, y aquí viene lo importante, para aumentar el rendimiento de una


aplicación bastaba con moverla a una máquina con un procesador más rápido. Sin embargo,
hoy en día esto ya no vale, pues el rendimiento se obtiene a través de sacarle partido a
más núcleos y no aumentando la velocidad. Así que la conclusión es que si queremos que
una aplicación llegue a ser escalable ésta debe sacar partido a múltiples hilos de ejecución
y, por lo tanto, a múltiples nodos de procesamiento.

Figura 1. Diagrama de bloques general de paralelismo.


¿Se ve entonces la importancia?

Este tipo de programación paralela siempre ha sido muy compleja, sobre todo a la
hora de depurar aplicaciones en las que existen muchas probabilidades de generar
interbloqueos o “race conditions”. En su momento, con .NET 4.0 y Visual Studio 2010 se
incluyeron nuevas bibliotecas, tipos y herramientas para facilitar la programación multi-
núcleo, área de suma importancia para los programadores.

Desde .NET 4.0 disponemos de lo que se ha bautizado como “Parallel Extensions” que
están formadas por tres componentes:

 La biblioteca de tareas paralelas (TPL, Task Parallel Library): esta biblioteca


dentro del espacio de nombres System.Threading.Taks.Parallel incluye
construcciones para ejecutar tareas repetitivas independientes entre sí en paralelo y
de forma automática, como por ejemplo versiones paralelas de los bucles For y
ForEach.
 El motor de ejecución paralela de Linq (PLINQ Execution Engine): como se
desprende de su nombre, se trata de una versión paralelizada de Linq to Objects, que
nos permite lanzar consultas integradas en el lenguaje aprovechando la capacidad de
paralelismo del sistema.
 Las estructuras de datos para coordinación (CDS, Coordination data
Structures): ofrece un conjunto de primitivas de sincronización y de colecciones
preparadas para multisubproceso (thread-safe) que simplifican los escenarios
paralelizados. Por ejemplo, tenemos diccionarios, pilas y colas thread-safe, y
objetos especiales para sincronización de hilos como el SpinWait o el SpinLock.