Re: add AVX2 support to simd.h
John Naylor <johncnaylorls@gmail.com>
From: John Naylor <johncnaylorls@gmail.com>
To: Nathan Bossart <nathandbossart@gmail.com>
Cc: Ants Aasma <ants@cybertec.at>, pgsql-hackers@postgresql.org
Date: 2024-03-21T04:30:30Z
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 →
-
Improve style of pg_lfind32().
- 7188a7806d20 17.0 landed
-
Fix compiler warning for pg_lfind32().
- 1f42337be535 17.0 landed
-
Micro-optimize pg_lfind32().
- 7644a7340c8a 17.0 landed
-
Introduce helper SIMD functions for small byte arrays
- 9f225e992bed 17.0 cited
-
Optimize xid/subxid searches in XidInMVCCSnapshot().
- 37a6e5df3713 16.0 cited
On Thu, Mar 21, 2024 at 2:55 AM Nathan Bossart <nathandbossart@gmail.com> wrote: > > On Wed, Mar 20, 2024 at 09:31:16AM -0500, Nathan Bossart wrote: > > I don't mind removing the 2-register stuff if that's what you think we > > should do. I'm cautiously optimistic that it'd help more than the extra > > branch prediction might hurt, and it'd at least help avoid regressing the > > lower end for the larger AVX2 registers, but I probably won't be able to > > prove that without constructing another benchmark. And TBH I'm not sure > > it'll significantly impact any real-world workload, anyway. > > Here's a new version of the patch set with the 2-register stuff removed, I'm much happier about v5-0001. With a small tweak it would match what I had in mind: + if (nelem < nelem_per_iteration) + goto one_by_one; If this were "<=" then the for long arrays we could assume there is always more than one block, and wouldn't need to check if any elements remain -- first block, then a single loop and it's done. The loop could also then be a "do while" since it doesn't have to check the exit condition up front. > plus a fresh run of the benchmark. The weird spike for AVX2 is what led me > down the 2-register path earlier. Yes, that spike is weird, because it seems super-linear. However, the more interesting question for me is: AVX2 isn't really buying much for the numbers covered in this test. Between 32 and 48 elements, and between 64 and 80, it's indistinguishable from SSE2. The jumps to the next shelf are postponed, but the jumps are just as high. From earlier system benchmarks, I recall it eventually wins out with hundreds of elements, right? Is that still true? Further, now that the algorithm is more SIMD-appropriate, I wonder what doing 4 registers at a time is actually buying us for either SSE2 or AVX2. It might just be a matter of scale, but that would be good to understand.