예제 #1
0
        public static bool IsAvailable(string hintPath = null)
        {
            if (_loaded)
            {
                return(true);
            }

            if (AppSwitches.DisableNativeProviders || AppSwitches.DisableMklNativeProvider)
            {
                return(false);
            }

            try
            {
                if (!NativeProviderLoader.TryLoad(SafeNativeMethods.DllName, hintPath))
                {
                    return(false);
                }

                int a = SafeNativeMethods.query_capability(0);
                int b = SafeNativeMethods.query_capability(1);
                int nativeRevision = SafeNativeMethods.query_capability((int)ProviderConfig.Revision);
                return(a == 0 && b == -1 && nativeRevision >= MinimumCompatibleRevision);
            }
            catch
            {
                return(false);
            }
        }
예제 #2
0
        /// <returns>Revision</returns>
        public static int Load(
            string hintPath            = null,
            MklConsistency consistency = MklConsistency.Auto,
            MklPrecision precision     = MklPrecision.Double,
            MklAccuracy accuracy       = MklAccuracy.High)
        {
            if (_loaded)
            {
                return(_nativeRevision);
            }

            if (AppSwitches.DisableNativeProviders || AppSwitches.DisableMklNativeProvider)
            {
                throw new NotSupportedException("MKL Native Provider support is actively disabled by AppSwitches.");
            }

            int a, b;

            try
            {
                NativeProviderLoader.TryLoad(SafeNativeMethods.DllName, hintPath);

                a = SafeNativeMethods.query_capability(0);
                b = SafeNativeMethods.query_capability(1);
                _nativeRevision = SafeNativeMethods.query_capability((int)ProviderConfig.Revision);

                _nativeX86  = SafeNativeMethods.query_capability((int)ProviderPlatform.x86) > 0;
                _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),
                    SafeNativeMethods.query_capability((int)ProviderConfig.MklUpdateVersion));
            }
            catch (DllNotFoundException e)
            {
                throw new NotSupportedException("MKL Native Provider not found.", e);
            }
            catch (BadImageFormatException e)
            {
                throw new NotSupportedException("MKL Native Provider found but failed to load. Please verify that the platform matches (x64 vs x32, Windows vs Linux).", e);
            }
            catch (EntryPointNotFoundException e)
            {
                throw new NotSupportedException("MKL Native Provider does not support capability querying and is therefore not compatible. Consider upgrading to a newer version.", e);
            }

            if (a != 0 || b != -1 || _nativeRevision < MinimumCompatibleRevision)
            {
                throw new NotSupportedException("MKL Native Provider too old. Consider upgrading to a newer version.");
            }

            _loaded = true;
            return(_nativeRevision);
        }