public void WarpDimension(int warpMultiplier) { var length = Accelerator.WarpSize * warpMultiplier; using (var lengthBuffer = Accelerator.Allocate <int>(length)) { using (var idxBuffer = Accelerator.Allocate <int>(length)) { Execute(length, lengthBuffer.View, idxBuffer.View); var expectedLength = Enumerable.Repeat( Accelerator.WarpSize, length).ToArray(); Verify(lengthBuffer, expectedLength); var expectedIndices = new int[length]; for (int i = 0; i < length; ++i) { expectedIndices[i] = i % Accelerator.WarpSize; } Verify(idxBuffer, expectedIndices); } } }
static void LaunchKernel( Accelerator accelerator, Action <Index, ArrayView <int> > method, int?expectedValue) { var kernel = accelerator.LoadAutoGroupedStreamKernel(method); using (var buffer = accelerator.Allocate <int>(1024)) { kernel(buffer.Length, buffer.View); // Wait for the kernel to finish... accelerator.Synchronize(); if (expectedValue.HasValue) { var data = buffer.GetAsArray(); for (int i = 0, e = data.Length; i < e; ++i) { Debug.Assert(data[i] == expectedValue); } } } }
static void LaunchKernel( Accelerator accelerator, Action <Index1, ArrayView <double>, double> method) { Console.WriteLine("Launching: " + method.Method.Name); var kernel = accelerator.LoadAutoGroupedStreamKernel(method); using (var buffer = accelerator.Allocate <double>(1)) { buffer.MemSetToZero(); kernel(1024, buffer.View, 2.0); // Wait for the kernel to finish... accelerator.Synchronize(); var data = buffer.GetAsArray(); for (int i = 0, e = data.Length; i < e; ++i) { Console.WriteLine($"Data[{i}] = {data[i]}"); } } }
private void Render() { Vector3[] output = new Vector3[RenderWidth * RenderHeight]; var myKernel = accelerator.LoadAutoGroupedStreamKernel <Index2, ArrayView2D <Vector3>, Scene, ArrayView <Models.Geometry>, ArrayView <Light>, int>(Raytracer.Kernel); using (var gpuBuffer = accelerator.Allocate <Vector3>(new Index2(RenderWidth, RenderHeight))) { using var geometryBuffer = accelerator.Allocate <Geometry>(sceneGeometry.Length); geometryBuffer.CopyFrom(accelerator.DefaultStream, sceneGeometry, 0, 0, sceneGeometry.Length); using var lightBuffer = accelerator.Allocate <Light>(sceneLights.Length); lightBuffer.CopyFrom(accelerator.DefaultStream, sceneLights, 0, 0, sceneLights.Length); gpuBuffer.CopyFrom(accelerator.DefaultStream, colorBuffer, 0, Index2.Zero, RenderWidth * RenderHeight); accelerator.DefaultStream.Synchronize(); scene.Camera = new Camera(scene.Camera.Position, scene.Camera.LookAt, scene.Camera.FocalLength, RenderWidth, RenderHeight); while (rendering) { myKernel(gpuBuffer.Extent, gpuBuffer.View, scene, geometryBuffer.View, lightBuffer.View, new Random().Next()); accelerator.Synchronize(); passes += 1; Dispatcher?.InvokeAsync(() => { statusLabel.Content = $"Passes: {passes} Elapsed: {(DateTime.Now - renderStartTime).ToString(@"hh\:mm\:ss")} Passes/s: {passes / (float)(DateTime.Now - renderStartTime).TotalSeconds}"; }); if ((passes - 1) % 20 == 0) { gpuBuffer.CopyTo(colorBuffer, Index2.Zero, 0, new Index2(RenderWidth, RenderHeight)); Dispatcher?.InvokeAsync(UpdateBitmap); } } gpuBuffer.CopyTo(colorBuffer, Index2.Zero, 0, new Index2(RenderWidth, RenderHeight)); Dispatcher?.InvokeAsync(UpdateBitmap); } }