Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Math: Replace exp() function with more accurate and fast version #9786

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

singalsu
Copy link
Collaborator

@singalsu singalsu commented Jan 20, 2025

The function sofm_exp_int32() if replaced with new sofm_exp_approx()
function. It's not a direct replacement so the name is
changed. The input range changes from +/- 5 to +/- 8.

The wrapper function sofm_exp_fixed() with input range -16 .. +7.6
is updated to use the new function with a simpler range reduction
for large negative input values. All current exponent function
usage in SOF components is for the wrapper function that remains
compatible.

The function sofm_db2lin_fixed() is updated to handle larger
negative input decibels values made possible by the new more
accurate exponent function.

The accuracy in exponent function for input ranges from -8 to +8 or
-16 to 7.6 depending on used exponent function improves from
absolute error of 1 to 1000 ppm to constant less than 1 ppm.

The cycles count for exponent function calculate decreases from
about 369 max to 78 max on MTL platform for HiFi code version with
-O2 or -O3 optimization. The generic C version on MTL platform is
max 88 cycles.

The DRC component is a heavy user of the exponent function. The
saving in MTL build of DRC is 10.5 MCPS, it drops from 22.17 to
11.70 with profiler run:

"scripts/sof-testbench-helper.sh -x -m drc -p profile.txt"

The saving in MTL build of multiband DRC is 30.2 MCPS, it drops from
127.95 to 97.78 with profiler run:

"scripts/sof-testbench-helper.sh -x -m drc_multiband -p profile.txt"

This patch also updates the cmocka test. The test functions are
changed due to changed function name, changed achievable accuracy.
Also the random values test points vector is replaced fixed a
fixed linearly spaced vector for repeatable test and risk for
random failures.

@singalsu singalsu force-pushed the add_new_taylor_approx_exp branch 2 times, most recently from 07c8627 to 31636d1 Compare January 21, 2025 18:09
@singalsu
Copy link
Collaborator Author

Still working with cmocka test cases, while the generic C and Xtensa HiFi versions of the exp functions are ready. Here's plots of accuracy (vs. C math library function) and cycles for existing HiFi version and new generic and HiFi version.

fig_accuracy
fig_cycles

@singalsu
Copy link
Collaborator Author

Here's a cycles plot that includes cycles for C library float version. It's about 1800 cycles except for near zero input values.

fig_cycles_including_float

@singalsu singalsu force-pushed the add_new_taylor_approx_exp branch from 31636d1 to 929029f Compare January 22, 2025 17:00
@singalsu singalsu marked this pull request as ready for review January 23, 2025 09:24
Copy link
Contributor

@ShriramShastry ShriramShastry left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address checkpatch space preference.
Over all the implementation looks sound to me.
Thank you

@singalsu
Copy link
Collaborator Author

Please address checkpatch space preference.

Ah that, it's an issue in checkpatch. It doesn't understand numbers in exponential format, e.g. 1.9073e-06.

The function sofm_exp_int32() is replaced with new sofm_exp_approx()
function. It's not a direct replacement so the name is
changed. The input range changes from +/- 5 to +/- 8.

The wrapper function sofm_exp_fixed() with input range -16 .. +7.6
is updated to use the new function with a simpler range reduction
for large negative input values. All current exponent function
usage in SOF components is for the wrapper function that remains
compatible.

The function sofm_db2lin_fixed() is updated to handle larger
negative input decibels values made possible by the new more
accurate exponent function.

The accuracy in exponent function for input ranges from -8 to +8 or
-16 to 7.6 depending on used exponent function improves from
absolute error of 1 to 1000 ppm to constant less than 1 ppm.

The cycles count for exponent function calculate decreases from
about 369 max to 78 max on MTL platform for HiFi code version with
-O2 or -O3 optimization. The generic C version on MTL platform is
max 88 cycles.

The DRC component is a heavy user of the exponent function. The
saving in MTL build of DRC is 10.5 MCPS, it drops from 22.17 to
11.70 with profiler run:

"scripts/sof-testbench-helper.sh -x -m drc -p profile.txt"

The saving in MTL build of multiband DRC is 30.2 MCPS, it drops from
127.95 to 97.78 with profiler run:

"scripts/sof-testbench-helper.sh -x -m drc_multiband -p profile.txt"

This patch also updates the cmocka test. The test functions are
changed due to changed function name, changed achievable accuracy.
Also the random values test points vector is replaced fixed a
fixed linearly spaced vector for repeatable test and risk for
random failures.

Signed-off-by: Shriram Shastry <[email protected]>
Signed-off-by: Seppo Ingalsuo <[email protected]>
@singalsu singalsu force-pushed the add_new_taylor_approx_exp branch from 929029f to c6b4925 Compare January 24, 2025 17:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants