Add SPMD lane reductions, gather, and SinCos API changes

- Added MaskLoad, Gather, and reduction methods (ReduceAdd, ReduceMax, ReduceMin) to ISPMDLane<TSelf, TNumber> with XML docs
- Changed SinCos to use out parameters instead of tuple return
- Implemented reductions in ScalarLane and WideLane (loop-based, TODO: SIMD)
- Added GetUnsafePtr to ISPMDLane
- Extended MathV to support Sin, Cos, SinCos, Tan, Asin, Acos, Atan, Atan2 for Vector2/3/4
- Improved WideLane.Sequence to use best vector type
- Updated GGX mip generation for new SinCos signature
- Bumped version to 1.3.2
- Enabled PNG dumping in GGX benchmark
This commit is contained in:
2026-04-29 13:26:02 +09:00
parent b4535eff00
commit 90461cd0ca
7 changed files with 583 additions and 20 deletions

View File

@@ -416,9 +416,27 @@ public readonly unsafe struct ScalarLane<TNumber> : ISPMDLane<ScalarLane<TNumber
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static (ScalarLane<TNumber> sin, ScalarLane<TNumber> cos) SinCos(ScalarLane<TNumber> value)
public static void SinCos(ScalarLane<TNumber> value, out ScalarLane<TNumber> sin, out ScalarLane<TNumber> cos)
{
return (Sin(value), Cos(value));
if (typeof(TNumber) == typeof(float))
{
var f = Unsafe.As<ScalarLane<TNumber>, float>(ref value);
var (s, c) = MathF.SinCos(f);
sin = Unsafe.As<float, ScalarLane<TNumber>>(ref s);
cos = Unsafe.As<float, ScalarLane<TNumber>>(ref c);
}
else if (typeof(TNumber) == typeof(double))
{
var d = Unsafe.As<ScalarLane<TNumber>, double>(ref value);
var (s, c) = Math.SinCos(d);
sin = Unsafe.As<double, ScalarLane<TNumber>>(ref s);
cos = Unsafe.As<double, ScalarLane<TNumber>>(ref c);
}
else
{
sin = value;
cos = value;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -702,6 +720,26 @@ public readonly unsafe struct ScalarLane<TNumber> : ISPMDLane<ScalarLane<TNumber
return Sqrt(Rcp(value));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TNumber ReduceAdd(ScalarLane<TNumber> value)
{
return value.value;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TNumber ReduceMax(ScalarLane<TNumber> value)
{
return value.value;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TNumber ReduceMin(ScalarLane<TNumber> value)
{
return value.value;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ScalarLane<TNumber> Select(ScalarLane<TNumber> conditionMask, ScalarLane<TNumber> ifTrue, ScalarLane<TNumber> ifFalse)
{