Re: Improve CRC32C performance on SSE4.2

Tom Lane <tgl@sss.pgh.pa.us>

From: Tom Lane <tgl@sss.pgh.pa.us>
To: John Naylor <johncnaylorls@gmail.com>
Cc: Andy Fan <zhihuifan1213@163.com>, "Devulapalli, Raghuveer" <raghuveer.devulapalli@intel.com>, Nathan Bossart <nathandbossart@gmail.com>, Jesper Pedersen <jesperpedersen.db@gmail.com>, Tomas Vondra <tomas@vondra.me>, "pgsql-hackers@lists.postgresql.org" <pgsql-hackers@lists.postgresql.org>, "Shankaran, Akash" <akash.shankaran@intel.com>
Date: 2025-06-23T14:51:21Z
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.

John Naylor <johncnaylorls@gmail.com> writes:
> Pushed, thanks everyone!

This has broken the build completely on my RHEL8 x86_64 box,
with gcc 8.5.0:

$ ./configure ...
$ make -s
pg_crc32c_sse42.c: In function 'pg_comp_crc32c_avx512':
pg_crc32c_sse42.c:126:25: warning: implicit declaration of function '_mm512_zextsi128_si512'; did you mean '_mm512_castsi128_si512'? [-Wimplicit-function-declaration]
   x0 = _mm512_xor_si512(_mm512_zextsi128_si512(_mm_cvtsi32_si128(crc0)), x0);
                         ^~~~~~~~~~~~~~~~~~~~~~
                         _mm512_castsi128_si512
pg_crc32c_sse42.c:126:25: error: incompatible type for argument 1 of '_mm512_xor_si512'
   x0 = _mm512_xor_si512(_mm512_zextsi128_si512(_mm_cvtsi32_si128(crc0)), x0);
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-redhat-linux/8/include/immintrin.h:45,
                 from pg_crc32c_sse42.c:19:
/usr/lib/gcc/x86_64-redhat-linux/8/include/avx512fintrin.h:7267:27: note: expected '__m512i' {aka '__vector(8) long long int'} but argument is of type 'int'
 _mm512_xor_si512 (__m512i __A, __m512i __B)
                   ~~~~~~~~^~~
make[2]: *** [<builtin>: pg_crc32c_sse42.o] Error 1

I see similar symptoms on buildfarm animal conchuela, which
is DragonFly BSD of some vintage or other.  Not sure why
more animals aren't complaining.  Anyway, it seems that the
configure probe to see if this facility is available had
better be adjusted to match the new code.

			regards, tom lane