public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Noah Goldstein <goldstein.w.n@gmail.com>
To: Alexander Monakov <amonakov@ispras.ru>
Cc: GNU C Library <libc-alpha@sourceware.org>,
	"H.J. Lu" <hjl.tools@gmail.com>,
	"Carlos O'Donell" <carlos@systemhalted.org>
Subject: Re: [PATCH v6 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h
Date: Tue, 10 May 2022 12:17:20 -0500	[thread overview]
Message-ID: <CAFUsyfK+O4iXcmmWCCfJ8RNdCphDSh4dsMwz2oJVg9xkYzdaqg@mail.gmail.com> (raw)
In-Reply-To: <e851882f-91b5-6b9d-bce4-0308b966e25@ispras.ru>

On Tue, May 10, 2022 at 11:49 AM Alexander Monakov <amonakov@ispras.ru> wrote:
>
> On Tue, 10 May 2022, Noah Goldstein wrote:
>
> > Unroll slightly and enforce good instruction scheduling. This improves
> > performance on out-of-order machines. Note the unrolling allows
> > for pipelined multiplies which helps a bit, but most of the gain
> > is from enforcing better instruction scheduling for more ILP.
> > Unrolling further started to induce slowdowns for sizes [0, 4]
> > but can help the loop so if larger sizes are the target further
> > unrolling can be beneficial.
> >
> > Results for _dl_new_hash
> > Benchmarked on Tigerlake: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
>
> It seems benchmark figures are unchanged from the first iteration of this
> patch, did the revision not affect them?

Didn't rerun, will do for V7.
>
> (more comments below)
>
> > --- a/elf/dl-new-hash.h
> > +++ b/elf/dl-new-hash.h
> > @@ -20,15 +20,55 @@
> >  #define _DL_NEW_HASH_H 1
> >
> >  #include <stdint.h>
> > +/* For __glibc_unlikely.  */
> > +#include <sys/cdefs.h>
> >
> >  static inline uint32_t
> >  __attribute__ ((unused))
> > -_dl_new_hash (const char *s)
> > +_dl_new_hash (const char *signed_s)
>
> This is technically inaccurate (whether plain 'char' is signed depends on the
> target), so if you're revising this further I'd suggest to change this too to
> e.g. 'str'.

Will fix for V7.
>
> >  {
> > -  uint32_t h = 5381;
> > -  for (unsigned char c = *s; c != '\0'; c = *++s)
> > -    h = h * 33 + c;
> > -  return h;
>
> I think it would be nice to retain this loop as a comment to indicate what this
> function is supposed to implement.

Will fix for V7.
>
> > +  const unsigned char *s = (const unsigned char *) signed_s;
> > +  unsigned int h = 5381;
> > +  unsigned int c0, c1;
> > +  for (;;)
> > +    {
> > +      c0 = (unsigned int) *s;
>
> Surprised to see an explicit cast where plain assignment with implicit type
> conversion is doing the obvious thing. Is it really necessary?

It's not, I just tend to err on the side of explicitness.

>
> > +      /* Unlikely length zero string so evens will be slightly less
> > +      common.  */
>
> I had trouble understanding this comment. I'd suggest dropping it or rephrasing
> like 'Since hashed string is normally not empty, this is unlikely on the first
> iteration of the loop'.

Will fix for V7.
>
> > +      if (__glibc_unlikely (c0 == 0))
> > +     {
> > +       return h;
> > +     }
>
> Braces look unnecessary.

Will fix v7.
>
> > +
> > +      c1 = (unsigned int) *(s + 1);
>
> Again unnecessary explicit cast here (c1 = s[1] might be easier to read).
> Alternatively, you could use 'c1 = *s++' here and above and drop explicit
> s += 2 below, I expect resulting assembly to be the same.

generally think user `[]` access makes stylistic sense when incrementing
an index and *(s1 + N) makes sense when incrementing a pointer.

I'm generally in favor of leaving the casts/access as is but its not a hill
worth dying on.

LMK if its important to you for V7 (will be a few hours to rerun benchmarks).

>
> > +      if (c1 == 0)
> > +     {
> > +       c0 += h;
> > +       /* Ideal instruction scheduling is:
> > +          c0 += h;
> > +          h *= 32;
> > +          h += c0;
> > +          The asm statement ensures the compiler can't mess that up.  */
>
> The main concern here is preventing reassociation from 'h = h*32 + (c0 + h)'
> to 'h = (h*32 + h) + c0', not scheduling. We're using an empty asm to break
> up a sequence of additions.

Well the reason (h * 32 + h) + c0 is worse is it creates scheduling
dependencies.
No? Seems like if the comment is "to avoid reassociation" the natural question
is why does reassociation matter? To say it's explicitly for
scheduling answers that.

I'll update the comment in V7 to mention both.
>
> Also note that this leads to a return, so only saves a couple cycles once per
> call, not inside the loop.
>
> > +       asm("" : "+r"(h) : "r"(c0));
> > +       h = h * 32 + c0;
> > +      return h;
>
> Wrong indentation here.

Will fix V7.
>
> > +     }
> > +
> > +      /* Ideal instruction scheduling is:
> > +      c1 += c0;
> > +      h *= 33 * 33;
> > +      c0 *= 32;
> > +      c1 += c0;
> > +      h  += c1;
> > +      The asm statements ensures the compiler can't mess that up.  */
>
> As above, we are placing empty asms mainly as reassociation barriers.

Will update to mention both. It really is a missed-optimization in GCC
instruction
scheduling pass though.
>
> > +      c1 += c0;
> > +      asm("" : "+r"(c1), "+r"(c0));
> > +      h *= 33 * 33;
> > +      c1 += c0 * 32;
> > +      asm("" : "+r"(c1));
> > +      h += c1;
> > +      s += 2;
> > +    }
> >  }
>
> Alexander

  reply	other threads:[~2022-05-10 17:17 UTC|newest]

Thread overview: 167+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-14  4:12 [PATCH v1 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Noah Goldstein
2022-04-14  4:12 ` [PATCH v1 2/6] elf: Add tests for the hash functions in dl-hash.h Noah Goldstein
2022-04-14  4:12 ` [PATCH v1 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-04-14  4:12 ` [PATCH v1 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-04-14  4:12 ` [PATCH v1 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-04-14  4:12 ` [PATCH v1 6/6] elf: Optimize __dl_new_hash in dl-hash.h Noah Goldstein
2022-04-14  4:32 ` [PATCH v1 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked H.J. Lu
2022-04-14 14:56   ` Noah Goldstein
2022-04-14 14:55 ` [PATCH v2 " Noah Goldstein
2022-04-14 14:55   ` [PATCH v2 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-04-25 15:39     ` Florian Weimer
2022-04-25 15:59       ` Noah Goldstein
2022-04-14 14:55   ` [PATCH v2 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-04-25 15:38     ` Florian Weimer
2022-04-25 15:58       ` Noah Goldstein
2022-04-26  8:35         ` Florian Weimer
2022-04-26 21:39           ` Noah Goldstein
2022-04-27 10:48             ` Florian Weimer
2022-04-27 15:02               ` Noah Goldstein
2022-04-14 14:55   ` [PATCH v2 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-04-14 14:55   ` [PATCH v2 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-04-14 14:55   ` [PATCH v2 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-04-25 15:58 ` [PATCH v3 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Noah Goldstein
2022-04-25 15:58   ` [PATCH v3 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-04-25 15:58   ` [PATCH v3 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-04-25 15:58   ` [PATCH v3 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-04-25 15:58   ` [PATCH v3 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-04-25 15:58   ` [PATCH v3 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-04-25 16:01   ` [PATCH v3 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Adhemerval Zanella
2022-04-25 16:18     ` Noah Goldstein
2022-04-25 15:59 ` [PATCH v1 " Adhemerval Zanella
2022-04-25 16:16   ` Noah Goldstein
2022-04-25 16:35 ` [PATCH v3 " Noah Goldstein
2022-04-25 16:35   ` [PATCH v3 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-04-25 16:35   ` [PATCH v3 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-04-27 10:39     ` Florian Weimer
2022-04-27 16:24       ` Noah Goldstein
2022-04-25 16:35   ` [PATCH v3 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-04-25 16:36   ` [PATCH v3 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-04-27 10:47     ` Florian Weimer
2022-04-25 16:36   ` [PATCH v3 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-04-27 10:43     ` Florian Weimer
2022-04-27 16:25       ` Noah Goldstein
2022-04-27 15:02     ` Alexander Monakov
     [not found]       ` <CAFUsyfKeocq4VAusvnggq-NR=tOQTjrD0Z6r3CYCTjGQ=tGGSw@mail.gmail.com>
     [not found]         ` <f54f1ec9-fc31-283f-bce9-59fd8bda98ad@ispras.ru>
2022-04-27 16:23           ` Noah Goldstein
2022-04-28 18:03             ` Alexander Monakov
2022-05-04 18:04               ` Alexander Monakov
2022-05-05 11:07                 ` Alexander Monakov
2022-05-05 15:10                   ` Noah Goldstein
2022-05-05 15:26                     ` Alexander Monakov
2022-05-05 18:03                       ` Noah Goldstein
2022-05-05 19:37                         ` Alexander Monakov
2022-05-05 22:51                           ` Noah Goldstein
2022-04-27 16:19 ` [PATCH v4 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Noah Goldstein
2022-04-27 16:19   ` [PATCH v4 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-04-27 16:19   ` [PATCH v4 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-04-27 16:20   ` [PATCH v4 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-04-27 16:20   ` [PATCH v4 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-04-27 16:20   ` [PATCH v4 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-05-09 17:17 ` [PATCH v5 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Noah Goldstein
2022-05-09 17:17   ` [PATCH v5 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-05-09 17:17   ` [PATCH v5 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-05-09 17:17   ` [PATCH v5 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-05-09 17:17   ` [PATCH v5 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-05-09 17:17   ` [PATCH v5 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-05-10 11:58     ` Adhemerval Zanella
2022-05-10 15:04 ` [PATCH v6 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Noah Goldstein
2022-05-10 15:04   ` [PATCH v6 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-05-10 15:04   ` [PATCH v6 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-05-10 15:04   ` [PATCH v6 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-05-10 15:04   ` [PATCH v6 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-05-10 15:04   ` [PATCH v6 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-05-10 15:29     ` H.J. Lu
2022-05-10 15:31       ` H.J. Lu
2022-05-10 16:49     ` Alexander Monakov
2022-05-10 17:17       ` Noah Goldstein [this message]
2022-05-10 17:40         ` Alexander Monakov
2022-05-10 23:30 ` [PATCH v7 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Noah Goldstein
2022-05-10 23:30   ` [PATCH v7 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-05-10 23:30   ` [PATCH v7 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-05-10 23:30   ` [PATCH v7 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-05-10 23:30   ` [PATCH v7 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-05-10 23:30   ` [PATCH v7 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-05-10 23:46     ` H.J. Lu
2022-05-11  3:07       ` Noah Goldstein
2022-05-11  3:06 ` [PATCH v8 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Noah Goldstein
2022-05-11  3:06   ` [PATCH v8 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-05-11  3:06   ` [PATCH v8 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-05-11  3:06   ` [PATCH v8 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-05-11  3:06   ` [PATCH v8 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-05-11  3:06   ` [PATCH v8 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-05-16 14:12     ` Siddhesh Poyarekar
2022-05-16 14:31       ` Alexander Monakov
2022-05-16 16:23         ` Siddhesh Poyarekar
2022-05-16 16:38           ` Noah Goldstein
2022-05-16 16:44             ` Siddhesh Poyarekar
2022-05-16 20:32               ` Noah Goldstein
2022-05-16 18:09       ` Alexander Monakov
2022-05-16 18:47         ` Siddhesh Poyarekar
2022-05-16 19:28           ` Alexander Monakov
2022-05-16 19:35             ` Noah Goldstein
2022-05-16 19:41               ` Alexander Monakov
2022-05-16 19:47                 ` Adhemerval Zanella
2022-05-16 20:00                   ` Alexander Monakov
2022-05-16 20:08                     ` Adhemerval Zanella
2022-05-16 20:27                       ` Alexander Monakov
2022-05-16 19:48                 ` Noah Goldstein
2022-05-16 20:33                   ` Alexander Monakov
2022-05-16 21:40                     ` Noah Goldstein
2022-05-17  1:45             ` Siddhesh Poyarekar
2022-05-16 13:56   ` [PATCH v8 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Siddhesh Poyarekar
2022-05-16 20:31     ` Noah Goldstein
2022-05-16 20:29 ` [PATCH v9 " Noah Goldstein
2022-05-16 20:30   ` [PATCH v9 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-05-17  4:19     ` Siddhesh Poyarekar
2022-05-18 17:29       ` Noah Goldstein
2022-05-16 20:30   ` [PATCH v9 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-05-17  4:32     ` Siddhesh Poyarekar
2022-05-18 17:30       ` Noah Goldstein
2022-05-16 20:30   ` [PATCH v9 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-05-17  4:52     ` Siddhesh Poyarekar
2022-05-18 17:33       ` Noah Goldstein
2022-05-16 20:30   ` [PATCH v9 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-05-17  5:11     ` Siddhesh Poyarekar
2022-05-18 17:34       ` Noah Goldstein
2022-05-18 17:35         ` Noah Goldstein
2022-05-16 20:30   ` [PATCH v9 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-05-17  5:12     ` Siddhesh Poyarekar
2022-05-18 17:38       ` Noah Goldstein
2022-05-19 15:59         ` Siddhesh Poyarekar
2022-05-19 16:54           ` DJ Delorie
2022-05-17  3:34   ` [PATCH v9 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Siddhesh Poyarekar
2022-05-18 17:28     ` Noah Goldstein
2022-05-18 17:26 ` [PATCH v10 " Noah Goldstein
2022-05-18 17:26   ` [PATCH v10 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-05-19 14:49     ` Siddhesh Poyarekar
2022-05-18 17:26   ` [PATCH v10 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-05-19 15:09     ` Siddhesh Poyarekar
2022-05-19 15:40       ` Siddhesh Poyarekar
2022-05-19 22:20         ` Noah Goldstein
2022-05-18 17:26   ` [PATCH v10 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-05-19 15:34     ` Siddhesh Poyarekar
2022-05-19 22:20       ` Noah Goldstein
2022-05-18 17:26   ` [PATCH v10 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-05-19 15:41     ` Siddhesh Poyarekar
2022-05-19 22:21       ` Noah Goldstein
2022-05-18 17:26   ` [PATCH v10 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-05-18 17:32     ` H.J. Lu
2022-05-18 17:39       ` Noah Goldstein
2022-05-19  7:53       ` Siddhesh Poyarekar
2022-05-19 15:55     ` Siddhesh Poyarekar
2022-05-19 22:22       ` Noah Goldstein
2022-05-19 14:47   ` [PATCH v10 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Siddhesh Poyarekar
2022-05-19 14:50     ` Noah Goldstein
2022-05-19 14:56       ` Siddhesh Poyarekar
2022-05-19 22:17 ` [PATCH v11 " Noah Goldstein
2022-05-19 22:17   ` [PATCH v11 2/6] elf: Add tests for the dl hash funcs (_dl_new_hash and _dl_elf_hash) Noah Goldstein
2022-05-19 22:19     ` Noah Goldstein
2022-05-19 22:18   ` [PATCH v11 3/6] nss: Add tests for the nss_hash in nss_hash.h Noah Goldstein
2022-05-23  7:42     ` Siddhesh Poyarekar
2022-05-19 22:18   ` [PATCH v11 4/6] benchtests: Add benchtests for dl_elf_hash, dl_new_hash and nss_hash Noah Goldstein
2022-05-23  7:44     ` Siddhesh Poyarekar
2022-05-19 22:18   ` [PATCH v11 5/6] nss: Optimize nss_hash in nss_hash.c Noah Goldstein
2022-05-23  7:44     ` Siddhesh Poyarekar
2022-05-19 22:18   ` [PATCH v11 6/6] elf: Optimize _dl_new_hash in dl-new-hash.h Noah Goldstein
2022-05-23  7:46     ` Siddhesh Poyarekar
2022-05-19 22:18   ` [PATCH v11 1/6] elf: Refactor dl_new_hash so it can be tested / benchmarked Noah Goldstein

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAFUsyfK+O4iXcmmWCCfJ8RNdCphDSh4dsMwz2oJVg9xkYzdaqg@mail.gmail.com \
    --to=goldstein.w.n@gmail.com \
    --cc=amonakov@ispras.ru \
    --cc=carlos@systemhalted.org \
    --cc=hjl.tools@gmail.com \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).