Browse Source

LA: DoModulus should be parallelized and avoid range checks #110

v2
Christoph Ruegg 14 years ago
parent
commit
dc05000d03
  1. 2
      src/Numerics/LinearAlgebra/Complex/Vector.cs
  2. 2
      src/Numerics/LinearAlgebra/Complex32/Vector.cs
  3. 20
      src/Numerics/LinearAlgebra/Double/DenseVector.cs
  4. 4
      src/Numerics/LinearAlgebra/Double/Vector.cs
  5. 20
      src/Numerics/LinearAlgebra/Single/DenseVector.cs
  6. 4
      src/Numerics/LinearAlgebra/Single/Vector.cs

2
src/Numerics/LinearAlgebra/Complex/Vector.cs

@ -200,7 +200,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <param name="result">A vector to store the results in.</param>
protected override void DoModulus(Complex divisor, Vector<Complex> result)
{
throw new NotImplementedException();
throw new NotSupportedException();
}
/// <summary>

2
src/Numerics/LinearAlgebra/Complex32/Vector.cs

@ -200,7 +200,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <param name="result">A vector to store the results in.</param>
protected override void DoModulus(Complex32 divisor, Vector<Complex32> result)
{
throw new NotImplementedException();
throw new NotSupportedException();
}
/// <summary>

20
src/Numerics/LinearAlgebra/Double/DenseVector.cs

@ -494,20 +494,20 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <param name="result">A vector to store the results in.</param>
protected override void DoModulus(double divisor, Vector<double> result)
{
var denseResult = result as DenseVector;
if (denseResult == null)
var dense = result as DenseVector;
if (dense == null)
{
for (var index = 0; index < _length; index++)
{
result.At(index, _values[index] % divisor);
}
base.DoModulus(divisor, result);
}
else
{
for (var index = 0; index < _length; index++)
{
denseResult._values[index] = _values[index] % divisor;
}
CommonParallel.For(0, _length, 4096, (a, b) =>
{
for (int i = a; i < b; i++)
{
dense._values[i] = _values[i]%divisor;
}
});
}
}

4
src/Numerics/LinearAlgebra/Double/Vector.cs

@ -199,9 +199,9 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <param name="result">A vector to store the results in.</param>
protected override void DoModulus(double divisor, Vector<double> result)
{
for (var index = 0; index < Count; index++)
for (int i = 0; i < Count; i++)
{
result[index] = At(index) % divisor;
result.At(i, At(i)%divisor);
}
}

20
src/Numerics/LinearAlgebra/Single/DenseVector.cs

@ -483,20 +483,20 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <param name="result">A vector to store the results in.</param>
protected override void DoModulus(float divisor, Vector<float> result)
{
var denseResult = result as DenseVector;
if (denseResult == null)
var dense = result as DenseVector;
if (dense == null)
{
for (var index = 0; index < _length; index++)
{
result.At(index, _values[index] % divisor);
}
base.DoModulus(divisor, result);
}
else
{
for (var index = 0; index < _length; index++)
{
denseResult._values[index] = _values[index] % divisor;
}
CommonParallel.For(0, _length, 4096, (a, b) =>
{
for (int i = a; i < b; i++)
{
dense._values[i] = _values[i]%divisor;
}
});
}
}

4
src/Numerics/LinearAlgebra/Single/Vector.cs

@ -199,9 +199,9 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <param name="result">A vector to store the results in.</param>
protected override void DoModulus(float divisor, Vector<float> result)
{
for (var index = 0; index < Count; index++)
for (int i = 0; i < Count; i++)
{
result.At(index, At(index) % divisor);
result.At(i, At(i)%divisor);
}
}

Loading…
Cancel
Save