diff --git a/src/Numerics/Providers/Common/Mkl/MklProvider.cs b/src/Numerics/Providers/Common/Mkl/MklProvider.cs index acd3563c..a7f3aca2 100644 --- a/src/Numerics/Providers/Common/Mkl/MklProvider.cs +++ b/src/Numerics/Providers/Common/Mkl/MklProvider.cs @@ -72,7 +72,18 @@ namespace MathNet.Numerics.Providers.Common.Mkl } /// Revision - internal static int Load(string hintPath = null) + public static int Load(string hintPath = null) + { + return Load(hintPath, MklConsistency.Auto, MklPrecision.Double, MklAccuracy.High); + } + + /// Revision + [CLSCompliant(false)] + public static int Load( + string hintPath = null, + MklConsistency consistency = MklConsistency.Auto, + MklPrecision precision = MklPrecision.Double, + MklAccuracy accuracy = MklAccuracy.High) { if (_loaded) { @@ -92,6 +103,19 @@ namespace MathNet.Numerics.Providers.Common.Mkl _nativeX64 = SafeNativeMethods.query_capability((int)ProviderPlatform.x64) > 0; _nativeIA64 = SafeNativeMethods.query_capability((int)ProviderPlatform.ia64) > 0; + // set numerical consistency, precision and accuracy modes, if supported + if (SafeNativeMethods.query_capability((int)ProviderConfig.Precision) > 0) + { + SafeNativeMethods.set_consistency_mode((int)consistency); + SafeNativeMethods.set_vml_mode((uint)precision | (uint)accuracy); + } + + // set threading settings, if supported + if (SafeNativeMethods.query_capability((int)ProviderConfig.Threading) > 0) + { + SafeNativeMethods.set_max_threads(Control.MaxDegreeOfParallelism); + } + _mklVersion = new Version( SafeNativeMethods.query_capability((int)ProviderConfig.MklMajorVersion), SafeNativeMethods.query_capability((int)ProviderConfig.MklMinorVersion), @@ -115,45 +139,10 @@ namespace MathNet.Numerics.Providers.Common.Mkl throw new NotSupportedException("MKL Native Provider too old. Consider upgrading to a newer version."); } - // set threading settings, if supported - if (SafeNativeMethods.query_capability((int)ProviderConfig.Threading) > 0) - { - SafeNativeMethods.set_max_threads(Control.MaxDegreeOfParallelism); - } - _loaded = true; return _nativeRevision; } - internal static void ConfigureThreading() - { - if (!_loaded) - { - throw new InvalidOperationException(); - } - - // set threading settings, if supported - if (SafeNativeMethods.query_capability((int)ProviderConfig.Threading) > 0) - { - SafeNativeMethods.set_max_threads(Control.MaxDegreeOfParallelism); - } - } - - internal static void ConfigurePrecision(MklConsistency consistency, MklPrecision precision, MklAccuracy accuracy) - { - if (!_loaded) - { - throw new InvalidOperationException(); - } - - // set numerical consistency, precision and accuracy modes, if supported - if (SafeNativeMethods.query_capability((int)ProviderConfig.Precision) > 0) - { - SafeNativeMethods.set_consistency_mode((int)consistency); - SafeNativeMethods.set_vml_mode((uint)precision | (uint)accuracy); - } - } - /// /// Frees memory buffers, caches and handles allocated in or to the provider. /// Does not unload the provider itself, it is still usable afterwards. diff --git a/src/Numerics/Providers/Common/OpenBlas/OpenBlasProvider.cs b/src/Numerics/Providers/Common/OpenBlas/OpenBlasProvider.cs index 971c6368..af4d4d7c 100644 --- a/src/Numerics/Providers/Common/OpenBlas/OpenBlasProvider.cs +++ b/src/Numerics/Providers/Common/OpenBlas/OpenBlasProvider.cs @@ -34,7 +34,7 @@ using System.Collections.Generic; namespace MathNet.Numerics.Providers.Common.OpenBlas { - internal static class OpenBlasProvider + public static class OpenBlasProvider { const int _designTimeRevision = 1; const int _minimumCompatibleRevision = 1; diff --git a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.cs b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.cs index 1798f2e9..a8157500 100644 --- a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.cs +++ b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.cs @@ -92,14 +92,12 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl /// public override void InitializeVerify() { - int revision = MklProvider.Load(hintPath: _hintPath); + int revision = MklProvider.Load(_hintPath, _consistency, _precision, _accuracy); if (revision < _minimumCompatibleRevision) { throw new NotSupportedException($"MKL Native Provider revision r{revision} is too old. Consider upgrading to a newer version. Revision r{_minimumCompatibleRevision} and newer are supported."); } - MklProvider.ConfigurePrecision(_consistency, _precision, _accuracy); - _linearAlgebraMajor = SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMajor); _linearAlgebraMinor = SafeNativeMethods.query_capability((int)ProviderCapability.LinearAlgebraMinor); _vectorFunctionsMajor = SafeNativeMethods.query_capability((int)ProviderCapability.VectorFunctionsMajor);