/// <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); }
/// <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); }
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); }
/// <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); }
/// <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; }
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; }
/// <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); }
/// <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); }
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); }
/// <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);
/// <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);