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-03-11T11:13:05Z
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 →
-
Include _mm512_zextsi128_si512() in AVX-512 configure probes.
- ccd5bc93fdfe 18.0 landed
-
Properly fix AVX-512 CRC calculation bug
- 43da394304fb 18.0 landed
-
Workaround code generation bug in clang
- f83f14881c7a 18.0 landed
-
Compute CRC32C using AVX-512 instructions where available
- 3c6e8c123896 18.0 landed
-
Inline CRC computation for small fixed-length input on x86
- e2809e3a1015 18.0 landed
-
Be more paranoid in configure's checks for CRC and POPCNT intrinsics.
- fdb5dd6331e3 18.0 cited
Attachments
- v14-0004-Always-do-runtime-check-for-x86-to-simplify-PCLM.patch (text/x-patch) patch v14-0004
- v14-0008-Temp-fixup-build-of-benchmark-on-Windows.patch (text/x-patch) patch v14-0008
- v14-0007-AVX-512-CRC-autoconf.patch (text/x-patch) patch v14-0007
- v14-0005-Add-runtime-support-for-AVX-512-CRC.patch (text/x-patch) patch v14-0005
- v14-0006-AVX-512-CRC-Meson.patch (text/x-patch) patch v14-0006
- v14-0002-Inline-CRC-computation-for-fixed-length-input.patch (text/x-patch) patch v14-0002
- v14-0003-Improve-CRC32C-performance-on-x86_64.patch (text/x-patch) patch v14-0003
- v14-0001-Add-a-Postgres-SQL-function-for-crc32c-benchmark.patch (text/x-patch) patch v14-0001
On Tue, Mar 11, 2025 at 4:47 AM Nathan Bossart <nathandbossart@gmail.com> wrote: > > On Mon, Mar 10, 2025 at 03:48:31PM +0700, John Naylor wrote: > > On Tue, Mar 4, 2025 at 2:11 AM Nathan Bossart <nathandbossart@gmail.com> wrote: > >> Overall, I wish we could avoid splitting things into separate files and > >> adding more header file gymnastics, but maybe there isn't much better we > >> can do without overhauling the CPU feature detection code. > > > > I wanted to make an attempt to make this aspect nicer. v13-0002 > > incorporates deliberately compact and simple loops for inlined > > constant input into the dispatch function, and leaves the existing > > code alone. This avoids code churn and saves vertical space in the > > copied code. It needs a bit more commentary, but I hope this is a more > > digestible prerequisite to the CLMUL algorithm -- as a reminder, it'll > > be simpler if we can always assume non-constant input can go through a > > function pointer. > > That is certainly more readable. FWIW I think it would be entirely > reasonable to replace the pg_crc32c_sse42.c implementation with a call to > this new pg_comp_crc32c_dispatch() function. Of course, you'd have to > split things up like: > [snip] That could work as well. I'm thinking if we do PMULL on Arm, it might be advantageous to keep the inline path and function paths with distinct coding -- because of the pickier alignment on that platform, it might not be worth pre-aligning the pointer to 8 bytes for a 20-byte constant input. I've gone ahead and added the generated AVX-512 algorithm in v14-0005, and added the build support and some of the runtime support from Paul and Raghuveer's earlier patches in 0006-7. It passes CI, but I'll have to arrange access to other hardware to verify the runtime behavior. I think the Meson support is most of the way there, but it looks like configure.ac got whacked around cosmetically quite a bit. If we feel it's time to refactor things there, we'll want to split that out. In any case, for autoconf I've pretty much kept the earlier work for now. -- John Naylor Amazon Web Services