// Comment about https://mastodon.social/@brandewinder@hachyderm.io/113064780292323247 // https://brandewinder.com/2024/09/01/should-i-use-simd-vectors/ using System.Numerics; using System.Runtime.InteropServices; using System.Runtime.Intrinsics; public class VectorProcessor { public static float Take2(float[] left, float[] right) { var size = left.Length; var s1 = new ReadOnlySpan(left); var s2 = new ReadOnlySpan(right); var total = 0.0f; // Use Vector.Count, don't hardcode for (int i = 0; i < size / Vector.Count; i++) { var s = Vector.Count * i; var v1 = new Vector(s1.Slice(s, Vector.Count)); var v2 = new Vector(s2.Slice(s, Vector.Count)); var diff = v1 - v2; total += Vector.Dot(diff, diff); } return MathF.Sqrt(total); } public static float TakeFaster(float[] left, float[] right) { var s1 = MemoryMarshal.Cast>(new ReadOnlySpan(left)); var s2 = MemoryMarshal.Cast>(new ReadOnlySpan(right)); var total = 0.0f; for (int i = 0; i < s1.Length && i < s2.Length; i++) { var v1 = s1[i]; var v2 = s2[i]; var diff = v1 - v2; total += Vector.Dot(diff, diff); } return MathF.Sqrt(total); } }