Browse Source

FFT: wire provider to Control class

pull/445/head
Christoph Ruegg 10 years ago
parent
commit
0486971c4a
  1. 44
      src/Numerics/Control.cs
  2. 1
      src/Numerics/Numerics.csproj
  3. 5
      src/Numerics/Providers/FourierTransform/IFourierTransformProvider.cs
  4. 4
      src/Numerics/Providers/FourierTransform/ManagedFourierTransformProvider.cs
  5. 14
      src/Numerics/Providers/FourierTransform/Mkl/MklFourierTransformProvider.cs

44
src/Numerics/Control.cs

@ -30,6 +30,7 @@
using MathNet.Numerics.Providers.LinearAlgebra; using MathNet.Numerics.Providers.LinearAlgebra;
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using MathNet.Numerics.Providers.FourierTransform;
namespace MathNet.Numerics namespace MathNet.Numerics
{ {
@ -45,6 +46,7 @@ namespace MathNet.Numerics
static int _parallelizeOrder; static int _parallelizeOrder;
static int _parallelizeElements; static int _parallelizeElements;
static ILinearAlgebraProvider _linearAlgebraProvider; static ILinearAlgebraProvider _linearAlgebraProvider;
static IFourierTransformProvider _fourierTransformProvider;
static readonly object _staticLock = new object(); static readonly object _staticLock = new object();
static Control() static Control()
@ -66,11 +68,11 @@ namespace MathNet.Numerics
TaskScheduler = TaskScheduler.Default; TaskScheduler = TaskScheduler.Default;
} }
private static void InitializeDefaultLinearAlgebraProvider() private static void InitializeDefaultProviders()
{ {
lock (_staticLock) lock (_staticLock)
{ {
if (_linearAlgebraProvider == null) if (_linearAlgebraProvider == null || _fourierTransformProvider == null)
{ {
#if NATIVE #if NATIVE
try try
@ -113,6 +115,7 @@ namespace MathNet.Numerics
public static void UseManaged() public static void UseManaged()
{ {
LinearAlgebraProvider = new ManagedLinearAlgebraProvider(); LinearAlgebraProvider = new ManagedLinearAlgebraProvider();
FourierTransformProvider = new ManagedFourierTransformProvider();
} }
#if NATIVE #if NATIVE
@ -124,6 +127,7 @@ namespace MathNet.Numerics
public static void UseNativeMKL() public static void UseNativeMKL()
{ {
LinearAlgebraProvider = new Providers.LinearAlgebra.Mkl.MklLinearAlgebraProvider(); LinearAlgebraProvider = new Providers.LinearAlgebra.Mkl.MklLinearAlgebraProvider();
FourierTransformProvider = new Providers.FourierTransform.Mkl.MklFourierTransformProvider();
} }
/// <summary> /// <summary>
@ -137,6 +141,7 @@ namespace MathNet.Numerics
Providers.LinearAlgebra.Mkl.MklAccuracy accuracy = Providers.LinearAlgebra.Mkl.MklAccuracy.High) Providers.LinearAlgebra.Mkl.MklAccuracy accuracy = Providers.LinearAlgebra.Mkl.MklAccuracy.High)
{ {
LinearAlgebraProvider = new Providers.LinearAlgebra.Mkl.MklLinearAlgebraProvider(consistency, precision, accuracy); LinearAlgebraProvider = new Providers.LinearAlgebra.Mkl.MklLinearAlgebraProvider(consistency, precision, accuracy);
FourierTransformProvider = new Providers.FourierTransform.Mkl.MklFourierTransformProvider();
} }
/// <summary> /// <summary>
@ -158,6 +163,10 @@ namespace MathNet.Numerics
public static void UseNativeCUDA() public static void UseNativeCUDA()
{ {
LinearAlgebraProvider = new Providers.LinearAlgebra.Cuda.CudaLinearAlgebraProvider(); LinearAlgebraProvider = new Providers.LinearAlgebra.Cuda.CudaLinearAlgebraProvider();
if (_fourierTransformProvider == null)
{
FourierTransformProvider = new ManagedFourierTransformProvider();
}
} }
/// <summary> /// <summary>
@ -179,6 +188,10 @@ namespace MathNet.Numerics
public static void UseNativeOpenBLAS() public static void UseNativeOpenBLAS()
{ {
LinearAlgebraProvider = new Providers.LinearAlgebra.OpenBlas.OpenBlasLinearAlgebraProvider(); LinearAlgebraProvider = new Providers.LinearAlgebra.OpenBlas.OpenBlasLinearAlgebraProvider();
if (_fourierTransformProvider == null)
{
FourierTransformProvider = new ManagedFourierTransformProvider();
}
} }
/// <summary> /// <summary>
@ -226,6 +239,7 @@ namespace MathNet.Numerics
ThreadSafeRandomNumberGenerators = false; ThreadSafeRandomNumberGenerators = false;
LinearAlgebraProvider.InitializeVerify(); LinearAlgebraProvider.InitializeVerify();
FourierTransformProvider.InitializeVerify();
} }
public static void UseMultiThreading() public static void UseMultiThreading()
@ -234,6 +248,7 @@ namespace MathNet.Numerics
ThreadSafeRandomNumberGenerators = true; ThreadSafeRandomNumberGenerators = true;
LinearAlgebraProvider.InitializeVerify(); LinearAlgebraProvider.InitializeVerify();
FourierTransformProvider.InitializeVerify();
} }
/// <summary> /// <summary>
@ -266,7 +281,7 @@ namespace MathNet.Numerics
get get
{ {
if (_linearAlgebraProvider == null) if (_linearAlgebraProvider == null)
InitializeDefaultLinearAlgebraProvider(); InitializeDefaultProviders();
return _linearAlgebraProvider; return _linearAlgebraProvider;
} }
@ -279,6 +294,28 @@ namespace MathNet.Numerics
} }
} }
/// <summary>
/// Gets or sets the fourier transform provider. Consider to use UseNativeMKL or UseManaged instead.
/// </summary>
/// <value>The linear algebra provider.</value>
public static IFourierTransformProvider FourierTransformProvider
{
get
{
if (_fourierTransformProvider == null)
InitializeDefaultProviders();
return _fourierTransformProvider;
}
set
{
value.InitializeVerify();
// only actually set if verification did not throw
_fourierTransformProvider = value;
}
}
/// <summary> /// <summary>
/// Gets or sets a value indicating how many parallel worker threads shall be used /// Gets or sets a value indicating how many parallel worker threads shall be used
/// when parallelization is applicable. /// when parallelization is applicable.
@ -293,6 +330,7 @@ namespace MathNet.Numerics
// Reinitialize providers: // Reinitialize providers:
LinearAlgebraProvider.InitializeVerify(); LinearAlgebraProvider.InitializeVerify();
FourierTransformProvider.InitializeVerify();
} }
} }

1
src/Numerics/Numerics.csproj

@ -174,6 +174,7 @@
</Compile> </Compile>
<Compile Include="Providers\FourierTransform\IFourierTransformProvider.cs" /> <Compile Include="Providers\FourierTransform\IFourierTransformProvider.cs" />
<Compile Include="Providers\FourierTransform\ManagedFourierTransformProvider.cs" /> <Compile Include="Providers\FourierTransform\ManagedFourierTransformProvider.cs" />
<Compile Include="Providers\FourierTransform\Mkl\MklFourierTransformProvider.cs" />
<Compile Include="Providers\LinearAlgebra\Acml\AcmlLinearAlgebraProvider.Complex.cs" /> <Compile Include="Providers\LinearAlgebra\Acml\AcmlLinearAlgebraProvider.Complex.cs" />
<Compile Include="Providers\LinearAlgebra\Acml\AcmlLinearAlgebraProvider.Complex32.cs" /> <Compile Include="Providers\LinearAlgebra\Acml\AcmlLinearAlgebraProvider.Complex32.cs" />
<Compile Include="Providers\LinearAlgebra\Acml\AcmlLinearAlgebraProvider.Double.cs" /> <Compile Include="Providers\LinearAlgebra\Acml\AcmlLinearAlgebraProvider.Double.cs" />

5
src/Numerics/Providers/FourierTransform/IFourierTransformProvider.cs

@ -36,6 +36,11 @@ namespace MathNet.Numerics.Providers.FourierTransform
public interface IFourierTransformProvider public interface IFourierTransformProvider
{ {
/// <summary>
/// Initialize and verify that the provided is indeed available. If not, fall back to alternatives like the managed provider
/// </summary>
void InitializeVerify();
void ForwardInplace(Complex[] complex); void ForwardInplace(Complex[] complex);
void BackwardInplace(Complex[] complex); void BackwardInplace(Complex[] complex);

4
src/Numerics/Providers/FourierTransform/ManagedFourierTransformProvider.cs

@ -5,6 +5,10 @@ namespace MathNet.Numerics.Providers.FourierTransform
{ {
public class ManagedFourierTransformProvider : IFourierTransformProvider public class ManagedFourierTransformProvider : IFourierTransformProvider
{ {
public virtual void InitializeVerify()
{
}
public void ForwardInplace(Complex[] complex) public void ForwardInplace(Complex[] complex)
{ {
Fourier.BluesteinForward(complex, FourierOptions.Default); Fourier.BluesteinForward(complex, FourierOptions.Default);

14
src/Numerics/Providers/FourierTransform/Mkl/MklFourierTransformProvider.cs

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MathNet.Numerics.Providers.FourierTransform.Mkl
{
public class MklFourierTransformProvider : ManagedFourierTransformProvider
{
public override void InitializeVerify()
{
}
}
}
Loading…
Cancel
Save