Messages in this thread | | | Date | Thu, 27 Nov 2008 00:16:45 +0100 (CET) | From | Thomas Gleixner <> | Subject | Re: [patch 05/24] perfmon: X86 generic code (x86) |
| |
On Wed, 26 Nov 2008, stephane eranian wrote: > > What a nonsense. We have a bitmask already. Why not iterate over the > > bitmask and be done ? > > > > Bitmask can be sparsed. Num represents the number of bits we have to find. > The idea is that we don't need to scan the entire bitmask, we stop as soon as > we have found all the bits we care about (i.e., all the bits that are set). > > Example: > num = 3 > bitmask=0000000010001001 > ^ we will iterate until we are > done with that bit.
Errm.
#define for_each_bit(bit, addr, size) \ for ((bit) = find_first_bit((addr), (size)); \ (bit) < (size); \ (bit) = find_next_bit((addr), (size), (bit) + 1))
find_first_bit() and find_next_bit() are single instructions on most architectures. "size" is known upfront at setup time of the context/set and can be cached.
This takes exactly 3 iterations, while your method needs 8. And it gets worse with the following example:
Example: num = 1 bitmask=1000 0000 0000 0000 0000 0000 0000 00000
^ you will iterate until we are done with that bit (32 times) for_each_bit() will iterate exactly _once_.
Thanks,
tglx
| |