@ -46,6 +46,7 @@ namespace MathNet.Numerics
static int _ parallelizeOrder ;
static int _ parallelizeElements ;
static ILinearAlgebraProvider _l inearAlgebraProvider ;
static readonly object _ staticLock = new object ( ) ;
static Control ( )
{
@ -64,48 +65,50 @@ namespace MathNet.Numerics
_ parallelizeOrder = 6 4 ;
_ parallelizeElements = 3 0 0 ;
TaskScheduler = TaskScheduler . Default ;
}
// Linear Algebra Provider
#if PORTABLE
LinearAlgebraProvider = new ManagedLinearAlgebraProvider ( ) ;
#else
try
private static void InitializeDefaultLinearAlgebraProvider ( )
{
lock ( _ staticLock )
{
var value = Environment . GetEnvironmentVariable ( EnvVarLAProvider ) ;
switch ( value ! = null ? value . ToUpperInvariant ( ) : string . Empty )
if ( _l inearAlgebraProvider = = null )
{
#if NATIVE
case "MKL" :
UseNativeMKL ( ) ;
break ;
case "CUDA" :
UseNativeCUDA ( ) ;
break ;
case "OPENBLAS" :
UseNativeOpenBLAS ( ) ;
break ;
default :
if ( ! TryUseNative ( ) )
try
{
var value = Environment . GetEnvironmentVariable ( EnvVarLAProvider ) ;
switch ( value ! = null ? value . ToUpperInvariant ( ) : string . Empty )
{
UseManaged ( ) ;
case "MKL" :
UseNativeMKL ( ) ;
break ;
case "CUDA" :
UseNativeCUDA ( ) ;
break ;
case "OPENBLAS" :
UseNativeOpenBLAS ( ) ;
break ;
default :
if ( ! TryUseNative ( ) )
{
UseManaged ( ) ;
}
break ;
}
break ;
#else
default :
}
catch
{
// We don't care about any failures here at all (because "auto")
UseManaged ( ) ;
break ;
}
#else
UseManaged ( ) ;
#endif
}
}
catch
{
// We don't care about any failures here at all (because "auto")
UseManaged ( ) ;
}
#endif
}
public static void UseManaged ( )
@ -261,7 +264,13 @@ namespace MathNet.Numerics
/// <value>The linear algebra provider.</value>
public static ILinearAlgebraProvider LinearAlgebraProvider
{
get { return _l inearAlgebraProvider ; }
get
{
if ( _l inearAlgebraProvider = = null )
InitializeDefaultLinearAlgebraProvider ( ) ;
return _l inearAlgebraProvider ;
}
set
{
value . InitializeVerify ( ) ;