gkha...@spectre-music.com: > From: Guillaume Khayat <gkha...@spectre-music.com> > > Improve performance (+17%) of ebur_128 filter using AVX2 and FMA instruction > in the body of the filter_frame function. > > ## Benchmark > > Tested with hyperfine > > hyperfine --warmup 2 "./ffmpeg_reference -i ~/test.wav -vn -af > ebur128=peak=none:framelog=quiet -f null -" "./ffmpeg_avx -i ~/test.wav -vn > -af ebur128=peak=none:framelog=quiet -f null -" > Benchmark 1: ./ffmpeg_reference -i ~/test.wav -vn -af > ebur128=peak=none:framelog=quiet -f null - > Time (mean ± σ): 7.118 s ± 0.037 s [User: 9.114 s, System: 1.038 s] > Range (min … max): 7.073 s … 7.177 s 10 runs > > Benchmark 2: ./ffmpeg_avx -i ~/test.wav -vn -af > ebur128=peak=none:framelog=quiet -f null - > Time (mean ± σ): 6.073 s ± 0.108 s [User: 7.903 s, System: 1.058 s] > Range (min … max): 5.955 s … 6.327 s 10 runs > > Summary > ./ffmpeg_avx -i ~/test.wav -vn -af ebur128=peak=none:framelog=quiet -f null > - ran > 1.17 ± 0.02 times faster than ./ffmpeg_reference -i ~/test.wav -vn -af > ebur128=peak=none:framelog=quiet -f null - > > ## Tests > > - all FATE tests pass, tested on Darwin/arm64 and Linux/x86_64 w/ AVX2/FMA > support > - On AVX2/FMA-capable system, all test files from the EBU yield the exact > same output values (I/LRA) after and before optimization. See > https://tech.ebu.ch/publications/ebu_loudness_test_set > > Disclaimer: this is my first ever patch submission to FFmpeg, and first ever > time using git send-email to submit a patch anywhere. > > Signed-off-by: Cesar Matheus <cesar.math...@telecom-paris.fr> > Signed-off-by: Guillaume Khayat <gkha...@spectre-music.com> > --- > libavfilter/f_ebur128.c | 246 ++++++++++++++++++++++++++++++++++------ > 1 file changed, 214 insertions(+), 32 deletions(-) > > diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c > index 768f062bac..e305b0a3ce 100644 > --- a/libavfilter/f_ebur128.c > +++ b/libavfilter/f_ebur128.c > @@ -28,7 +28,7 @@ > > #include <float.h> > #include <math.h> > - > +#include "libavutil/intmath.h" > #include "libavutil/avassert.h" > #include "libavutil/channel_layout.h" > #include "libavutil/dict.h" > @@ -199,7 +199,7 @@ static const AVOption ebur128_options[] = { > }; > > AVFILTER_DEFINE_CLASS(ebur128); > - > +#define MIN(a, b) ((a) < (b) ? (a) : (b)) > static const uint8_t graph_colors[] = { > 0xdd, 0x66, 0x66, // value above 1LU non reached below -1LU > (impossible) > 0x66, 0x66, 0xdd, // value below 1LU non reached below -1LU > @@ -628,13 +628,61 @@ static int gate_update(struct integrator *integ, double > power, > > static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) > { > - int i, ch, idx_insample, ret; > + > + int i, ch, idx_insample, ret,bin_id_400,bin_id_3000; > AVFilterContext *ctx = inlink->dst; > EBUR128Context *ebur128 = ctx->priv; > const int nb_channels = ebur128->nb_channels; > const int nb_samples = insamples->nb_samples; > const double *samples = (double *)insamples->data[0]; > AVFrame *pic; > + > +#if HAVE_AVX2_EXTERNAL && HAVE_AVX2
This is completely wrong: This only checks whether your assembler supports AVX2 and whether it was not disabled in configure. But this does not imply that the CPU where this code runs is actually capable of AVX2; I don't even know whether this check ensures that the compiler understands __m256d. For actual runtime support you need to check via av_get_cpu_flags(). See how other DSP code does it. - Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".