[alsa-devel] [PATCH 00/12] ASoC: dapm: Cleanups and speed-ups

Lars-Peter Clausen lars at metafoo.de
Sat Oct 25 15:58:21 CEST 2014


On 10/22/2014 01:36 PM, Mark Brown wrote:
> On Mon, Oct 20, 2014 at 07:36:32PM +0200, Lars-Peter Clausen wrote:
>
>> Changing a single control on a 5 input mixer while the system is idle:
>
>>            Power  Path  Neighbour
>> Before:   2      25    32
>> After~1:  2      12    30
>> After:    2       1     2
>
>> Cumulative numbers for switching the audio profile which changes 7 controls
>> while the system is idle:
>
>>            Power  Path  Neighbour
>> Before:   16     141   188
>> After~1:  16      80   170
>> After:    16       7    23
>
> This series is all basically OK, a couple of small comments one of which
> was very near the start of the series or I'd have applied more.
>
> Just as a general comment the numbers you're showing here are all for
> very small use cases and while they do show an order of magnitude
> improvement if they do scale out (it looks like this is mostly linear or
> constant factor gains but some of those are scale with the total number of
> widgets or paths which can be interesting) since that makes things much
> more exciting.  It's also good (though not at all essential) to show the
> benchmarks on individual commits since this both keeps them around and
> helps people trying to solve performance problems in production find
> relevant upstream optimisations to backport.
>

There are two patches in this series which have direct impact on the stats. 
The first one is the one that marks paths from a supply as a supply path. 
Those paths are skipped in is_connected_{input,output}_ep and hence supply 
widgets no longer appear in the path checks stat. While this might look 
pretty good in the stats the actual performance improvement is not that big 
since is_connected_{input,output_ep} will return right away if it encounters 
a supply widget. The change is still worth doing since the check if a path 
is connected to a supply comes essentially for free and we can also remove 
the code that handles supply widgets from is_connected_{input,output_ep}.

The second change is the last patch in this series which caches the 
connected input and output path numbers between multiple runs of 
dapm_power_widgets() and only re-calculates those numbers if they could have 
changed. Since per DAPM operation typically only either changes the number 
of inputs or outputs the number of path checks is reduced by 50%. The number 
of neighbor checks is also reduced about the same percentage, but since the 
number of neighbors encountered when walking from sink to source is not the 
same as when walking from source to sink the actual numbers will slightly 
vary from card to card (e.g. for a mixer we see 1 neighbor when walking from 
source to sink, but the number of inputs neighbors when walking from source 
to sink).

Things get better than 50% when there are widgets on the path that got 
changed that have multiple inputs and outputs since we only need to re-check 
the one path that has changed rather than rechecking all input and output 
paths.  E.g. if you have a mixer with many enabled inputs this can be quite 
substantial.

If the system is idle (or the part of the system affected by the changed 
path) the number of path checks drops to either 0 or 1, regardless of how 
large or complex the DAPM context is. 0 if there is no connected sink and no 
connected source. 1 if there is either a connected source or sink, but not 
both. The number of neighbor checks again will scale accordingly and will be 
a constant number that is the number of inputs or outputs of the widget for 
which we did the path check.

- Lars


More information about the Alsa-devel mailing list