add scheduler method; fixing buffer parallel errors
This commit is contained in:
@@ -68,10 +68,10 @@ namespace StgSharp.Mathematics.Numeric
|
||||
MatrixParallel.ReturnParallelResources(ref pool);
|
||||
return ans;
|
||||
}
|
||||
MatrixParallelTaskPackage<float>* package = MatrixParallelFactory.CreateBaseTask<float>();
|
||||
package->Left = left.Buffer;
|
||||
package->Right = right.Buffer;
|
||||
package->Result = ans.Buffer;
|
||||
MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask<float>();
|
||||
package->Left = (nint)left.Buffer;
|
||||
package->Right = (nint)right.Buffer;
|
||||
package->Result = (nint)ans.Buffer;
|
||||
package->ElementSize = sizeof(float);
|
||||
package->PrimCount = left.KernelColumnLength;
|
||||
package->SecCount = left.KernelRowLength;
|
||||
@@ -80,41 +80,37 @@ namespace StgSharp.Mathematics.Numeric
|
||||
MatrixParallelHandle taskGroup = MatrixParallel.ScheduleTask(package);
|
||||
|
||||
MatrixParallel.LaunchParallel(taskGroup, SleepMode.DeepSleep);
|
||||
/*
|
||||
* run parallel
|
||||
*/
|
||||
MatrixParallelFactory.Release(package);
|
||||
taskGroup.Dispose();
|
||||
return ans;
|
||||
}
|
||||
|
||||
public static unsafe void Fill<T>(this Matrix<float> right, T value) where T : unmanaged, INumber<T>
|
||||
public static unsafe void Fill<T>(this Matrix<float> ans, T value) where T : unmanaged, INumber<T>
|
||||
{
|
||||
long count = (long)right.KernelColumnLength * right.KernelRowLength;
|
||||
ScalarPacket* scaler = MatrixParallelFactory.CreateScalarPacket();
|
||||
scaler->Data<T>(0) = value;
|
||||
long count = (long)ans.KernelColumnLength * ans.KernelRowLength;
|
||||
ScalarPacket* scalar = MatrixParallelFactory.CreateScalarPacket();
|
||||
scalar->Data<T>(0) = value;
|
||||
if (count <= 256)
|
||||
{
|
||||
NativeIntrinsic.Intrinsic.f32_fill(right.Buffer, scaler, count);
|
||||
NativeIntrinsic.Intrinsic.f32_fill(ans.Buffer, scalar, count);
|
||||
return;
|
||||
} else if (count <= 1024)
|
||||
{
|
||||
MatrixParallelThread[] pool = MatrixParallel.LeadParallel(1);
|
||||
|
||||
NativeIntrinsic.Intrinsic.f32_fill(right.Buffer, scaler, count);
|
||||
|
||||
NativeIntrinsic.Intrinsic.f32_fill(ans.Buffer, scalar, count);
|
||||
MatrixParallel.ReturnParallelResources(ref pool);
|
||||
return;
|
||||
}
|
||||
MatrixParallelHandle taskGroup =/**/ default
|
||||
/*MatrixParallel.PublicNoAnswerTask(left.GetColumnEnumeration(), scaler,
|
||||
(delegate* unmanaged[Cdecl]<MatrixKernel<float>*, ScalarPacket*, void>)NativeIntrinsic.Intrinsic.f32_add)
|
||||
/**/;
|
||||
MatrixParallelTaskPackage* package = MatrixParallelFactory.CreateBaseTask<float>();
|
||||
package->Result = (nint)ans.Buffer;
|
||||
package->ElementSize = sizeof(float);
|
||||
package->PrimCount = ans.KernelColumnLength;
|
||||
package->SecCount = ans.KernelRowLength;
|
||||
package->ComputeMode = new MatrixOpMode(MatrixOperationStyle.BUFFER_OP, MatrixOperationParam.ANS_SCALAR_PARAM);
|
||||
package->ComputeHandle = (IntPtr)NativeIntrinsic.Intrinsic.f32_fill;
|
||||
package->Scalar = scalar;
|
||||
MatrixParallelHandle taskGroup = MatrixParallel.ScheduleTask(package);
|
||||
MatrixParallel.LaunchParallel(taskGroup, SleepMode.DeepSleep);
|
||||
/*
|
||||
* run parallel
|
||||
*/
|
||||
MatrixParallelFactory.Release(scaler);
|
||||
|
||||
taskGroup.Dispose();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user