Быстрое преобразование Фурье в OpenGL Compute Shader
Я пытаюсь реализовать FFT в OpenGL Compute Shaders в образовательных целях (именно поэтому я не хочу использовать CUDA и OpenCL), но я думаю, что некоторые подходы к параллельному программированию, используемые в OpenCL, например, похожи на OpenGL Compute Shaders, Я нашел несколько примеров кода FFT в OpenCL: один из них - статья Эрика Бейнвилла. Пример исходного кода из него следующий:
__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
вход и y
выводится для каждого шага в БПФ.
После этого он говорит, что "это ядро должно быть p = 1
, затем p = 2
и т. д. до p = N/2
, Количество потоков при каждом вызове N/2
и размер рабочей группы WG не имеет значения, поскольку все потоки независимы. N
размер ввода (должен быть степенью 2).
Итак, мой вопрос о параметре p
, Как я могу вставить этот параметр в вычислительный шейдер, чтобы последний вызывался для p = 1
, затем p = 2
и т. д. до p = N/2
?