// Use the CuFFT wrapper to perform a forward transform. static void DoForwardPlan( CudaAccelerator accelerator, CuFFT cufft, Complex[] input, out Complex[] output) { using var stream = accelerator.CreateStream() as CudaStream; using var inputBuffer = accelerator.Allocate1D(input); using var outputBuffer = accelerator.Allocate1D <Complex>(input.Length); CuFFTException.ThrowIfFailed( cufft.Plan1D( out var plan, input.Length, CuFFTType.CUFFT_Z2Z, batch: 1)); using (plan) { plan.SetStream(stream); CuFFTException.ThrowIfFailed( plan.ExecZ2Z( inputBuffer.View.BaseView, outputBuffer.View.BaseView, CuFFTDirection.FORWARD)); output = outputBuffer.GetAsArray1D(stream); } WorkaroundKnownIssue(accelerator, cufft.API); Console.WriteLine("Output Values:"); for (var i = 0; i < output.Length; i++) { Console.WriteLine($" [{i}] = {output[i]}"); } }
static void Main() { using var context = Context.Create(builder => builder.Cuda()); foreach (var device in context) { using var accelerator = device.CreateAccelerator(context) as CudaAccelerator; Console.WriteLine($"Performing operations on {accelerator}"); var input = new Complex[8]; for (var i = 0; i < input.Length; i++) { input[i] = new Complex(i + 1, 0); } Console.WriteLine("Input Values:"); for (var i = 0; i < input.Length; i++) { Console.WriteLine($" [{i}] = {input[i]}"); } var cufft = new CuFFT(); DoForwardPlan(accelerator, cufft, input, out var output); var inverseInput = output; var inverseOutput = new Complex[inverseInput.Length]; DoInversePlan(accelerator, cufft.API, inverseInput, out _); } }