Re: Announcing cdrskin-0.7.2

"D. Hugh Redelmeier" <[email protected]>
Newsgroups gmane.comp.audio.cd-record
Message-ID <[email protected]>
| From: Thomas Schmitt <[email protected]>

| Some of my own experiments yielded surprising
| setbacks. E.g. i replaced
|    gfpow[44 - i]
| by
|    h45[i]
| with a suitable constant array h45[].
| This was 7 percent slower !
| (I suspect a less fortunate cache situation.)

Right.  gcc can fold the constant 44 into indexing.  You might have
saved a unary - operation, but I don't know.  But, as you suggest, an
extra burden on a cache may be a problem.

Even worse: the price of a cache burden depends on the CPU's cache
implementation and size so testing on one machine does not give a fair
overview of performance on other machines.

| > In burn_rspc_div, you return -1 if the division is by 0.
| 
| This has been replaced by a specialized
| burn_rspc_div_3() which divides by (x^1+1).
| Less ifs, less array lookups, but no speed-up:
| 
| /* Divides by polynomial 0x03. Derived from burn_rspc_div() */
| static unsigned char burn_rspc_div_3(unsigned char a)
| {
|         if (a == 0)
|                 return 0;
|         if (gflog[a] >= 25)
|                 return gfpow[gflog[a] - 25];
|         else
|                 return gfpow[230 + gflog[a]];
| }  

Given that gfpow is doubled, this code should be faster and simpler:

| {
|         if (a == 0)
|                 return 0;
|         /* Note: gflog(x^1 + x^0) == 25 */
|         return gfpow[(255 - 25) + gflog[a]];
| }  

I think that 0x03 has a multiplicative inverse too.  This would allow
a division to be replaced by a multiplication.

Since fglog(0x03) is 25, the multiplicative inverse ought to have a
gflog of -25 == 230.  It turns out that gflog(244) == 230 so 244 ==
0xF4 appears to be the multiplicative inverse.  It surprises me that
0xF4 + 0x03 == 0xFF (for either kind of +!).

So, not too surprisingly, 255-25 could be replaced by 0+230.  No
advantage, just interesting.  It still requires the gfpow table to be
doubled.

| I trust in gcc -O2 that it handles the double
| lookup of gfpow[a] properly.

Probably.

| The code swallowed far more obvious workload
| improvements without showing speed reactions.

Right.  I'm shooting in the dark given that I'm not testing let alone
measuring.

| ------------------------------------------------
| 
| I see some potential in parallelization.
| We have at least 32 bit for exor operations.
| There are two neighbored bytes multiplied by
| the same byte simultaneously.
| 
| But already now a 1000 MHz CPU can easily feed
| a 48x CD stream. I am not aware of faster CD
| media. And this stuff is for CD only.

OK.

Any further improvement should probably be guided by measuring for hot
spots.


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.