我正在尝试在教育目的的OpenGL计算着色器中实现FFT(这就是我不想使用CUDA和OpenCL的原因),但我认为OpenCL中使用的并行编程的一些方法类似于OpenGL计算着色器。我在OpenCL中找到了几个FFT的代码示例:其中一个是Eric Bainville's article。它的示例源代码如下:
__kernel void fft_radix2(__global const float2 * x,__global float2 * y,int p)
{
int i = get_global_id(0); // number of threads
int t = get_global_size(0); // current thread
int k = i & (p-1); // index in input sequence, in 0..P-1
x += i; // input offset
y += (i<<1) - k; // output offset
float4 u = dft2( (float4)(x[0], mul_1(exp_alpha_1(-M_PI*(float)k/(float)p),x[t]) ));
y[0] = u.lo;
y[p] = u.hi;
}
此处输入x
,并为FFT中的每一步输出y
。
之后,他说“必须为p = 1
调用此内核,然后{ {1}}等等,直到p = 2
。每次调用的线程数为p = N/2
,工作组大小WG无关紧要,因为所有线程都是独立的。“这里N/2
是输入的大小(应该是2的幂)。
所以,我的问题是关于参数N
。如何在计算着色器中推送该参数,以便后者将被调用p
,然后p = 1
等,直到p = 2
?