Re: define pg_structiszero(addr, s, r)
David Rowley <dgrowleyml@gmail.com>
From: David Rowley <dgrowleyml@gmail.com>
To: Michael Paquier <michael@paquier.xyz>
Cc: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>,
Ranier Vilela <ranier.vf@gmail.com>, Peter Smith <smithpb2250@gmail.com>, Peter Eisentraut <peter@eisentraut.org>, Heikki Linnakangas <hlinnaka@iki.fi>, pgsql-hackers@lists.postgresql.org
Date: 2024-11-06T00:38:50Z
Lists: pgsql-hackers
On Wed, 6 Nov 2024 at 13:20, Michael Paquier <michael@paquier.xyz> wrote: > > On Wed, Nov 06, 2024 at 12:16:33PM +1300, David Rowley wrote: > > On Wed, 6 Nov 2024 at 04:03, Bertrand Drouvot > > <bertranddrouvot.pg@gmail.com> wrote: > >> Another option could be to use SIMD instructions to check multiple bytes > >> is zero in a single operation. Maybe just an idea to keep in mind and experiment > >> if we feel the need later on. > > > > Could do. I just wrote it that way to give the compiler flexibility to > > do SIMD implicitly. That seemed easier than messing around with SIMD > > intrinsics. I guess the compiler won't use SIMD with the single > > size_t-at-a-time version as it can't be certain it's ok to access the > > memory beyond the first zero word. Because I wrote the "if" condition > > using bitwise-OR, there's no boolean short-circuiting, so the compiler > > sees it must be safe to access all the memory for the loop iteration. > > How complex would that be compared to the latest patch proposed if > done this way? If you can force SIMD without having to know about > these specific gcc switches (aka -march is not set by default in the > tree except for some armv8 path), then the performance happens > magically. If that makes the code more readable, that's even better. We could just write it that way and leave it up to the compiler to decide whether to use SIMD or not. Going by [1], gcc with -O2 uses SIMD instructions from 14.1 and clang with -O2 does it from version 8.0.0. gcc 14.1 was release in May 2024, so still quite new. It'll be quite a bit older once PG18 is out. Using the bitwise-OR method, more and more people will benefit as gcc14.1 and beyond becomes more mainstream. Clang 8.0.0 is from March 2019, so quite old already. David [1] https://godbolt.org/z/MTqao8scW
Commits
-
Use pg_memory_is_all_zeros() in PageIsVerifiedExtended()
- 03a42c9652f8 18.0 landed
-
Optimize pg_memory_is_all_zeros() in memutils.h
- 5be1dabd2ae0 18.0 landed
-
Remove use of pg_memory_is_all_zeros() in bufpage.c
- e819bbb7c82a 18.0 landed
-
Add pg_memory_is_all_zeros() in memutils.h
- 07e9e28b56db 18.0 landed