[FFmpeg-devel] [PATCH 1/2] avcodec/fft_template: improve performance of the ff_fft_init in fft_template
Steven Liu
lq at chinaffmpeg.org
Sun Dec 16 16:03:20 EET 2018
> On Dec 16, 2018, at 21:47, Moritz Barsnick <barsnick at gmx.net> wrote:
>
> On Sun, Dec 16, 2018 at 21:19:17 +0800, Steven Liu wrote:
>> move the two if condition out of the loop, that can less n-1 times than condition
>> in loop.
> [...]
>> k = -split_radix_permutation(i, n, s->inverse) & (n-1);
>> - if (s->revtab)
>> s->revtab[k] = j;
>> - if (s->revtab32)
>> - s->revtab32[k] = j;
>> }
>
> Does this really improve performance? You only save one if-check per
> loop (as only one of s->revtab and s->revtab32 is defined). Benchmarks?
>
>> + if (s->revtab32) {
>> + for(i=0; i<n; i++) {
>> + int k;
>> + j = i;
>> + if (s->fft_permutation == FF_FFT_PERM_SWAP_LSBS)
>> + j = (j&~3) | ((j>>1)&1) | ((j<<1)&2);
>> + k = -split_radix_permutation(i, n, s->inverse) & (n-1);
>> + s->revtab32[k] = j;
>> + }
>> + }
>
> On the other hand, all the code is duplicated. Is there a more elegant
> way to do this?
Hi Moritz,
For example:
Original logic:
int n = 32;
for (i = 0 ; i < n; i++) {
if (check1) do_something;
if (check2) do_something;
}
If check1 is true and check2 is false, this loop 32 times, check condition 64 times;
After this patch:
int n = 32;
if (check1)
for (i = 0 ; i < n; i++) {
do_something;
}
if (check2)
for (i = 0 ; i < n; i++) {
do_something;
}
If check1 is true and check2 is false, this loop 32 times, check condition 2 times
And there should only one of the two condition is true,
because the s->revtab or s->revtab32 is allocation at begin of ff_fft_init,
and if nbits <= 16 the s->revtab maybe true else s->revtab32 is true.
So i modify it here.
I think maybe have more elegant way to do this if this logic is ok.
>
> Moritz
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Thanks
Steven
More information about the ffmpeg-devel
mailing list