yum/vfft
git clone https://git.yummers.dev/yum/vfft
90039aa
master
1import lib.util; 2 3[[vk::binding(0, 0)]] 4StructuredBuffer<float2> input; 5 6[[vk::binding(1, 0)]] 7RWStructuredBuffer<float2> output; 8 9[[vk::binding(2, 0)]] 10StructuredBuffer<float2> twiddles; 11 12[[vk::binding(3, 0)]] 13cbuffer Uniforms { 14 // Invariant: stride * big_n = input_len 15 uint stride; 16 uint big_n; 17 uint input_len; 18}; 19 20// 256 threads per FFT 21[shader("compute")] 22[numthreads(256, 1, 1)] 23void fft_v1_batched(uint3 globalId : SV_DispatchThreadID) 24{ 25 const uint id = globalId.x; 26 const uint stride = Uniforms.stride; 27 const uint big_n = Uniforms.big_n; 28 const uint half_big_n = big_n / 2; 29 const uint k = id / stride; 30 31 const uint which_fft = globalId.y; 32 const uint start_idx = which_fft * Uniforms.input_len + id % stride; 33 34 // Get odd and even elements. 35 let p = input[start_idx + 2 * k * stride]; 36 let q = input[start_idx + (2 * k + 1) * stride]; 37 // Combine. 38 let factor = twiddles[k * stride]; 39 let qf = cmul(q, factor); 40 output[start_idx + k * stride] = p + qf; 41 output[start_idx + (k + half_big_n) * stride] = p - qf; 42}