Быстрое преобразование Фурье в 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?

0 ответов

Другие вопросы по тегам