tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] vectorize the curent hash implementation


From: Michael B. Smith
Subject: Re: [Tinycc-devel] vectorize the curent hash implementation
Date: Tue, 26 Apr 2016 01:09:17 +0000

When last I looked, tcc didn't do any constant-folding (although perhaps that 
has changed).

So, precomputing (as a constant) (IS_ID|IS_NUM) and another array which, for a 
value of 'c' is the answer to "c - CH_EOF" -- should provide most (if not all) 
of that optimization.

-----Original Message-----
From: Tinycc-devel [mailto:address@hidden On Behalf Of Michael Matz
Sent: Saturday, April 23, 2016 2:46 PM
To: address@hidden
Subject: Re: [Tinycc-devel] vectorize the curent hash implementation

Hi,

On Sat, 23 Apr 2016, Vladimir Vissoultchev wrote:

> Rolling hashes have a nice property -- associativity -- i.e. 
> hash(concat(a,
> b)) = [hash(a) * TOK_HASH_PRIME^len(b) + hash(b)] in GF(TOK_HASH_SIZE)
>
> What I tried based on this was to pre-hash all of file->buffer and 
> calc hash on current (pos, len) with no loop like this:
>
>    h = (ph[len] - (ph[0] - TOK_HASH_INIT) * hash_prime_powers[len]) & 
> (TOK_HASH_SIZE - 1)
>
> ... where ph is pointing to current pos in pre-hash buffer.
>
> Unfortunately complete file->buffer pre-hashing is slow, I'm currently 
> working on impl pre-hash part in SSE2 but it looks like it's going to 
> be too slow again as there is no performant way to calculate all 
> intermediate hashes.

The hashing of identifiers (when tcc is compiled with GCC on -O0) in
next_nomacro1 itself takes only 2.3 % of the overall cycle estimate (valgrind 
cachegrind measurement of compiling tcc with tcc itself).  The stepping forward 
of the characters itself takes more than the hashing (namely 3.3%).  So any 
optimization of the hashing needs to be _extremely_ efficient to lead to any 
measurable improvement at all.  I.e. this loop:

3.3%        while (c = *++p, isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM))
2.3%            h = TOK_HASH_FUNC(h, c);

Even optimizing this loop to run twice as fast (which would be quite an
achievement) will make tcc run only 2.8% faster (nothing to sneeze at of 
course, I just wanted to mention that it's not easy to improve the speed by an 
fantastic amount).


Ciao,
Michael.

_______________________________________________
Tinycc-devel mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/tinycc-devel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]