Last active
May 17, 2020 22:35
-
-
Save Veraatversus/89a1e686c1fa01844869d796b7eac6c1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Alea; | |
using Alea.Parallel; | |
using System; | |
using System.Diagnostics; | |
using System.Drawing; | |
using System.Drawing.Imaging; | |
using System.Runtime.InteropServices; | |
namespace GpuFractal { | |
internal static class Program { | |
#region Private Methods | |
private static void Main() { | |
while (true) { | |
DoStuff(); | |
} | |
} | |
[GpuManaged] | |
private static void DoStuff() { | |
const float xs = -2.1F; | |
const float ys = -1.3F; | |
const int zoom = 1; | |
const int width = 4096; | |
const int height = 4096; | |
const int blackpixel = (byte)0 | ((byte)0 << 8) | ((byte)0 << 16) | ((byte)255 << 24); | |
var gpu = Gpu.Default; | |
var gpubits = gpu.Allocate<int>(width * height); | |
Console.WriteLine("Started..."); | |
var watch = new Stopwatch(); | |
watch.Start(); | |
const float dx = 2.6F / zoom / width; | |
const float dy = 2.6F / zoom / height; | |
gpu.For(0, width, (x) => { | |
for (var y = 0; y < height; y++) { | |
var cr = xs + (x * dx); | |
var ci = ys + (y * dy); | |
var zr = 0F; | |
var zi = 0F; | |
float zrSquare; | |
float ziSquare; | |
byte i = 0; | |
while (i < 255) { | |
zrSquare = zr * zr; | |
ziSquare = zi * zi; | |
zi = (2 * zi * zr) + ci; | |
zr = zrSquare - ziSquare + cr; | |
i++; | |
if (zrSquare + ziSquare > 4) { | |
break; | |
} | |
} | |
if (i == 255) { | |
gpubits[x + (y * width)] = blackpixel; | |
} | |
else { | |
gpubits[x + (y * width)] = (byte)(i * 25 % 256) | ((byte)(i * 3 % 256) << 8) | (((byte)(i % 256)) << 16) | ((byte)255 << 24); | |
} | |
} | |
}); | |
watch.Stop(); | |
Console.WriteLine($"Elapsed microseconds: {(double)watch.ElapsedTicks / Stopwatch.Frequency * 1000000}"); | |
var bits = Gpu.CopyToHost(gpubits); | |
var bitsHandle = GCHandle.Alloc(bits, GCHandleType.Pinned); | |
var bitmap = new Bitmap(width, height, width * 4, PixelFormat.Format32bppPArgb, bitsHandle.AddrOfPinnedObject()); | |
bitmap.Save("b.png", ImageFormat.Png); | |
bitmap.Dispose(); | |
bitsHandle.Free(); | |
Gpu.Free(gpubits); | |
} | |
#endregion Private Methods | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment