Re: Improve CRC32C performance on SSE4.2

John Naylor <johncnaylorls@gmail.com>

From: John Naylor <johncnaylorls@gmail.com>
To: Nathan Bossart <nathandbossart@gmail.com>
Cc: "Devulapalli, Raghuveer" <raghuveer.devulapalli@intel.com>, "pgsql-hackers@lists.postgresql.org" <pgsql-hackers@lists.postgresql.org>, "Shankaran, Akash" <akash.shankaran@intel.com>
Date: 2025-02-17T10:58:01Z
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 →
  1. Include _mm512_zextsi128_si512() in AVX-512 configure probes.

  2. Properly fix AVX-512 CRC calculation bug

  3. Workaround code generation bug in clang

  4. Compute CRC32C using AVX-512 instructions where available

  5. Inline CRC computation for small fixed-length input on x86

  6. Be more paranoid in configure's checks for CRC and POPCNT intrinsics.

Attachments

On Thu, Feb 13, 2025 at 5:19 AM Nathan Bossart <nathandbossart@gmail.com> wrote:
>
> On Wed, Feb 12, 2025 at 10:12:20PM +0000, Devulapalli, Raghuveer wrote:
> >> Well, I suspect the AVX-512 version will pretty much always need the runtime
> >> check given that its not available on a lot of newer hardware and requires a
> >> bunch of extra runtime checks (see pg_popcount_avx512.c).  But it might be
> >> worth doing for PCLMUL.  Otherwise, I think we'd have to leave out the PCLMUL
> >> optimizations if built with -msse4.2 -mpclmul because we don't want to regress
> >> existing -msse4.2 users with a runtime check.
> >
> > Sounds good to me. Although, users building with just -msse4.2 will now encounter an
> > an additional pclmul runtime check. That would be a regression unless they update to
> > building with both -msse4.2 and -mpclmul.
>
> My thinking was that building with just -msse4.2 would cause the existing
> SSE 4.2 implementation to be used (without the function pointer).  That's
> admittedly a bit goofy because they'd miss out on the PCLMUL optimization,
> but things at least don't get any worse for them.

I tried using branching for the runtime check, and this looks like the
way to go:
- Existing -msse4.2 builders will still call directly, but inside the
function there is a length check and only for long input will it do a
runtime check for pclmul.
- This smooths the way for -msse4.2 (and the equivalent on Arm) to
inline calls with short constant input (e.g. WAL insert lock),
although I've not done that here.
- This can be a simple starting point for consolidating runtime
checks, as was proposed for popcount in the AVX-512 CRC thread, but
with branching my model was Andres' sketch here:

https://www.postgresql.org/message-id/20240731023918.ixsfbeuub6e76one%40awork3.anarazel.de

--
John Naylor
Amazon Web Services