Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading C#中的简单FFT作为单核、多核和OpenCL版本?_Multithreading_C# 4.0_Opencl_Fft - Fatal编程技术网

Multithreading C#中的简单FFT作为单核、多核和OpenCL版本?

Multithreading C#中的简单FFT作为单核、多核和OpenCL版本?,multithreading,c#-4.0,opencl,fft,Multithreading,C# 4.0,Opencl,Fft,我在web和Stack Overflow中搜索了C#中的FFT版本,这被问了好几次,并给出了一些答案,但是 我发现的所有FFT版本都针对速度进行了优化,但都很难实现 理解 几乎所有这些都是迭代版本,因此没有针对 多核系统 Opencl版本针对某些gpu型号进行了优化 当我正在进行单核、多核、opencl算法比较的案例研究时,我正在寻找FFT最简单、最自由的C#/opencl版本,处理浮点[](不需要实数、复数),正向和反向可选将非常好。如果它们可以在任何数组长度上工作,这也会很好。有人偶然发现过

我在web和Stack Overflow中搜索了C#中的FFT版本,这被问了好几次,并给出了一些答案,但是

  • 我发现的所有FFT版本都针对速度进行了优化,但都很难实现 理解
  • 几乎所有这些都是迭代版本,因此没有针对 多核系统
  • Opencl版本针对某些gpu型号进行了优化
  • 当我正在进行单核、多核、opencl算法比较的案例研究时,我正在寻找FFT最简单、最自由的C#/opencl版本,处理浮点[](不需要实数、复数),正向和反向可选将非常好。如果它们可以在任何数组长度上工作,这也会很好。有人偶然发现过这样的事情吗

    from(我的开源项目)拥有微软研究院FFT论文的C#实现和LINQ实现(OpenCL)

    梵天自动生成的内核是:

    FFT内核

        __kernel void brahmaKernel(int fftSize,__global float* a,__global float* ib,__global float* c,__global float* id,int size) 
        {
            int x = get_global_id(0);
            int b = ((floor(convert_float((x / fftSize))) * fftSize) / ((int)2));
            int offset = (x % (fftSize / ((int)2)));
            int x0 = (b + offset);
            int x1 = (x0 + (size / ((int)2)));
            float val0A = a[x0];
            float val0B = ib[x0];
            float val1A = a[x1];
            float val1B = ib[x1];
            float angle = (((float)-6.283185) * (convert_float(x) / convert_float(fftSize)));
            float tA = native_cos(angle);
            float tB = native_sin(angle);
            (c[x] = ((val0A + (tA * val1A)) - (tB * val1B)));(id[x] = ((val0B + (tB * val1A)) + (tA * val1B)));
        }
    
        __kernel void brahmaKernel(float scale,__global float* a,__global float* ib) 
        {
            int x = get_global_id(0);
            (a[x] = (a[x] * scale));(ib[x] = (-(ib[x]) * scale));;
        }
    
    共轭和缩放核

        __kernel void brahmaKernel(int fftSize,__global float* a,__global float* ib,__global float* c,__global float* id,int size) 
        {
            int x = get_global_id(0);
            int b = ((floor(convert_float((x / fftSize))) * fftSize) / ((int)2));
            int offset = (x % (fftSize / ((int)2)));
            int x0 = (b + offset);
            int x1 = (x0 + (size / ((int)2)));
            float val0A = a[x0];
            float val0B = ib[x0];
            float val1A = a[x1];
            float val1B = ib[x1];
            float angle = (((float)-6.283185) * (convert_float(x) / convert_float(fftSize)));
            float tA = native_cos(angle);
            float tB = native_sin(angle);
            (c[x] = ((val0A + (tA * val1A)) - (tB * val1B)));(id[x] = ((val0B + (tB * val1A)) + (tA * val1B)));
        }
    
        __kernel void brahmaKernel(float scale,__global float* a,__global float* ib) 
        {
            int x = get_global_id(0);
            (a[x] = (a[x] * scale));(ib[x] = (-(ib[x]) * scale));;
        }
    

    希望这有帮助

    谢谢ananthonline,这篇微软的论文真的很棒。我在C#中找到了一个非常幼稚(但对我来说是完美的)的FFT版本。但是在您的源代码中查找FFT的OpenCL内核时遇到了一些问题。实际上,我需要一个OpenCL内核代码,我可以用参数从C#调用它(这里已经在工作了,我得到了一个简单的OpenCL内核反转向量的例子)。就我所见,FFT的Brahme内核并不是简单地粘贴在我的项目中,因为它是动态创建的,对吗?正确。我将用Brahma生成的OpenCL内核更新我的答案。快看FTW!嗯,好的。有没有一种方法可以将1D实FFT的婆罗门内核作为这样一个OpenCL代码片段?实际上,我只需要一维实FFT。我想,你可以很容易地修改源代码来进行实FFT。我认为你不会找到一个完美的地方来满足你的需要。需要一些组件。