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(int baseIndex, 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 remaining = totalIteration - baseIndex;
if (remaining >= WideLane.LaneWidth)
{
innerJob.Execute>(baseIndex, in ctx);
}
else
{
for (var j = 0; j < remaining; j++)
{
innerJob.Execute>(baseIndex + j, 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>(loopIndex, 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(int baseIndex, 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 remaining = totalIteration - baseIndex;
if (remaining >= WideLane.LaneWidth)
{
innerJob.Execute, WideLane>(baseIndex, in ctx);
}
else
{
for (var j = 0; j < remaining; j++)
{
innerJob.Execute, ScalarLane>(baseIndex + j, 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>(loopIndex, 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(int baseIndex, 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 remaining = totalIteration - baseIndex;
if (remaining >= WideLane.LaneWidth)
{
innerJob.Execute, WideLane, WideLane>(baseIndex, in ctx);
}
else
{
for (var j = 0; j < remaining; j++)
{
innerJob.Execute, ScalarLane, ScalarLane>(baseIndex + j, 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>(loopIndex, 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(int baseIndex, 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 remaining = totalIteration - baseIndex;
if (remaining >= WideLane.LaneWidth)
{
innerJob.Execute, WideLane, WideLane, WideLane>(baseIndex, in ctx);
}
else
{
for (var j = 0; j < remaining; j++)
{
innerJob.Execute, ScalarLane, ScalarLane, ScalarLane>(baseIndex + j, 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>(loopIndex, 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(int baseIndex, 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 remaining = totalIteration - baseIndex;
if (remaining >= WideLane.LaneWidth)
{
innerJob.Execute, WideLane, WideLane, WideLane, WideLane>(baseIndex, in ctx);
}
else
{
for (var j = 0; j < remaining; j++)
{
innerJob.Execute, ScalarLane, ScalarLane, ScalarLane, ScalarLane>(baseIndex + j, in ctx);
}
}
}
}
internal struct SPMDScalerJobWrapper : IJobParallelFor
where T : IJobSPMD