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:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user