Szabalyzohoz a reakcioido is szamit. Szoval jobban jarsz vele, ha n lepesben kapsz valaszt, mint ha n log n lepesben kapsz mondjuk n*n mintara valaszt. Ha erre hasznalnad, akkor a buta megoldas valoszinuleg jobb.
Igen, lenne ennek elegge valos ideju alkalmazasa is, de a stream az nagyon hosszu - szoval az boven belefer ha nem 1 lepes van n muvelettel kiszamolva hanem n lepes n*log(n) muveletben.
A masik lehetoseg meg, hogy az algoritmikus optimalizalast nem noveled tovabb, az architekturahoz viszont minel inkabb hozzaigazitod. GPU-n ez azt hiszem pont jol szamolhato (ket vektor skalarszorzata), de CPU-n is vektormuveletekkel (SSE es tarsai) gyorsan fut.
Igen, kozben ezen en is gondolkodtam. Hogy a fir_window[]-bol csinalok egy fir_window_matrix[]-ot, ami ugyanugy n*n-es, csak az egyes sorai ciklikusan el vannak tolva szepen, minden sora aligned_alloc()-olt es fir_buffer[]-t is aligned_alloc()-cal foglalom le... Na es akkor a critical section egy sima skalaris szorzat, amit FMA-ra optimalizalt SIMD-ekkel mar - remelhetoleg - jol fel lehet dolgozni. Szoval GPU az azert nem kene, annal legyen altalanosabb, de talan igy mar jo. Gyakorlatban pl nem lenne rossz ha kenyelmesen (50%/mag loaddal) elmenne mondjuk 2MSPS + n=64...128 ertekekkel.
Szerk: kozben megcsinaltam ezt a fir_window_matrix[]-os trukkot. Egyreszt igy tenyleg 7x gyorsabb lett, szepen felismerte a fordito a dolgot es kioptimalizalta SIMD-re. Az AVX2 is kicsit gyorsitott rajta, de az mar nem sokat (par %-ot az SSE4.2-hoz kepest). Erdekes viszont hogy az aligned_alloc() az nem segit(ett) tovabb rajta. Ugyanakkor persze az is igaz hogy ugyanugy O(n)-nel megy ez is, szoval nagyskalan ugyanugy skalazodik.