using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; namespace Misaki.HighPerformance.HPC; internal static unsafe class SPMDUtility { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector128 GetIndicesAs128Int32(Vector Indices) where TNumber : unmanaged { var vGeneric = Indices.AsVector128(); if (typeof(TNumber) == typeof(float)) { var vFloat = Unsafe.BitCast, Vector128>(vGeneric); return Vector128.ConvertToInt32(vFloat); } else if (typeof(TNumber) == typeof(int) || typeof(TNumber) == typeof(uint)) { return Unsafe.BitCast, Vector128>(vGeneric); } else { throw new NotSupportedException(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector256 GetIndicesAs256Int32(Vector indices) where TNumber : unmanaged { var vGeneric = indices.AsVector256(); if (typeof(TNumber) == typeof(float)) { var vFloat = Unsafe.BitCast, Vector256>(vGeneric); return Vector256.ConvertToInt32(vFloat); } else if (typeof(TNumber) == typeof(int) || typeof(TNumber) == typeof(uint)) { return Unsafe.BitCast, Vector256>(vGeneric); } else { throw new NotSupportedException(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector128 GetIndicesAs128Int64(Vector indices) where TNumber : unmanaged { var vGeneric = indices.AsVector128(); if (typeof(TNumber) == typeof(double)) { var vDouble = Unsafe.BitCast, Vector128>(vGeneric); return Vector128.ConvertToInt64(vDouble); } else if (typeof(TNumber) == typeof(long) || typeof(TNumber) == typeof(ulong)) { return Unsafe.BitCast, Vector128>(vGeneric); } else { throw new NotSupportedException(); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector256 GetIndicesAs256Int64(Vector indices) where TNumber : unmanaged { var vGeneric = indices.AsVector256(); if (typeof(TNumber) == typeof(double)) { var vDouble = Unsafe.BitCast, Vector256>(vGeneric); return Vector256.ConvertToInt64(vDouble); } else if (typeof(TNumber) == typeof(long) || typeof(TNumber) == typeof(ulong)) { return Unsafe.BitCast, Vector256>(vGeneric); } else { throw new NotSupportedException(); } } }