Files
Misaki.HighPerformance/Misaki.HighPerformance.HPC/Templates/WideLane.tt
Misaki c8f78f9d02 Refactor SPMD to HPC; add SIMD source generators
Major namespace migration from SPMD to HPC across all code, templates, and projects. Introduced Misaki.HighPerformance.HPC.Generator with Roslyn-based source generators for SIMD code (e.g., AVX2), including attribute and method generators. Renamed MultipleAdd to MultiplyAdd in all lanes and updated usages. Added AVX2 utility methods via codegen. Updated tests, benchmarks, and project references to use the new framework. Improved SIMD memory utilities and modernized project files. Removed legacy SPMD project from the solution.
2026-05-06 13:43:58 +09:00

57 lines
2.3 KiB
Plaintext

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".gen.cs" #>
using System.Numerics;
using System.Runtime.CompilerServices;
namespace Misaki.HighPerformance.HPC;
<#
var conversions = new CastRoute[]
{
new CastRoute { From = "float", To = "int", Method = "Vector.ConvertToInt32" },
new CastRoute { From = "float", To = "uint", Method = "Vector.ConvertToUInt32" },
new CastRoute { From = "double", To = "long", Method = "Vector.ConvertToInt64" },
new CastRoute { From = "double", To = "ulong", Method = "Vector.ConvertToUInt64" },
new CastRoute { From = "int", To = "float", Method = "Vector.ConvertToSingle" },
new CastRoute { From = "uint", To = "float", Method = "Vector.ConvertToSingle" },
new CastRoute { From = "long", To = "double", Method = "Vector.ConvertToDouble" },
new CastRoute { From = "ulong", To = "double", Method = "Vector.ConvertToDouble" },
};
#>
public readonly unsafe partial struct WideLane<TNumber> : ISPMDLane<WideLane<TNumber>, TNumber>
where TNumber : unmanaged, INumber<TNumber>, IBinaryNumber<TNumber>, IMinMaxValue<TNumber>, IBitwiseOperators<TNumber, TNumber, TNumber>
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public TOther Cast<TOther, TOtherNumber>()
where TOther : ISPMDLane<TOther, TOtherNumber>
where TOtherNumber : unmanaged, INumber<TOtherNumber>, IBinaryNumber<TOtherNumber>, IMinMaxValue<TOtherNumber>, IBitwiseOperators<TOtherNumber, TOtherNumber, TOtherNumber>
{
<# foreach (var c in conversions) { #>
if (typeof(TNumber) == typeof(<#= c.From #>) && typeof(TOtherNumber) == typeof(<#= c.To #>))
{
return Unsafe.BitCast<Vector<<#= c.To #>>, TOther>(<#= c.Method #>(Unsafe.BitCast<Vector<TNumber>, Vector<<#= c.From #>>>(value)));
}
<# } #>
var casted = stackalloc TOtherNumber[LaneWidth];
for (var i = 0; (i < LaneWidth) && (i < TOther.LaneWidth); i++)
{
casted[i] = TOtherNumber.CreateTruncating(value[i]);
}
return TOther.Load(casted);
}
}
<#+
public struct CastRoute
{
public string From;
public string To;
public string Method;
}
#>