Re: pgbench - add pseudo-random permutation function
Thomas Munro <thomas.munro@gmail.com>
From: Thomas Munro <thomas.munro@gmail.com>
To: Fabien COELHO <coelho@cri.ensmp.fr>
Cc: Hironobu SUZUKI <hironobu@interdb.jp>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>,
David Steele <david@pgmasters.net>
Date: 2019-07-16T04:47:55Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
pgbench: Function to generate random permutations.
- 6b258e3d688d 14.0 landed
-
Add basic support for using the POPCNT and SSE4.2s LZCNT opcodes
- 711bab1e4d19 12.0 cited
-
Further improve code for probing the availability of ARM CRC instructions.
- a7a7387575b8 11.0 cited
On Fri, May 24, 2019 at 2:46 AM Fabien COELHO <coelho@cri.ensmp.fr> wrote:
> Here is a v15 which is a rebase, plus a large simplification of the modmul
> function if an int128 type is available, which is probably always…
> > Function nbits(), which was previously discussed, has been simplified by
> > using the function pg_popcount64().
Hi Fabien, Suzuki-san,
I am not smart enough to commit this or judge its value for
benchmarking, but I have a few trivial comments on the language:
+ It allows to mix the output of non uniform random functions so that
"It allows the output of non-uniform random functions to be mixed so that"
+ ensures that a perfect permutation is applied: there are no collisions
+ nor holes in the output values.
"neither collisions nor holes", or "no collisions or holes"
+ The function errors if size is not positive.
"raises an error"
+ * 24 bits mega primes from https://primes.utm.edu/lists/small/millions/
"24 bit mega primes"
+/* length of n binary representation */
+static int
+nbits(uint64 n)
+{
+ /* set lower bits to 1 and count them */
+ return pg_popcount64(compute_mask(n));
+}
I suppose you could use n == 0 ? 0 : pg_leftmost_one_pos64(n) + 1, and then...
+/* return smallest mask holding n */
+static uint64
+compute_mask(uint64 n)
+{
+ n |= n >> 1;
+ n |= n >> 2;
+ n |= n >> 4;
+ n |= n >> 8;
+ n |= n >> 16;
+ n |= n >> 32;
+ return n;
+}
... here you could use 1 << nbits(n)) - 1. I have no idea if doing it
that way around is better, it's just a thought and removes a few lines
of bit-swizzling code.
--
Thomas Munro
https://enterprisedb.com