using Misaki.HighPerformance.Jobs;
using System.Numerics;
namespace Misaki.HighPerformance.Mathematics.SPMD;
///
/// A job interface for Single Program Multiple Data (SPMD) execution, allowing for efficient parallel processing of data across multiple lanes.
///
///
/// Always use TNumber0 as the primary type for determining lane width and job scheduling, even if it's not used in the job execution.
///
/// The first numeric type used in the SPMD job.
public interface IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
void Execute(TLane0 indices, TLane0 mask, ref readonly JobExecutionContext ctx)
where TLane0 : unmanaged, ISPMDLane;
}
internal struct SPMDJobWrapper : IJobParallelFor
where T : IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
public T innerJob;
public int totalIteration;
public void Execute(int loopIndex, ref readonly JobExecutionContext ctx)
{
var baseIndex = loopIndex * WideLane.LaneWidth;
var indices = WideLane.Sequence(TNumber0.CreateTruncating(baseIndex), TNumber0.One);
var mask = indices < TNumber0.CreateTruncating(totalIteration);
innerJob.Execute>(indices, mask, in ctx);
}
}
internal struct SPMDScalerJobWrapper : IJobParallelFor
where T : IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
public T innerJob;
public int totalIteration;
public void Execute(int loopIndex, ref readonly JobExecutionContext ctx)
{
innerJob.Execute>(TNumber0.CreateTruncating(loopIndex), ScalarLane.AllBitsSet, in ctx);
}
}
///
/// A job interface for Single Program Multiple Data (SPMD) execution, allowing for efficient parallel processing of data across multiple lanes.
///
///
/// Always use TNumber0 as the primary type for determining lane width and job scheduling, even if it's not used in the job execution.
///
/// The first numeric type used in the SPMD job.
/// The first numeric type used in the SPMD job.
public interface IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
void Execute(TLane0 indices, TLane0 mask, ref readonly JobExecutionContext ctx)
where TLane0 : unmanaged, ISPMDLane
where TLane1 : unmanaged, ISPMDLane;
}
internal struct SPMDJobWrapper : IJobParallelFor
where T : IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
public T innerJob;
public int totalIteration;
public void Execute(int loopIndex, ref readonly JobExecutionContext ctx)
{
var baseIndex = loopIndex * WideLane.LaneWidth;
var indices = WideLane.Sequence(TNumber0.CreateTruncating(baseIndex), TNumber0.One);
var mask = indices < TNumber0.CreateTruncating(totalIteration);
innerJob.Execute, WideLane>(indices, mask, in ctx);
}
}
internal struct SPMDScalerJobWrapper : IJobParallelFor
where T : IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
public T innerJob;
public int totalIteration;
public void Execute(int loopIndex, ref readonly JobExecutionContext ctx)
{
innerJob.Execute, ScalarLane>(TNumber0.CreateTruncating(loopIndex), ScalarLane.AllBitsSet, in ctx);
}
}
///
/// A job interface for Single Program Multiple Data (SPMD) execution, allowing for efficient parallel processing of data across multiple lanes.
///
///
/// Always use TNumber0 as the primary type for determining lane width and job scheduling, even if it's not used in the job execution.
///
/// The first numeric type used in the SPMD job.
/// The first numeric type used in the SPMD job.
/// The first numeric type used in the SPMD job.
public interface IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber2 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
void Execute(TLane0 indices, TLane0 mask, ref readonly JobExecutionContext ctx)
where TLane0 : unmanaged, ISPMDLane
where TLane1 : unmanaged, ISPMDLane
where TLane2 : unmanaged, ISPMDLane;
}
internal struct SPMDJobWrapper : IJobParallelFor
where T : IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber2 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
public T innerJob;
public int totalIteration;
public void Execute(int loopIndex, ref readonly JobExecutionContext ctx)
{
var baseIndex = loopIndex * WideLane.LaneWidth;
var indices = WideLane.Sequence(TNumber0.CreateTruncating(baseIndex), TNumber0.One);
var mask = indices < TNumber0.CreateTruncating(totalIteration);
innerJob.Execute, WideLane, WideLane>(indices, mask, in ctx);
}
}
internal struct SPMDScalerJobWrapper : IJobParallelFor
where T : IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber2 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
public T innerJob;
public int totalIteration;
public void Execute(int loopIndex, ref readonly JobExecutionContext ctx)
{
innerJob.Execute, ScalarLane, ScalarLane>(TNumber0.CreateTruncating(loopIndex), ScalarLane.AllBitsSet, in ctx);
}
}
///
/// A job interface for Single Program Multiple Data (SPMD) execution, allowing for efficient parallel processing of data across multiple lanes.
///
///
/// Always use TNumber0 as the primary type for determining lane width and job scheduling, even if it's not used in the job execution.
///
/// The first numeric type used in the SPMD job.
/// The first numeric type used in the SPMD job.
/// The first numeric type used in the SPMD job.
/// The first numeric type used in the SPMD job.
public interface IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber2 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber3 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
void Execute(TLane0 indices, TLane0 mask, ref readonly JobExecutionContext ctx)
where TLane0 : unmanaged, ISPMDLane
where TLane1 : unmanaged, ISPMDLane
where TLane2 : unmanaged, ISPMDLane
where TLane3 : unmanaged, ISPMDLane;
}
internal struct SPMDJobWrapper : IJobParallelFor
where T : IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber2 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber3 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
public T innerJob;
public int totalIteration;
public void Execute(int loopIndex, ref readonly JobExecutionContext ctx)
{
var baseIndex = loopIndex * WideLane.LaneWidth;
var indices = WideLane.Sequence(TNumber0.CreateTruncating(baseIndex), TNumber0.One);
var mask = indices < TNumber0.CreateTruncating(totalIteration);
innerJob.Execute, WideLane, WideLane, WideLane>(indices, mask, in ctx);
}
}
internal struct SPMDScalerJobWrapper : IJobParallelFor
where T : IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber2 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber3 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
public T innerJob;
public int totalIteration;
public void Execute(int loopIndex, ref readonly JobExecutionContext ctx)
{
innerJob.Execute, ScalarLane, ScalarLane, ScalarLane>(TNumber0.CreateTruncating(loopIndex), ScalarLane.AllBitsSet, in ctx);
}
}
///
/// A job interface for Single Program Multiple Data (SPMD) execution, allowing for efficient parallel processing of data across multiple lanes.
///
///
/// Always use TNumber0 as the primary type for determining lane width and job scheduling, even if it's not used in the job execution.
///
/// The first numeric type used in the SPMD job.
/// The first numeric type used in the SPMD job.
/// The first numeric type used in the SPMD job.
/// The first numeric type used in the SPMD job.
/// The first numeric type used in the SPMD job.
public interface IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber2 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber3 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber4 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
void Execute(TLane0 indices, TLane0 mask, ref readonly JobExecutionContext ctx)
where TLane0 : unmanaged, ISPMDLane
where TLane1 : unmanaged, ISPMDLane
where TLane2 : unmanaged, ISPMDLane
where TLane3 : unmanaged, ISPMDLane
where TLane4 : unmanaged, ISPMDLane;
}
internal struct SPMDJobWrapper : IJobParallelFor
where T : IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber2 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber3 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber4 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
public T innerJob;
public int totalIteration;
public void Execute(int loopIndex, ref readonly JobExecutionContext ctx)
{
var baseIndex = loopIndex * WideLane.LaneWidth;
var indices = WideLane.Sequence(TNumber0.CreateTruncating(baseIndex), TNumber0.One);
var mask = indices < TNumber0.CreateTruncating(totalIteration);
innerJob.Execute, WideLane, WideLane, WideLane, WideLane>(indices, mask, in ctx);
}
}
internal struct SPMDScalerJobWrapper : IJobParallelFor
where T : IJobSPMD
where TNumber0 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber1 : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
where TNumber2 : unmanaged, INumber, IBinaryNumber, IMinMaxValue