Construire des applications parallèles avec Visual Studio 11 quoi de neuf ?

Preview:

DESCRIPTION

C'est une réalité aujourd'hui. Les PC, les tablettes et autres périphériques mobiles sont désormais munis pour la majorité de multi-coeurs. Mais comment les programmer ? Dans cette session, nous vous proposons de faire un tour d'horizon des nouvelles innovations de Visual Studio 11 en termes de parallélismes, qui viennent enrichir celles de Visual Studio 2010. Alors que vous soyez développeur .NET ou Développeur C++, ou les deux ou même pas du tout, cette session vous permettra d'avoir une vue générale sur les nouvelles fonctionnalités de Visual Studio 11 en termes de parallélisme.

Citation preview

palais des congrès Paris

7, 8 et 9 février 2012

Construire des applications parallèles avec Visual Studio 11 quoi de neuf ?

Erwan Herfroy erwanh@microsoft.comApplication Development Manager

Eric Vernié ericv@microsoft.comhttp://blogs.msdn.com/b/devosaure/http://blogs.msdn.com/b/devpara/@EricVernie

.NET C++

Rappel sur TPLNouveautés 4.5

Asynchronisme TPL Dataflow …

Rappel sur PPLNouveautés C++

Futures/Task Continuation Algorithmes C++ AMP* …

Agenda

Rappel : Visual Studio 2010

Parallel Pattern LibraryTask Parallel Library

Parallel LINQ

Managed NativeKey:

WindowsOperating System

Runtime

Programming Models

CLR ThreadPool

Task Scheduler

Resource Manager

Data Structures D

ata

Stru

ctur

es

Tools

Tooling

Parallel Debugger

Concurrency Visualizer

AsyncAgentsLibrary

Stacks

Tasks

Threads

Cores

ConcRT

Task Scheduler

Resource Manager

CPU

Productivité du DéveloppementPlus simple de formuler le parallélismePermet l’utilisation de schémas éprouvésIntégration à l’environnement de développementLimite le code de “plomberie”

Performance & Exécution OptimiséeRéduction du surcoût à l’exécutionPermet l’utilisation de schémas performantMeilleure montée en charge

Exploitation de la PlateformePermet une composition efficacePermet de réduire l’utilisation des ressources processeurAmélioration de la cohérence du cachePermet d’exploiter au mieux les nouvelles fonctionnalités de Windows

Objectifs & Apports

DEMO

Task Parallel Library

Asynchronisme

Appel synchrone avec .NET 4…

public void CopyStreamToStream(Stream source, Stream destination){ byte[] buffer = new byte[0x1000]; int numRead; while ((numRead = source.Read(buffer, 0, buffer.Length)) != 0) { destination.Write(buffer, 0, numRead); }}

public void CopyStreamToStream(Stream source, Stream destination){ byte[] buffer = new byte[0x1000]; int numRead; while ((numRead = source.Read(buffer, 0, buffer.Length)) != 0) { destination.Write(buffer, 0, numRead); }}

Appel async (mais bloquant) avec .NET 4…

public Task CopyStreamToStreamAsync(Stream source, Stream destination){ return Task.Factory.StartNew(() => { byte[] buffer = new byte[0x1000]; int numRead; while ((numRead = source.Read(buffer, 0, buffer.Length)) != 0) { destination.Write(buffer, 0, numRead); } });}

Code async avec .NET 4…public void CopyStreamToStream(Stream source, Stream destination){ byte[] buffer = new byte[0x1000]; int numRead; while ((numRead = source.Read(buffer, 0, buffer.Length)) != 0) { destination.Write(buffer, 0, numRead); }}

public IAsyncResult BeginCopyStreamToStream( Stream source, Stream destination, AsyncCallback callback, object state){    var tcs = new TaskCompletionSource<object>(state); if (callback != null) tcs.Task.ContinueWith(_ => callback(tcs.Task));    var buffer = new byte[0x1000];

    Action<IAsyncResult> readWriteLoop = null;    readWriteLoop = iar => {        try {            for (bool isRead = iar == null; ; isRead = !isRead) {                switch (isRead) {                    case true:                        iar = source.BeginRead(buffer, 0, buffer.Length,  readResult => {                            if (readResult.CompletedSynchronously) return;                            readWriteLoop(readResult);                        }, null);                        if (!iar.CompletedSynchronously) return;                        break;

                    case false:                        int numRead = source.EndRead(iar);                        if (numRead == 0) {                            tcs.TrySetResult(null);                            return;                        }                        iar = destination.BeginWrite(buffer, 0, numRead, writeResult => {                            if (writeResult.CompletedSynchronously) return;                            destination.EndWrite(writeResult);                            readWriteLoop(null);                        }, null);                        if (!iar.CompletedSynchronously) return;                        destination.EndWrite(iar);                        break;                }            }        }        catch (Exception e) {  tcs.TrySetException(e);  }    };    readWriteLoop(null);    return tcs.Task;}

public void EndCopyStreamToStream(IAsyncResult asyncResult) {    ((Task)asyncResult).Wait();}

Code async avec .NET 4.5…

public void CopyStreamToStream(Stream source, Stream destination){ byte[] buffer = new byte[0x1000]; int numRead; while ((numRead = source.Read(buffer, 0, buffer.Length)) != 0) { destination.Write(buffer, 0, numRead); }}

public async Task CopyStreamToStreamAsync(Stream source, Stream destination){ byte[] buffer = new byte[0x1000]; int numRead; while ((numRead = await source.ReadAsync(buffer, 0, buffer.Length)) != 0) { await destination.WriteAsync(buffer, 0, numRead); }}

Code async avec .NET 4.5…public void CopyStreamToStream(Stream source, Stream destination)

{ byte[] buffer = new byte[0x1000]; int numRead; while ((numRead = source.Read(buffer, 0, buffer.Length)) != 0) { destination.Write(buffer, 0, numRead); }}

public async Task CopyStreamToStreamAsync(Stream source, Stream destination){ byte[] buffer = new byte[0x1000]; int numRead; while ((numRead = await source.ReadAsync(buffer, 0, buffer.Length)) != 0) { await destination.WriteAsync(buffer, 0, numRead); }}

DEMO

async/await

Task.Run

Task.Delay

Task.WhenAll / WhenAny

Task.FromResult

Task.Yield

Task.ConfigureAwait

Task.ContinueWith

Nouvelles méthodes de la classe Task supportant Async

DEMO

Task WhenAll/WhenAny

Modèle de programmation parallèleExemple de Pipeline

System.Threading.Tasks.Dataflow.dll

Primitives de passage de messages “Des blocs” qui manipulent des données A utiliser individuellement ou liés ensemble afin de créer

un réseau

Repose sur des principes Vieux de dizaines d’années Inspirée par

Asynchronous Agents Library dans Visual C++ 2010 Le projet Axum en incubation CCR de Microsoft Robotics

TPL DataflowAperçu

ActionBlock<int>Message Queue

0123

Process(0);Process(1);Process(2);Process(3);

4

Process(4);

var ab = new ActionBlock<int>(i =>{ Process(i);});

for(int i = 0; i < 5; i++){ ab.Post(i);}

TPL DataflowExemple simple Producteur/Consommateur

DEMO

TPL Dataflow en Action

Algorithmes parallèle parallel_for | parallel_for_each | parallel_invoke parallel_transform | parallel_reduce | parallel_sort |

parallel_buffered_sort | parallel_radixsort

Tâches task_handle | task_group | structured_task_group task<T>

then<T> | when_all<T> | when_any<T> operateurs &&, ||

task_completion_eventContainers

concurrent_queue | concurrent_vector | combinable concurrent_unordered_map | concurrent_unordered_multimap |

concurrent_unordered_set | concurrent_unordered_multisetl

Agent

PPL: VS 2010 et VS 11

DEMO

Parallel Pattern Library

Notion de futur task<T> t, t.get()

Notion de continuation task<T>.then()

Task_completion_event<int>

When_all/when_any

Nouveautés de la PPL

Choice:

auto t = t1 || t2; // identique à when_any

Join:

auto t = t1 && t2; // identique à when_all

Syntaxe des Operateurs

DEMO

Quelques nouveautés de la PPL

www.buildwindows.com

Résumé : Nouveautés VS 11

Parallel Pattern LibraryTask Parallel Library

PLINQ

Managed NativeKey:

WindowsOperating System

Runtime

Programming Models

CLR ThreadPool

Task Scheduler

Resource Manager

Data Structures D

ata

Stru

ctur

es

Tools

Tooling

Parallel Debugger

Concurrency Visualizer

AsyncAgentsLibrary

Stacks

Tasks

Watch

CPU

Threads

Cores

C#/VB/F#

Async Dataflow

C++AMP

DirectX

GPU

CPU GPU

ConcRT

Task Scheduler

Resource Manager

New Updated

Chaque semaine, les DevCampsALM, Azure, Windows Phone, HTML5, OpenDatahttp://msdn.microsoft.com/fr-fr/devcamp

Téléchargement, ressources et toolkits : RdV sur MSDNhttp://msdn.microsoft.com/fr-fr/

Les offres à connaître90 jours d’essai gratuit de Windows Azure www.windowsazure.fr

Jusqu’à 35% de réduction sur Visual Studio Pro, avec l’abonnement MSDN www.visualstudio.fr

Pour aller plus loin

10 février 2012

Live Meeting

Open Data - Développer des applications riches avec le protocole Open Data

16 février 2012

Live Meeting

Azure series - Développer des applications sociales sur la plateforme Windows Azure

17 février 2012

Live Meeting

Comprendre le canvas avec Galactic et la librairie three.js

21 février 2012

Live Meeting

La production automatisée de code avec CodeFluent Entities

2 mars 2012

Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7, iOS et Android

6 mars 2012

Live Meeting

Nuget et ALM

9 mars 2012

Live Meeting

Kinect - Bien gérer la vie de son capteur

13 mars 2012

Live Meeting

Sharepoint series - Automatisation des tests

14 mars 2012

Live Meeting

TFS Health Check - vérifier la bonne santé de votre plateforme de développement

15 mars 2012

Live Meeting

Azure series - Développer pour les téléphones, les tablettes et le cloud avec Visual Studio 2010

16 mars 2012

Live Meeting

Applications METRO design - Désossage en règle d'un template METRO javascript

20 mars 2012

Live Meeting

Retour d'expérience LightSwitch, Optimisation de l'accès aux données, Intégration Silverlight

23 mars 2012

Live Meeting

OAuth - la clé de l'utilisation des réseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Recommended