public async void AnimateMandelbrot() { int[] data = new int[displayPort[0] * displayPort[1]]; Device device = MandelbrotInstance.ContextInstance.Devices.First(x => x.Name == DeviceName); if (_lastDevice != device) { RestartWatch(); MandelbrotInstance.CompileKernel(device); ExecutionsDetails2 = ElapsedTime("IL Compile - " + device.Name); _lastDevice = device; } MandelbrotInstance.InitGPURepeat(ref data, displayPort, areaView, maxIterations); StateHasChanged(); float offsetX = -0.02f; float offsetY = 0.00562f; for (int i = 0; i < 500; i++) { // here we are in a long running loop, a user can navigate away or close a window which will // eventually result in an exception as this loop will continue to run if (_disposing || MandelbrotInstance.IsDisposing) { break; } RestartWatch(); MandelbrotInstance.CalcGPURepeat(ref data, displayPort, areaView, maxIterations); // ILGPU-CPU-Mode ExecutionsDetails2 = ElapsedTime($"IL Run - {DeviceName}"); areaView[0] = areaView[0] * 0.98f + offsetX; areaView[1] = areaView[1] * 0.98f + offsetX; areaView[2] = areaView[2] * 0.98f + offsetY; areaView[3] = areaView[3] * 0.98f + offsetY; if (_disposing || MandelbrotInstance.IsDisposing) { break; } RestartWatch(); await MandelbrotExtensions.Draw(Canvas2D, data, displayPort[0], displayPort[1], maxIterations, Color.Blue); ExecutionsDetails3 = ElapsedTime("Web Server Render"); StateHasChanged(); } MandelbrotInstance.CleanupGPURepeat(); }
public async void AnimateMandelbrot() { int[] data = new int[displayPort[0] * displayPort[1]]; float offsetX = -0.02f; float offsetY = 0.00562f; switch (DeviceName) { case "Single Thread": for (int i = 0; i < 500; i++) { if (_disposing) { break; } RestartWatch(); MandelbrotExtensions.CalcCPUSingle(data, displayPort, areaView, maxIterations); // ILGPU-CPU-Mode ExecutionsDetails3 = ElapsedTime($"Single Thread"); areaView[0] = areaView[0] * 0.98f + offsetX; areaView[1] = areaView[1] * 0.98f + offsetX; areaView[2] = areaView[2] * 0.98f + offsetY; areaView[3] = areaView[3] * 0.98f + offsetY; if (_disposing) { break; } RestartWatch(); await MandelbrotExtensions.Draw(Canvas2D, data, displayPort[0], displayPort[1], maxIterations, Color.Blue); StateHasChanged(); ExecutionsDetails4 = ElapsedTime("Render Time"); } break; case "Parallel CPU": for (int i = 0; i < 500; i++) { if (_disposing) { break; } RestartWatch(); MandelbrotExtensions.CalcCPUParallel(data, displayPort, areaView, maxIterations); // ILGPU-CPU-Mode ExecutionsDetails3 = ElapsedTime($"CPU Parallel"); areaView[0] = areaView[0] * 0.98f + offsetX; areaView[1] = areaView[1] * 0.98f + offsetX; areaView[2] = areaView[2] * 0.98f + offsetY; areaView[3] = areaView[3] * 0.98f + offsetY; if (_disposing) { break; } RestartWatch(); await MandelbrotExtensions.Draw(Canvas2D, data, displayPort[0], displayPort[1], maxIterations, Color.Blue); StateHasChanged(); ExecutionsDetails4 = ElapsedTime("Render Time"); } break; default: _computing = true; if (_lastDevice != _CPUDevice) { RestartWatch(); MandelbrotInstance.CompileKernel(_CPUDevice); ExecutionsDetails2 = ElapsedTime("IL Compile - " + _CPUDevice.Name); _lastDevice = _CPUDevice; } MandelbrotInstance.InitGPURepeat(ref data, displayPort, areaView, maxIterations); for (int i = 0; i < 500; i++) { if (_disposing) { break; } RestartWatch(); MandelbrotInstance.CalcGPURepeat(ref data, displayPort, areaView, maxIterations); // ILGPU-CPU-Mode ExecutionsDetails3 = ElapsedTime($"IL Run - {DeviceName}"); areaView[0] = areaView[0] * 0.98f + offsetX; areaView[1] = areaView[1] * 0.98f + offsetX; areaView[2] = areaView[2] * 0.98f + offsetY; areaView[3] = areaView[3] * 0.98f + offsetY; if (_disposing) { break; } RestartWatch(); await MandelbrotExtensions.Draw(Canvas2D, data, displayPort[0], displayPort[1], maxIterations, Color.Blue); StateHasChanged(); ExecutionsDetails4 = ElapsedTime("Render Time"); } MandelbrotInstance.CleanupGPURepeat(); _computing = false; break; } }