Skip to content

Instantly share code, notes, and snippets.

@israellot
Last active September 26, 2022 16:30
Show Gist options
  • Save israellot/0f23a72c0f335e59fb38655d48fe7ed2 to your computer and use it in GitHub Desktop.
Save israellot/0f23a72c0f335e59fb38655d48fe7ed2 to your computer and use it in GitHub Desktop.
Expert Checksum with AVX
public static unsafe uint ChecksumExpertAvx(ReadOnlySpan<byte> arr)
{
ref byte refSpan = ref MemoryMarshal.GetReference<byte>(arr);
uint z = 0;
uint sum = 0;
var vectorSum = Avx.Xor(Vector128<byte>.Zero, Vector128<byte>.Zero).AsUInt32();
var mask = Vector128.Create((byte)3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12);
int limit = arr.Length - 64;
while (z <= limit)
{
var v1 = Vector128.LoadUnsafe(ref Unsafe.Add(ref refSpan, z));
var v2 = Vector128.LoadUnsafe(ref Unsafe.Add(ref refSpan, z+16));
var v3 = Vector128.LoadUnsafe(ref Unsafe.Add(ref refSpan, z+32));
var v4 = Vector128.LoadUnsafe(ref Unsafe.Add(ref refSpan, z+48));
var s1 = Avx.Shuffle(v1, mask).AsUInt32();
var s2 = Avx.Shuffle(v2, mask).AsUInt32();
var s3 = Avx.Shuffle(v3, mask).AsUInt32();
var s4 = Avx.Shuffle(v4, mask).AsUInt32();
var s5 = Avx.Add(Avx.Add(s1, s2), Avx.Add(s3, s4));
vectorSum = Avx.Add(vectorSum,s5);
z += 64;
}
...
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment