Multithreading C#中的简单FFT作为单核、多核和OpenCL版本?
我在web和Stack Overflow中搜索了C#中的FFT版本,这被问了好几次,并给出了一些答案,但是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版本,处理浮点[](不需要实数、复数),正向和反向可选将非常好。如果它们可以在任何数组长度上工作,这也会很好。有人偶然发现过
__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。我认为你不会找到一个完美的地方来满足你的需要。需要一些组件。