[linux-dvb] Large arrays
Trent Piepho
xyzzy at speakeasy.org
Tue Aug 28 15:16:25 CEST 2007
On Tue, 28 Aug 2007, Manu Abraham wrote:
> * use integer math calculations
> * precompute the values where double precision is needed.
>
> That said, the first option i tried for a while, after a few days (i
> almost gave up ?) got really irritated with it.
> The second option seemed a bit more comfortable, to precalculate the values.
>
> The disadvantage in such a case is that the array which holds the
> precomputed value is quite large in size, with that in mind, a different
> question arose in my mind, whether such large arrays would be frowned
> upon in kernel
>
> The precomputed array is here
>
> http://www.jusst.de/manu/mc44s80x_array.c
>
> Any thoughts ?
That's really inefficient. You've got about 250k of table there. I don't
think a 250k+ module is going to be very popular.
The table could be packed a lot better. None of the fields need to be 64-bit,
so don't use unsigned long which is 64 bits on 64 bit platforms. Most of
those fields don't even have 32 bits that change. For example, I can see that
the last 12-bits of the refdiv field are always 0x9b2. You could put that
field in 8-bits (or less, it looks like only 5 bits change).
The freq field looks like it's just every 1/6th MHz from 50 Mhz to 1 GHz. Why
do you need to store that? It should be trivial to calculate.
unsigned int x; /* must be unsigned! Good to x=8589 1.4815 GHz*/
tuner_step_166k[x].freq = (x * 500000 + 1)/3 + 50000000;
Or the other way around, table index from frequency:
unsigned int freq, x;
x = ((freq - 50000000) * 3 + 250000) / 500000;
More information about the linux-dvb
mailing list