26
palais des congrès Paris 7, 8 et 9 février 2012

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

Embed Size (px)

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

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

palais des congrès Paris

7, 8 et 9 février 2012

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

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

Erwan Herfroy [email protected] Development Manager

Eric Vernié [email protected]://blogs.msdn.com/b/devosaure/http://blogs.msdn.com/b/devpara/@EricVernie

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

.NET C++

Rappel sur TPLNouveautés 4.5

Asynchronisme TPL Dataflow …

Rappel sur PPLNouveautés C++

Futures/Task Continuation Algorithmes C++ AMP* …

Agenda

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

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

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

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

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

DEMO

Task Parallel Library

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

Asynchronisme

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

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); }}

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

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); } });}

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

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();}

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

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); }}

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

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); }}

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

DEMO

async/await

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

Task.Run

Task.Delay

Task.WhenAll / WhenAny

Task.FromResult

Task.Yield

Task.ConfigureAwait

Task.ContinueWith

Nouvelles méthodes de la classe Task supportant Async

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

DEMO

Task WhenAll/WhenAny

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

Modèle de programmation parallèleExemple de Pipeline

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

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

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

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

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

DEMO

TPL Dataflow en Action

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

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

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

DEMO

Parallel Pattern Library

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

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

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

Choice:

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

Join:

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

Syntaxe des Operateurs

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

DEMO

Quelques nouveautés de la PPL

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

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

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

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