Browse Source

LA-MKL: query capability levels once, at initialization

benchmark-la
Christoph Ruegg 10 years ago
parent
commit
280ee8b0b2
  1. 3
      src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex.cs
  2. 3
      src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex32.cs
  3. 3
      src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Double.cs
  4. 3
      src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Single.cs
  5. 14
      src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.cs

3
src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex.cs

@ -1068,8 +1068,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
/// routine.</remarks>
public override void PointWisePowerArrays(Complex[] x, Complex[] y, Complex[] result)
{
if (SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMajor) != 0 ||
SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMinor) < 1)
if (_vectorFunctionsMajor != 0 || _vectorFunctionsMinor < 1)
{
base.PointWisePowerArrays(x, y, result);
}

3
src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex32.cs

@ -1098,8 +1098,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
/// routine.</remarks>
public override void PointWisePowerArrays(Complex32[] x, Complex32[] y, Complex32[] result)
{
if (SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMajor) != 0 ||
SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMinor) < 1)
if (_vectorFunctionsMajor != 0 || _vectorFunctionsMinor < 1)
{
base.PointWisePowerArrays(x, y, result);
}

3
src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Double.cs

@ -1103,8 +1103,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
/// routine.</remarks>
public override void PointWisePowerArrays(double[] x, double[] y, double[] result)
{
if (SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMajor) != 0 ||
SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMinor) < 1)
if (_vectorFunctionsMajor != 0 || _vectorFunctionsMinor < 1)
{
base.PointWisePowerArrays(x, y, result);
}

3
src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Single.cs

@ -1098,8 +1098,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
/// routine.</remarks>
public override void PointWisePowerArrays(float[] x, float[] y, float[] result)
{
if (SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMajor) != 0 ||
SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMinor) < 1)
if (_vectorFunctionsMajor != 0 || _vectorFunctionsMinor < 1)
{
base.PointWisePowerArrays(x, y, result);
}

14
src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.cs

@ -90,6 +90,11 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
readonly Common.Mkl.MklPrecision _precision;
readonly Common.Mkl.MklAccuracy _accuracy;
int _linearAlgebraMajor;
int _linearAlgebraMinor;
int _vectorFunctionsMajor;
int _vectorFunctionsMinor;
/// <param name="consistency">
/// Sets the desired bit consistency on repeated identical computations on varying CPU architectures,
/// as a trade-off with performance.
@ -150,12 +155,15 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
MklProvider.Load(minRevision: 4);
MklProvider.ConfigurePrecision(_consistency, _precision, _accuracy);
int linearAlgebra = SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMajor);
_linearAlgebraMajor = SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMajor);
_linearAlgebraMinor = SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMinor);
_vectorFunctionsMajor = SafeNativeMethods.query_capability((int)ProviderCapability.VectorFunctionsMajor);
_vectorFunctionsMinor = SafeNativeMethods.query_capability((int)ProviderCapability.VectorFunctionsMinor);
// we only support exactly one major version, since major version changes imply a breaking change.
if (linearAlgebra != 2)
if (_linearAlgebraMajor != 2)
{
throw new NotSupportedException(string.Format("MKL Native Provider not compatible. Expecting linear algebra v2 but provider implements v{0}.", linearAlgebra));
throw new NotSupportedException(string.Format("MKL Native Provider not compatible. Expecting linear algebra v2 but provider implements v{0}.", _linearAlgebraMajor));
}
}

Loading…
Cancel
Save