[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