Cloud Computing - новая парадигма облачных вычислений. Windows Azure.
Обзор программных средств Майкрософт для графики и визуализации: коммерческой, игровой, научной
1. Обзор программных средств Майкрософт для графики и визуализации: коммерческой, игровой, научной Сошников Дмитрий Валерьевич, к.ф.-м.н., доц.dmitryso@microsoft.com http://twitter.com/shwars
2. О чём доклад? Средства для пользователей Microsoft Expression PhotoSynth / GeoSynth Deep Zoom Image Composite Editor Средства для разработчиков DirectX XNA Game Studio Silverlight / WPF Дополнительно Научные расчёты и визуализация на F# Проекты Microsoft Research
16. F# как язык научных расчётов Сколько строк кода для построения фрактала?
17. Множество Мандельброта let rec rpt n f = if n=0 then fun x->x else f >> (rpt (n-1) f);; let mandelf (c:Complex) (z:Complex) = z*z+c;; let ismandel c = Complex.Abs(rpt 20 (mandelf c) (Complex.zero))<1.0;; letscale (x:float,y:float) (u,v) n = float(n-u)/float(v-u)*(y-x)+x;; let form = let image = new Bitmap(400, 400) let lscale = scale (-1.2,1.2) (0,image.Height-1) for i = 0 to (image.Height-1) do for j = 0 to (image.Width-1) do let t = complex (lscale i) (lscale j) in image.SetPixel(i,j,ifismandel t then Color.Black else Color.White) let temp = new Form() temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)) temp
18. Научная визуализация в F# let form = new SmoothForm(Visible = true, TopMost = true) let renderer = new DirectXRenderer(form) renderer.DrawScene.Add(fun _ -> renderer.DrawCubeAxis()) renderer.DrawScene.Add(fun _ -> renderer.SetupLights()) let mutable view = { YawPitchRoll = Matrix.RotationYawPitchRoll(0.0f,0.0f,0.0f); Focus = scale 0.5f (X1 + Y1 + Z1); Zoom = 4.0 } renderer.DrawScene.Add(fun _ -> renderer.SetView(view)) let mutable ff = (fun (t:float32) x y -> x * (1.0f - y)) let mutable range = (0.0f,1.0f) let mutable mesh = BaseMesh.Grid(20,20) let scalef (min,max) (z:float32) = (z-min) / (max-min) let theFunction t x y = ff t x y |> scalef range renderer.DrawScene.Add(fun t -> renderer.DrawSurfacemesh (theFunction t))
20. Параллелизм и асинхр. I/O в F# using System; using System.IO; using System.Threading; public class BulkImageProcAsync { public const String ImageBaseName = "tmpImage-"; public const intnumImages = 200; public const intnumPixels = 512 * 512; // ProcessImage has a simple O(N) loop, and you can vary the number // of times you repeat that loop to make the application more CPU- // bound or more IO-bound. public static intprocessImageRepeats = 20; // Threads must decrement NumImagesToFinish, and protect // their access to it through a mutex. public static intNumImagesToFinish = numImages; public static Object[] NumImagesMutex = new Object[0]; // WaitObject is signalled when all image processing is done. public static Object[] WaitObject = new Object[0]; public class ImageStateObject { public byte[] pixels; public intimageNum; public FileStreamfs; } public static void ReadInImageCallback(IAsyncResultasyncResult) { ImageStateObject state = (ImageStateObject)asyncResult.AsyncState; Stream stream = state.fs; intbytesRead = stream.EndRead(asyncResult); if (bytesRead != numPixels) throw new Exception(String.Format ("In ReadInImageCallback, got the wrong number of " + "bytes from the image: {0}.", bytesRead)); ProcessImage(state.pixels, state.imageNum); stream.Close(); // Now write out the image. // Using asynchronous I/O here appears not to be best practice. // It ends up swamping the threadpool, because the threadpool // threads are blocked on I/O requests that were just queued to // the threadpool. FileStreamfs = new FileStream(ImageBaseName + state.imageNum + ".done", FileMode.Create, FileAccess.Write, FileShare.None, 4096, false); fs.Write(state.pixels, 0, numPixels); fs.Close(); // This application model uses too much memory. // Releasing memory as soon as possible is a good idea, // especially global state. state.pixels = null; fs = null; // Record that an image is finished now. lock (NumImagesMutex) { NumImagesToFinish--; if (NumImagesToFinish == 0) { Monitor.Enter(WaitObject); Monitor.Pulse(WaitObject); Monitor.Exit(WaitObject); } } } public static void ProcessImagesInBulk() { Console.WriteLine("Processing images... "); long t0 = Environment.TickCount; NumImagesToFinish = numImages; AsyncCallbackreadImageCallback = new AsyncCallback(ReadInImageCallback); for (inti = 0; i < numImages; i++) { ImageStateObject state = new ImageStateObject(); state.pixels = new byte[numPixels]; state.imageNum = i; // Very large items are read only once, so you can make the // buffer on the FileStream very small to save memory. FileStreamfs = new FileStream(ImageBaseName + i + ".tmp", FileMode.Open, FileAccess.Read, FileShare.Read, 1, true); state.fs = fs; fs.BeginRead(state.pixels, 0, numPixels, readImageCallback, state); } // Determine whether all images are done being processed. // If not, block until all are finished. boolmustBlock = false; lock (NumImagesMutex) { if (NumImagesToFinish > 0) mustBlock = true; } if (mustBlock) { Console.WriteLine("All worker threads are queued. " + " Blocking until they complete. numLeft: {0}", NumImagesToFinish); Monitor.Enter(WaitObject); Monitor.Wait(WaitObject); Monitor.Exit(WaitObject); } long t1 = Environment.TickCount; Console.WriteLine("Total time processing images: {0}ms", (t1 - t0)); } } let ProcessImageAsync () = async { let inStream = File.OpenRead(sprintf "Image%d.tmp" i) let! pixels = inStream.ReadAsync(numPixels) let pixels' = TransformImage(pixels,i) let outStream = File.OpenWrite(sprintf "Image%d.done" i) do! outStream.WriteAsync(pixels') do Console.WriteLine "done!" } let ProcessImagesAsyncWorkflow() = Async.Run (Async.Parallel [ for i in 1 .. numImages -> ProcessImageAsynci ])
21. Проекты Microsoft Research Image & Video Editing @ MSR Cambridge AutoCollage HD View http://www.worldwidetelescope.org
22. Майкрософт в России MSR Организация/поддержка научных мероприятий Программы научной стажировки и академического обмена Совместные научные проекты Департамент стратегических технологий Организация технологических мероприятий, конференций Поддержка при использовании технологий в учебном процессе и студенческих проектах Студенческие конкурсы (Imagine Cup) Студенты-партнёры (MSP, Microsoft Student Partners) Бесплатное программное обеспечение (вкл.исходный код ядра Windows)
23. Выводы Обзор интересных графических технологий как для пользователей, так и для тех, кто пишет код Майкрософт предлагает как готовые технологии, так и интересные идеи в разработке .NET – удивительная платформа, которая позволяет объединять в едином проекте различные инструменты для графики и вычислений F#, .NET Parallel Extensions, Windows CCS, Windows Azure – для параллельных вычислений XNA, Silverlight, WPF – для визуализации WCF – для коммуникации в модели вычислений S+S
24. СошниковДмитрий Валерьевич E-mail: dmitryso@microsoft.com Blog: http://blogs.msdn.com/sos Twitter: http://twitter.com/shwars VKontakte: http://vkontakte.ru/id3796212 Координатор академических программ Департамента стратегических технологий Майкрософт Россия Доцент каф. Вычислительной математики и программирования МАИ Доцент каф. Управления разработкой программного Обеспечения ГУ ВШЭ