private void ReleaseAllDescriptors()
        {
            lock (_sync)
            {
                foreach (var descriptor in _availableDescriptors)
                {
                    var ptr = descriptor.Ptr;
                    IntelMklUnm.FreeDftiDescriptor(ref ptr);
                }

                _availableDescriptors.Clear();
            }
        }
        private IntPtr GetDescriptor(int nx, int ny)
        {
            lock (_sync)
            {
                var descriptor = _availableDescriptors.FirstOrDefault(d => d.Nx == nx && d.Ny == ny);

                if (descriptor != FftDescriptor.Empty)
                {
                    return(descriptor.Ptr);
                }

                var ptr = IntelMklUnm.CreateDftiDescriptor(nx, ny);

                _availableDescriptors.Add(new FftDescriptor(nx, ny, ptr));

                return(ptr);
            }
        }
        public void Backward2D(int nx, int ny, IntPtr ptr)
        {
            var descriptor = GetDescriptor(nx, ny);

            IntelMklUnm.PerformBackwardFft(descriptor, ptr);
        }