Skip to content

Instantly share code, notes, and snippets.

@Veraatversus
Last active May 17, 2020 22:35
Show Gist options
  • Save Veraatversus/89a1e686c1fa01844869d796b7eac6c1 to your computer and use it in GitHub Desktop.
Save Veraatversus/89a1e686c1fa01844869d796b7eac6c1 to your computer and use it in GitHub Desktop.
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