Ejemplo n.º 1
0
        /// <summary>
        /// Creates a 3D plan.
        /// </summary>
        /// <param name="fftType">Type of FFT.</param>
        /// <param name="dataType">Data type.</param>
        /// <param name="nx">The number of samples in x dimension.</param>
        /// <param name="ny">The number of samples in y dimension.</param>
        /// <param name="nz">The number of samples in z dimension.</param>
        /// <param name="batchSize">Size of batch.</param>
        /// <returns>Plan.</returns>
        public override FFTPlan3D Plan3D(eFFTType fftType, eDataType dataType, int nx, int ny, int nz, int batchSize)
        {
            int         insize, outsize;
            CUFFTType   cuFFTType = VerifyTypes(fftType, dataType, out insize, out outsize);
            cufftHandle handle    = new cufftHandle();

            CUFFTResult res;

            if (batchSize <= 1)
            {
                res = _driver.cufftPlan3d(ref handle, nx, ny, nz, cuFFTType);
            }
            else
            {
                res = _driver.cufftPlanMany(ref handle, 3, new int[] { nx, ny, nz }, null, 1, 0, null, 1, 0, cuFFTType, batchSize);
            }

            if (res != CUFFTResult.Success)
            {
                throw new CudafyHostException(res.ToString());
            }
            FFTPlan3D   plan   = new FFTPlan3D(nx, ny, nz, batchSize, this);
            FFTPlan3DEx planEx = new FFTPlan3DEx(plan)
            {
                CudaFFTHandle = handle, CudaFFTType = cuFFTType, DataType = dataType
            };

            Plans.Add(plan, planEx);
            return(plan);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Verifies the types.
        /// </summary>
        /// <param name="fftType">Type of the FFT.</param>
        /// <param name="dataType">Type of the data.</param>
        /// <param name="inSize">Size of input elements.</param>
        /// <param name="outSize">Size of output elements.</param>
        /// <returns>The CUFFTType.</returns>
        protected CUFFTType VerifyTypes(eFFTType fftType, eDataType dataType, out int inSize, out int outSize)
        {
            inSize  = 8;
            outSize = 8;
            bool isDouble = dataType == eDataType.Double;

            CUFFTType cuFftType;

            if (fftType == eFFTType.Complex2Complex)
            {
                cuFftType = isDouble ? CUFFTType.Z2Z : CUFFTType.C2C;
            }
            else if (fftType == eFFTType.Complex2Real)
            {
                cuFftType = isDouble ? CUFFTType.Z2D : CUFFTType.C2R;
            }
            else //if (fftType == eFFTType.Real2Complex)
            {
                cuFftType = isDouble ? CUFFTType.D2Z : CUFFTType.R2C;
            }

            inSize  = ((fftType == eFFTType.Complex2Complex || fftType == eFFTType.Complex2Real) ? 8 : 4) * (isDouble ? 2 : 1);
            outSize = ((fftType == eFFTType.Complex2Complex || fftType == eFFTType.Real2Complex) ? 8 : 4) * (isDouble ? 2 : 1);

            return(cuFftType);
        }
Ejemplo n.º 3
0
        public static fftwf_plan dft_many(eFFTType fftType, int rank, int[] n, int batch,
                                          IntPtr input, int[] inembed,
                                          int istride, int idist,
                                          IntPtr output, int[] onembed,
                                          int ostride, int odist,
                                          fftw_direction sign, fftw_flags flags)
        {
            fftwf_plan p = new fftwf_plan();

            if (fftType == eFFTType.Complex2Complex)
            {
                p._handle = fftwf.many_dft(rank, n, batch, input, inembed, istride, idist, output, onembed, ostride, odist, sign, flags);
            }
            else if (fftType == eFFTType.Real2Complex)
            {
                p._handle = fftwf.many_dft_r2c(rank, n, batch, input, inembed, istride, idist, output, onembed, ostride, odist, flags);
            }
            else if (fftType == eFFTType.Complex2Real)
            {
                p._handle = fftwf.many_dft_c2r(rank, n, batch, input, inembed, istride, idist, output, onembed, ostride, odist, flags);
            }
            p.Input  = input;
            p.Output = output;
            return(p);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Creates a 3D plan.
        /// </summary>
        /// <param name="fftType">Type of FFT.</param>
        /// <param name="dataType">The data type.</param>
        /// <param name="nx">The x length in samples.</param>
        /// <param name="ny">The y length in samples.</param>
        /// <param name="nz">The z length in samples.</param>
        /// <param name="batch">The number of FFTs in batch.</param>
        /// <returns>
        /// Plan.
        /// </returns>
        public override FFTPlan3D Plan3D(eFFTType fftType, eDataType dataType, int nx, int ny, int nz, int batch = 1)
        {
            int       insize, outsize;
            int       totalSize = nx * ny * nz;
            CUFFTType cuFFTType = VerifyTypes(fftType, dataType, out insize, out outsize);
            //Console.WriteLine(size);
            IntPtr pin  = fftwf.malloc(totalSize * insize * batch);
            IntPtr pout = fftwf.malloc(totalSize * outsize * batch);

            Ifftw_plan fwdPlan;
            Ifftw_plan invPlan;

            if (dataType == eDataType.Single)
            {
                if (batch == 1)
                {
                    fwdPlan = fftwf_plan.dft_3d(fftType, nx, ny, nz, pin, pout, fftw_direction.Forward, fftw_flags.Estimate);
                    invPlan = fftwf_plan.dft_3d(fftType, nx, ny, nz, pin, pout, fftw_direction.Backward, fftw_flags.Estimate);
                }
                else
                {
                    fwdPlan = fftwf_plan.dft_many(fftType, 3, new int[] { nx, ny, nz }, batch,
                                                  pin, null, 1, nx * ny * nz,
                                                  pout, null, 1, nx * ny * nz, fftw_direction.Forward, fftw_flags.Estimate);
                    invPlan = fftwf_plan.dft_many(fftType, 3, new int[] { nx, ny, nz }, batch,
                                                  pin, null, 1, nx * ny * nz,
                                                  pout, null, 1, nx * ny * nz, fftw_direction.Backward, fftw_flags.Estimate);
                }
            }
            else
            {
                if (batch == 1)
                {
                    fwdPlan = fftw_plan.dft_3d(fftType, nx, ny, nz, pin, pout, fftw_direction.Forward, fftw_flags.Estimate);
                    invPlan = fftw_plan.dft_3d(fftType, nx, ny, nz, pin, pout, fftw_direction.Backward, fftw_flags.Estimate);
                }
                else
                {
                    fwdPlan = fftw_plan.dft_many(fftType, 3, new int[] { nx, ny, nz }, batch,
                                                 pin, null, 1, nx * ny * nz,
                                                 pout, null, 1, nx * ny * nz, fftw_direction.Forward, fftw_flags.Estimate);
                    invPlan = fftw_plan.dft_many(fftType, 3, new int[] { nx, ny, nz }, batch,
                                                 pin, null, 1, nx * ny * nz,
                                                 pout, null, 1, nx * ny * nz, fftw_direction.Backward, fftw_flags.Estimate);
                }
            }

            FFTPlan3D   plan   = new FFTPlan3D(nx, ny, nz, batch, this);
            FFTPlan3DEx planEx = new FFTPlan3DEx(plan)
            {
                FFTWFwdPlan = fwdPlan, FFTWInvPlan = invPlan, N = totalSize, DataType = dataType
            };

            Plans.Add(plan, planEx);
            return(plan);
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Creates plan..
 /// </summary>
 /// <param name="fftType">Type of fft.</param>
 /// <param name="n">The n.</param>
 /// <param name="input">The input.</param>
 /// <param name="output">The output.</param>
 /// <param name="direction">The direction.</param>
 /// <param name="flags">The flags.</param>
 /// <returns></returns>
 public static fftwf_plan dft_1d(eFFTType fftType, int n, IntPtr input, IntPtr output, fftw_direction direction, fftw_flags flags)
 {
     fftwf_plan p = new fftwf_plan();
     if (fftType == eFFTType.Complex2Complex)
         p._handle = fftwf.dft_1d(n, input, output, direction, flags);
     else if (fftType == eFFTType.Real2Complex)
         p._handle = fftwf.dft_r2c_1d(n, input, output, flags);
     else if (fftType == eFFTType.Complex2Real)
         p._handle = fftwf.dft_c2r_1d(n, input, output, flags);
     p.Input = input;
     p.Output = output;
     return p;
 }
Ejemplo n.º 6
0
 public static fftwf_plan dft_many(eFFTType fftType, int rank, int[] n, int batch,
                           IntPtr input, int[] inembed,
                           int istride, int idist,
                           IntPtr output, int[] onembed,
                           int ostride, int odist,
                           fftw_direction sign, fftw_flags flags)
 {
     fftwf_plan p = new fftwf_plan();
     if (fftType == eFFTType.Complex2Complex)
         p._handle = fftwf.many_dft(rank, n, batch, input, inembed, istride, idist, output, onembed, ostride, odist, sign, flags);
     else if (fftType == eFFTType.Real2Complex)
         p._handle = fftwf.many_dft_r2c(rank, n, batch, input, inembed, istride, idist, output, onembed, ostride, odist, flags);
     else if (fftType == eFFTType.Complex2Real)
         p._handle = fftwf.many_dft_c2r(rank, n, batch, input, inembed, istride, idist, output, onembed, ostride, odist, flags);
     p.Input = input;
     p.Output = output;
     return p;
 }
Ejemplo n.º 7
0
        /// <summary>
        /// Creates plan..
        /// </summary>
        /// <param name="fftType">Type of fft.</param>
        /// <param name="n">The n.</param>
        /// <param name="input">The input.</param>
        /// <param name="output">The output.</param>
        /// <param name="direction">The direction.</param>
        /// <param name="flags">The flags.</param>
        /// <returns></returns>
        public static fftwf_plan dft_1d(eFFTType fftType, int n, IntPtr input, IntPtr output, fftw_direction direction, fftw_flags flags)
        {
            fftwf_plan p = new fftwf_plan();

            if (fftType == eFFTType.Complex2Complex)
            {
                p._handle = fftwf.dft_1d(n, input, output, direction, flags);
            }
            else if (fftType == eFFTType.Real2Complex)
            {
                p._handle = fftwf.dft_r2c_1d(n, input, output, flags);
            }
            else if (fftType == eFFTType.Complex2Real)
            {
                p._handle = fftwf.dft_c2r_1d(n, input, output, flags);
            }
            p.Input  = input;
            p.Output = output;
            return(p);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Creates a 1D plan.
        /// </summary>
        /// <param name="fftType">Type of FFT.</param>
        /// <param name="dataType">The data type.</param>
        /// <param name="nx">The length in samples.</param>
        /// <param name="batch">The number of FFTs in batch.</param>
        /// <param name="istride">The istride.</param>
        /// <param name="idist">The idist.</param>
        /// <param name="ostride">The ostride.</param>
        /// <param name="odist">The odist.</param>
        /// <returns>Plan.</returns>
        public override FFTPlan1D Plan1D(eFFTType fftType, eDataType dataType, int nx, int batch, int istride, int idist, int ostride, int odist)
        {
            int       insize, outsize;
            CUFFTType cuFFTType = VerifyTypes(fftType, dataType, out insize, out outsize);
            //Console.WriteLine(size);
            IntPtr pin  = fftwf.malloc(nx * insize * batch);
            IntPtr pout = fftwf.malloc(nx * outsize * batch);

            Ifftw_plan fwdPlan;
            Ifftw_plan invPlan;

            if (dataType == eDataType.Single)
            {
                fwdPlan = fftwf_plan.dft_many(fftType, 1, new int[] { nx }, batch,
                                              pin, null, istride, idist,
                                              pout, null, ostride, odist, fftw_direction.Forward, fftw_flags.Estimate);
                invPlan = fftwf_plan.dft_many(fftType, 1, new int[] { nx }, batch,
                                              pin, null, istride, idist,
                                              pout, null, ostride, odist, fftw_direction.Backward, fftw_flags.Estimate);
            }
            else
            {
                fwdPlan = fftw_plan.dft_many(fftType, 1, new int[] { nx }, batch,
                                             pin, null, istride, idist,
                                             pout, null, ostride, odist, fftw_direction.Forward, fftw_flags.Estimate);
                invPlan = fftw_plan.dft_many(fftType, 1, new int[] { nx }, batch,
                                             pin, null, istride, idist,
                                             pout, null, ostride, odist, fftw_direction.Backward, fftw_flags.Estimate);
            }

            FFTPlan1D   plan   = new FFTPlan1D(nx, batch, this);
            FFTPlan1DEx planEx = new FFTPlan1DEx(plan)
            {
                FFTWFwdPlan = fwdPlan, FFTWInvPlan = invPlan, N = nx, DataType = dataType
            };

            Plans.Add(plan, planEx);
            return(plan);
        }
Ejemplo n.º 9
0
        public override FFTPlan1D Plan1D(eFFTType fftType, eDataType dataType, int nx, int batchSize, int istride, int idist, int ostride, int odist)
        {
            int         insize, outsize;
            CUFFTType   cuFFTType = VerifyTypes(fftType, dataType, out insize, out outsize);
            cufftHandle handle    = new cufftHandle();
            CUFFTResult res;

            if (batchSize <= 1)
            {
                res = _driver.cufftPlan1d(ref handle, nx, cuFFTType, batchSize);
            }
            else
            {
                res = _driver.cufftPlanMany(ref handle, 1, new int[] { nx },
                                            new int[] { idist }, //inembed
                                            istride,             //istride
                                            idist,               //idist
                                            new int[] { odist }, //onembed
                                            ostride,             //ostride
                                            odist,               //odist
                                            cuFFTType,
                                            batchSize);
            }

            if (res != CUFFTResult.Success)
            {
                throw new CudafyHostException(res.ToString());
            }
            FFTPlan1D   plan   = new FFTPlan1D(nx, batchSize, this);
            FFTPlan1DEx planEx = new FFTPlan1DEx(plan)
            {
                CudaFFTHandle = handle, CudaFFTType = cuFFTType, DataType = dataType
            };

            Plans.Add(plan, planEx);
            return(plan);
        }
Ejemplo n.º 10
0
 /// <summary>
 /// Creates a 3D plan.
 /// </summary>
 /// <param name="fftType">Type of FFT.</param>
 /// <param name="dataType">The data type.</param>
 /// <param name="nx">The x length in samples.</param>
 /// <param name="ny">The y length in samples.</param>
 /// <param name="nz">The z length in samples.</param>
 /// <param name="batch">The number of FFTs in batch.</param>
 /// <returns>Plan.</returns>
 public abstract FFTPlan3D Plan3D(eFFTType fftType, eDataType dataType, int nx, int ny, int nz, int batch = 1);
Ejemplo n.º 11
0
 /// <summary>
 /// Plan1s the D.
 /// </summary>
 /// <param name="fftType">Type of the FFT.</param>
 /// <param name="dataType">Type of the data.</param>
 /// <param name="nx">The nx.</param>
 /// <param name="batchSize">Size of the batch.</param>
 /// <param name="istride">The istride.</param>
 /// <param name="idist">The idist.</param>
 /// <param name="ostride">The ostride.</param>
 /// <param name="odist">The odist.</param>
 /// <returns></returns>
 public abstract FFTPlan1D Plan1D(eFFTType fftType, eDataType dataType, int nx, int batchSize, int istride, int idist, int ostride, int odist);