A pensar en paralelización: Parallel Extensions

por Gustavo Lombardo  29. julio 2010

Si deseamos que nuestro software siga beneficiándose de las capacidades futuras de hoy y mañana de los procesadores debemos empezar a cambiar nuestra manera de desarrollar. La razón de esto es que las aplicaciones de negocio van tener que ejecutarse en máquinas multi-core o con varios procesadores. Hasta hace pocos años una máquina con varios procesadores estaba prácticamente reservada a la supercomputación, pero hoy en día ya son comunes en cualquier PC de escritorio.

La programación concurrente y el paralelismo no son una materia trivial, la sincronización entre procesos no lo es y dividir el trabajo, asignarlo a varios procesadores, recoger los resultados y mezclarlos para reconstruir la solución final tampoco.

En el pasado, la paralelización requería manipulación de bajo nivel de los subprocesos y bloqueos. Hoy en día, los desarrolladores no tendrían que luchar contra esta complejidad, porque sería dar un paso atrás en productividad. Su tarea es seguir dedicando sus esfuerzos a lo que mejor saben hacer que es desarrollar aplicaciones de alto nivel que resuelven problemas de negocio sin controlar la ejecución concurrente de sus procesos.

Para ello, debemos acostumbrarnos a usar el término task en lugar del thread como seguramente la mayoría de nosotros veníamos haciendo y aprovechar las nuevas capacidades que ofrece las APIs de .NET Framework 4, así como también las del Visual Studio 2010.

.NET Framework 4, proporciona un nuevo runtime, nuevos tipos de biblioteca de clases y nuevas herramientas de diagnóstico para la programación paralela y concurrente. Es aquí donde hace su aparición Parallel Extensions, simplificando el desarrollo en paralelo, de modo de poder escribir código paralelo eficaz, específico y escalable de forma natural sin tener que trabajar directamente con subprocesos. Sin embargo, no todo código se presta para la paralelización por ejemplo, si un bucle realiza solo una cantidad reducida de trabajo en cada iteración o no se ejecuta para un gran número de iteraciones, la sobrecarga de la paralelización puede dar lugar a una ejecución más lenta del código. Además, al igual que cualquier código multiproceso, la paralelización hace que la ejecución del programa sea más compleja.

Parallel Extensions se compone de dos partes: Parallel Linq (PLINQ) y Task Parallel Library (TPL). También consta de un conjunto de estructuras de datos de coordinación (CDS) utilizada para sincronizar y coordinar la ejecución de tareas concurrentes. La siguiente ilustración proporciona información general de alto nivel de la arquitectura de programación paralela en .NET Framework 4.

IC389193

A continuación explicaré cada uno de sus componentes. PLINQ implementa el conjunto completo de operadores de consulta estándar de LINQ  e incluye otros adicionales para las operaciones paralelas. Combina la simplicidad y legibilidad de la sintaxis de LINQ con la eficacia de la programación paralela. En muchos escenarios, PLINQ puede aumentar significativamente la velocidad de las consultas LINQ  to Objects utilizando todos los núcleos disponibles en el equipo host de una forma más eficaz. Para hacer esto divide el origen de datos en segmentos y, a continuación, ejecuta la consulta en cada segmento en subprocesos de trabajo independientes en paralelo en varios procesadores. La clase System.Linq.ParallelEnumerable expone casi toda la funcionalidad de PLINQ.  Les mostraré un ejemplo en el que invoco el método de extensión ParallelEnumerableAsParallel() para indicarle que la query debe ejecutarse en forma paralela.

for (var i = 0; i < data.Length; i++)
{
    data[i] = i;
}
 
data[1000] = -1;
data[14000] = -2;
data[15000] = -3;
data[676000] = -4;
data[8024540] = -5;
data[9908000] = -6;
 
var negativos = from valor in data.AsParallel()
                where valor < 0
                select valor;

 

Al ejecutarse la query en paralelo los resultados de cada subproceso de trabajo deben volver a combinarse en el subproceso principal por ejemplo para la inserción en una lista. El tipo de combinación que  PLINQ realiza depende de los operadores que se encuentran en la consulta. Con el método WithParallelMergeOptions(), puede indicarse a PLINQ una sugerencia de que tipo de combinación se va a realizar.

La biblioteca TPL es un conjunto de API que tiene como propósito lograr que los desarrolladores aumenten la productividad simplificando el proceso de agregar paralelismo y simultaneidad a las aplicaciones, utilizando eficazmente todos los procesadores que están disponibles. Además, se encarga de la división del trabajo, la programación de los subprocesos y otros detalles de bajo nivel.

El concepto principal de Parallel Extensions es una tarea, que es una pequeña unidad de código, de forma independiente. Se encarga de dividir el trabajo y lanzar un número óptimo de threads basándose en el número de CPUs o cores que tenemos.

Yendo aun mas allá, sin llegar al nivel de granularidad de una task, podemos trabajar a más alto nivel aún con la clase estática Parallel y escribir código como el siguiente:

static void Main()
{
    Parallel.For(from, to, i=> )
    {
    });
}
 

Mediante un ciclo como el anterior, dejamos que el runtime de Parallel Extensions se encargue de paralelizar el trabajo creando las tasks y encargándose de  todo el proceso. A continuación les mostraré las mejoras de rendimiento al paralelizar un programa muy sencillo. El método SumaRaicesNesimaDeX devuelve la suma de las raíces n-énesima de todos los enteros entre 1 y un 10 millones donde n es una variable recibida como parámetro. La forma de resolución de la raíz contiene pasos de procesamiento adicionales que aumentan el tiempo de ejecución total de la consulta. Además, en el main utilizo la clase Stopwatch para determinar cuantos milisegundos tarda el programa en ejecutarse.

static void Main()
{
    var tiempo = Stopwatch.StartNew();
    
    for (var i = 2; i < 20; i++)
    {
        var resultado = SumaRaicesNesimaDeX(i);
        Console.WriteLine("Raiz {0} = {1} ", i, resultado);
    }
 
    Console.WriteLine(tiempo.ElapsedMilliseconds);
    Console.ReadLine();
}
 
public static double SumaRaicesNesimaDeX(int n)
{
    double resultado = 0;
 
    for (var x = 1; x < 10000000; x++)
    {
        //Raíz n-ésima de x
        resultado += Math.Exp(Math.Log(x) / n);
    }
 
    return resultado;
}
 

El programa lo ejecute en AMD Phenom II X4 810 de 64 bits con 4 GB de memoria RAM y tardó aproximadamente 16 segundos.

Ahora si remplazo el ciclo:

for (var i = 2; i < 20; i++)
{
    var resultado = SumaRaicesNesimaDeX(i);
    Console.WriteLine("Raiz {0} = {1} ", i, resultado);
}

 

por el siguiente código añadiéndole paralelismo:

Parallel.For(2, 20, (i) =>
{
    var resultado = SumaRaicesNesimaDeX(i);
    Console.WriteLine("Raiz {0} = {1} ", i, resultado);
});

Mediante pequeñas modificaciones del código como son un índice de inicio y de fin y la llamada a través de un delegate, la ejecución del programa solo tarda aproximadamente 4 segundos y medio.

Visual Studio 2010 incluye nuevas herramientas de profiling y debugging para la ejecución concurrente. Un ejemplo de esto es el visualizador de concurrencia. Esta herramienta ayuda  a analizar nuestras aplicaciones secuenciales para descubrir las oportunidades de paralelismo. El visualizador de concurrencia incluye visualización y herramientas de reporte. Hay tres puntos de vista principales: utilización de CPU, subprocesos y núcleos.

imageEl eje X muestra el tiempo transcurrido desde el inicio de la traza hasta el final de la actividad de la aplicación. El eje Y muestra el número de núcleos de procesadores lógicos en el sistema. La zona verde representa el número medio de cores lógicos que se analiza en la aplicación en un momento dado en la ejecución del profiling. El resto de los núcleos por otros procesos que se ejecutan en el sistema (que se muestra en amarillo).

Si queremos paralelizar nuestra aplicación, debemos buscar áreas de ejecución que presentan largas regiones verdes a nivel de un solo núcleo en el eje Y o regiones donde no hay mucha utilización de la CPU, donde el verde no demuestra ni es considerablemente menos de 1 en promedio. Ambas circunstancias podrían indicar una oportunidad para la paralelización. En segundo lugar, si estamos tratando de afinar la aplicación paralela, esta vista le permite confirmar el grado de paralelismo que existe cuando la aplicación se ejecuta.

Este cambio de paradigma nos exige una nueva manera de pensar. Los threads son una abstracción demasiado débil. Debemos empezar a pensar en tareas no en threads y en relaciones entre esas tareas y su concurrencia en lugar de sincronización de threads. Seremos los desarrolladores quienes de un modo u otro tendremos que empezar a pensar en paralelización.

Tags:

.NET | Entity Framework | Visual Studio

Qué tan flexibles podemos ser y la transición a SCRUM

por leticia  21. julio 2010

Flexibilidad como opuesto a rigidez, agilidad como enemigo de proceso, gestión adaptativa versus gestión predictiva, cumplir el plan o responder al cambio. Estas opciones evolucionan como búsqueda de mejora a resultados poco satisfactorios (ya lo estudia estadísticamente Standish Group desde hace años) para los proyectos de desarrollo de software.

Entre aferrarnos totalmente a lo establecido o innovar sin más, vale no perder de vista la ser realistas y considerar:

· Que la relación de procesos-tecnología-personas es la clave del éxito para obtener ventajas competitivas, aunque la proporción depende del tipo de producción y características de cada empresa, su cultura, misión y el tipo de proyectos que desarrolla.

· Que un cliente puede preferir ceñirse al triángulo “producto-fecha-costo planificados”, y no se encuentre preparado para adoptar una visión que proponga que “no existe el producto terminado, sino que el producto está en constante evolución”.

· Que el proyecto aplique sin problemas para la ejecución de un plan controlado. Puede no necesitar disponer de un producto en lo inmediato, contar con requisitos claros, detallados e inamovibles, por lo que no exista un escenario de incertidumbre. Que la innovación no sea el factor determinante para el proyecto.

· Que en cada situación se evaluará la relación costo /beneficio en función de los riesgos.

Y mientras tanto seguir discutiendo las siguientes premisas:

· Que a más documentos menos contacto con el producto real.

· Que a más adherencia a procesos menos lugar a creatividad e innovación.

· Que no siempre se verifica que “la forma más eficiente de desarrollar un trabajo es hacerlo bien a la primera”.

· Que productividad y calidad no se dan necesariamente de manera homogénea.

· Que pueden convivir en un mismo equipo personas del negocio con las de desarrollo y hacer de la comunicación directa una fortaleza.

· Que los procesos y la tecnología son dueños de los conocimientos explícitos pero que la innovación siempre estará en las personas.

Ser flexibles es poder ir incorporando cambios para mejorar, si adherimos a que “El cuestionamiento de lo conocido es el motor de la evolución del conocimiento”.

El documento http://www.navegapolis.net/files/Flexibilidad_con_Scrum.pdf , es una interesante guía para la transición.

Tags:

Metodologías y Procesos

Guía de Migración a Team Foundation Server 2010

por Daniel Laco  21. julio 2010

 

El proceso de migración a TFS 2010 siempre es complejo. TFS hace uso de varias tecnologías demas del propio servidor, por ej: usa SQLServer para almacenamiento, Sharepoint para repositorio de documentos y trabajo colaborativo y IIS para alojar los servicios.

En resumen siempre es bueno leer las guías y estar preparados para esta tarea.

En http://vs2010upgradeguide.codeplex.com/ hay una guía que preparan los ALM Rangers que es un grupo de gente que adiciona información a las guias que publica MS.

Aqui les dejo un listado de los temas que están resueltos en esta guía (en Inglés):

 

  • Introduction
    • A Few Words about Team Project Collections
  • Part I – Upgrade Planning
    • Choosing between Upgrade and Migration
      • Upgrade
      • Migration
      • Server Move
    • Upgrade Process
      • In-Place Upgrade
      • Migration Upgrade
      • Upgrading Projects from Multiple TFS 2008 servers into one TFS 2010 server
      • Splitting a Team Project Collection into Multiple Collections
      • Moving reports after a Team Project Collection move
      • Updating Team Project Portal for an existing Team project
  • Part II – Questions and Answers (Q&A)*
    • Joining a Workgroup Machine to a Domain
    • Upgrading severs when SQL Mirroring is enabled
    • Recovering system if upgrade fails midway
    • Can I use a TFS2008 Process Template to create team projects in TFS 2010?
    • How can I enable Agile Workbooks in upgraded Projects?
      • Enabling the Product Backlog Workbook
      • Enabling the Iteration Backlog Workbook
    • How can I enable Test Case Management in upgraded project?
    • How can I enable Branch Visualization in upgraded projects?
    • How can I enable Lab Management in upgraded projects?
    • What is the WITAdmin command line utility used for?
    • Where is the custom reports placed post upgrade?
    • Will my TFS2008 reports work post upgrade?
    • Can I add a new Database to my existing TFS 2010 farm?
    • How to resolve the error encountered when bringing cloned TPC online?
    • Can I move TPC Database from one Database server to another Database Server?
    • How to enable the TFS reports if the WSS server is upgraded to MOSS server?
    • How to Move Team Projects from one Team Project Collection to another?

     

     

    Siempre es importante la guia de MS previo paso por este sitio. Esta guía se puede bajar de aquí.

     

     

  • Tags:

    ALM | Javascript | TFS

    El Datawarehouse de TFS no se actualiza luego de un upgrade a SQL Server 2008

    por Victor Passador  19. julio 2010

    Días pasados, en el proceso de upgrade de un servidor a TFS 2010, comenzamos con la actualización del motor de base de datos a su versión 2008, uno de los prerrequisitos exigidos.

    Si bien el servidor estaba virtualizado y ante algún imprevisto podríamos restaurar rápidamente un backup reciente de esa VM, decidimos tomar una precaución adicional que fue esperar un par de días luego de ese upgrade antes de encarar la instalación de la nueva versión de TFS, para ver si algún usuario informaba de inconvenientes.

    Ya decididos a instalar TFS 2010, un PM nos informa que los reportes de los diferentes proyectos estaban mostrando datos viejos. La espera no había sido en vano.

    Lo primero que hicimos fue forzar la actualización del Datawarehouse (aquí hemos descripto cómo hacerlo), pero sin éxito.

    SQL Management Studio por su parte, informaba las bases de datos de Analysis Services estaban funcionando correctamente, pero los datos aún no se actualizaban.

    Sin mensajes de error, la búsqueda de ayuda en Internet se complicaba. No aparecían casos similares en los buscadores, hasta que mirando en el Log de Eventos del SO dimos con algunas palabras claves que nos condujeron a un artículo de Bill Wang.

    Básicamente el problema era que, luego del upgrade a SQL Server 2008, TFS seguía intentando conectarse a Analisys Services pero de la versión 2005, y allí se producía el fallo.

    Para solucionar el inconveniente, hay que reemplazar una entrada del Web Config del WS de TFS como a continuación se detalla:

    Reemplazar …

       1: <dependentAssembly>
       2:         <assemblyIdentity name="Microsoft.AnalysisServices"
       3:                           publicKeyToken="89845dcd8080cc91"
       4:                           culture="neutral" />
       5:         <bindingRedirect oldVersion="9.0.242.0" newVersion="9.0.242.0"/>
       6: </dependentAssembly>

    … por …

       1: <dependentAssembly>
       2:         <assemblyIdentity name="Microsoft.AnalysisServices"
       3:                           publicKeyToken="89845dcd8080cc91"
       4:                           culture="neutral" />
       5:         <bindingRedirect oldVersion="9.0.242.0" newVersion="10.0.0.0"/>
       6: </dependentAssembly>

    Tener en cuenta que además, la herramienta “SetupWarehouse.exe” también accede al cubo de la misma forma, con lo cual deberá modificarse el archivo “SetupWarehouse.exe.config”.

    Tags: , ,

    Gestión de Proyectos | SQL Server | TFS

    Nuevos conceptos en TFS 2010

    por Victor Passador  8. julio 2010

    Como es de esperarse a estas alturas, existe infinidad de blogs que enumeran las características que vienen con la nueva versión de Team Foundation Server.

    Para no caer en la misma situación, la idea de este post es que nos enfoquemos solamente en algunas pocas de esas nuevas características a las que el nombre de “feature” le queda un poco chico, ya que implican un cambio más de fondo y que va un  poco más allá de una simple “nueva funcionalidad”.

    Project Collections

    Las colecciones de proyectos brindan una capa adicional de indirección que permite el agrupamiento de proyectos según el criterio que a nosotros más nos convenga. Esta agrupación podría ser por tipo de arquitectura, por equipo o área de la empresa, o por ejemplo, separando proyectos de desarrollo de aquellos otros de consultoría.

    Lo interesante de este agrupamiento es que no es solamente a nivel lógico, sino que también lo es a nivel físico. Esto permite lograr un mejor nivel de aislamiento entre proyectos, y ese aislamiento impacta en el aspecto de seguridad, ya que cada colección equivale a una nueva instancia de TFS en términos de sus versiones 2005/2008.

    Project collection compartmentalization

     

    El lector atento dirá a esta altura “… pero ojo… acá la cosa se complica …”.

    Y si, como en cualquier otro caso, nos encontraremos con ventajas y desventajas en la implementación de colecciones de proyectos. Vamos a enumerar las más importantes:

    Ventajas:
    • Aunque parezca obvio, no deja de ser una ventaja el hecho de poder seguir trabajando como en las versiones anteriores de TFS si no tenemos ganas de complicarnos la vida con estas colecciones, con la única salvedad de que nuestros proyectos estarán ahora dentro de una “Default Collection”.
    • Como cada colección maneja su propia base de datos, tenemos muchas más opciones a la hora de escalar y manejar balanceo de carga.
    • En grandes organizaciones (y no tanto), este nivel de aislamiento permite una administración de seguridad mucho más granular.
    • Tenemos la posibilidad de hacer respaldo/restauración de grupos de proyectos de manera independiente.
     
    Desventajas:
    • Lo que para algunos pueda ser una ventaja, es lo contrario para otros, ya que se podrá argumentar que ante una gran cantidad de colecciones se complicará seguramente la tarea del administrador al momento de configurar permisos de acceso a cada uno de los proyectos.
    • A raíz de que cada colección usa su propia base de datos, nos encontraremos con una tarea más ardua al momento de administrar copias de resguardo de toda esa información adicional.

     

    En el blog de Steve Lange podrán encontrar un diagrama de flujo muy interesante que les ayudará a decidir si necesitan o no manejar Project Collections.

     

    Nuevos templates de Proyectos

    Al momento de crear un nuevo proyecto en TFS en la versión 2010, nos encontraremos con un par de nuevos templates, entre ellos la versión 5.0 de MSF for Agile (aquí podrán encontrar una comparativa con la versión anterior).

    No quisiera centrarme en describir el proceso que intenta implementar, sino en la funcionalidad que aportan sus nuevos tipos de Work Item, Workflows y por sobre todo, las nuevas relaciones que se pueden establecer entre ellos.

    Cabe recordar que TFS 2010 permite establecer jerarquías de work items y además crear relaciones mucho más ricas que una simple dependencia de ida y vuelta entre uno y otro. Valiéndose de esto último, el nuevo template permitirá documentar por ejemplo “Historias de Usuario” y “Casos de Test” vinculados por una relación de tipo “Testea a …” o “Testeado por …” entre otras.

    Este es, indudablemente, un modelo mucho más rico que el anterior, ya que permite ser explotado por queries mucho más intuitivas, muchas de las cuales ya vienen incluidas en el propio template.

    Podríamos consultar, por ejemplo, Historias de Usuario que no cuentan con casos de test asociados para tener rápidamente un acceso a partes de nuestra aplicación que no tienen las pruebas mínimas necesarias.

     

    Dashboards

    Gracias a su integración con las últimas versiones de Sharepoint, los portales de proyectos creados con TFS 2010 mejoran su capacidad de reporting incluyendo Dashboards.

    La idea de un Dashboard (o tablero de control) es contar con una consola que incluya diferentes indicadores que muestren rápidamente la situación actual del proyecto en un único lugar pero a un nivel más “macro” y que, además, permita a las áreas gerenciales determinar que tan en línea está un determinado proyecto con las políticas de su negocio.

    Los Sharepoint Dashboard son la materialización de lo que se conoce como Balance Scorecards, es decir, sistemas de gestión y planificación estratégica que intentan alinear las actividades diarias del desarrollo con la visión de la empresa.

    Obviamente estos Dashboards son altamente personalizables, pero de manera inmediata podremos contar con la siguiente información:

    • Reporte de Task Burndown
    • Lista de cantidades de Work Items en sus diferentes posibles estados (Activos, Cerrados, Resolved, etc.)
    • Lista de fechas importantes
    • Lista de los últimos Builds
    • Lista de los últimos checkins realizados y sus comentarios
    • Vista rápida del Product backlog donde se ve el estados de sus items

     

    Cada uno de estos indicadores no es más que un wepbart embebido en el portal Sharepoint, por lo que contando con MOSS podremos personalizarlos y/o extenderlos de una manera muy flexible.

    Hasta la próxima.

    Tags: , , ,

    Gestión de Proyectos | Sharepoint | TFS

    Acerca de los Autores

    Este es el blog del equipo de VEMN SA 
    Presentaremos temas que nos parezcan de interés sobre tecnología .NET, Procesos y Metodologías y todo aquello relacionado con el proceso de desarrollo de Software

    Month List

    BlogRoll

    Download OPML file OPML