From: Nathan Bossart <nathandbossart@gmail.com>
To: Devulapalli, Raghuveer <raghuveer.devulapalli@intel.com>
Cc: Shankaran, Akash <akash.shankaran@intel.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>
Cc: David Rowley <dgrowleyml@gmail.com>
Cc: Ants Aasma <ants.aasma@cybertec.at>
Cc: Alvaro Herrera <alvherre@alvh.no-ip.org>
Cc: Amonson, Paul D <paul.d.amonson@intel.com>
Cc: Andres Freund <andres@anarazel.de>
Cc: Noah Misch <noah@leadboat.com>
Cc: Matthias van de Meent <boekewurm+postgres@gmail.com>
Cc: pgsql-hackers@lists.postgresql.org <pgsql-hackers@lists.postgresql.org>
Subject: Re: Popcount optimization using AVX512
Date: Thu, 18 Apr 2024 16:59:02 -0500
Message-ID: <20240418215902.GA3830246@nathanxps13> (raw)
In-Reply-To: <PH8PR11MB8286DB91D214478FB16EE616FB0E2@PH8PR11MB8286.namprd11.prod.outlook.com>
References: <2999492.1712536932@sss.pgh.pa.us>
<20240408012332.GA1351547@nathanxps13>
<20240408013002.GA1352058@nathanxps13>
<3010179.1712540139@sss.pgh.pa.us>
<20240418024459.GA3385227@nathanxps13>
<PH0PR11MB50007F79C92E3B0C7C1E6D6FF20E2@PH0PR11MB5000.namprd11.prod.outlook.com>
<20240418195346.GA3506520@nathanxps13>
<PH8PR11MB8286E1E9D1ADD14300A267CAFB0E2@PH8PR11MB8286.namprd11.prod.outlook.com>
<20240418210158.GA3776258@nathanxps13>
<PH8PR11MB8286DB91D214478FB16EE616FB0E2@PH8PR11MB8286.namprd11.prod.outlook.com>
On Thu, Apr 18, 2024 at 09:29:55PM +0000, Devulapalli, Raghuveer wrote:
> (1) Shouldn't it be: return (_xgetbv(0) & 0xe6) == 0xe6; ? Otherwise
> zmm_regs_available() will return false..
Yes, that's a mistake. I fixed that in v3.
> (2) Nitpick: avx512_popcnt_available and avx512_bw_available() run the
> same cpuid leaf. You could combine them into one to avoid running cpuid
> twice. My apologies, I should have mentioned this before..
Good call. The byte-and-word instructions were a late addition to the
patch, so I missed this originally.
On that note, is it necessary to also check for avx512f? At the moment, we
are assuming that's supported if the other AVX-512 instructions are
available.
--
Nathan Bossart
Amazon Web Services: https://aws.amazon.comAttachments:v3-0001-osxsave.patch (text/x-diff, 3.2K) download
From e04c348eb389c6aa1597ac35d57b5e7ae7075381 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <nathan@postgresql.org>
Date: Thu, 18 Apr 2024 15:57:56 -0500
Subject: [PATCH v3 1/1] osxsave
---
src/port/pg_popcount_avx512_choose.c | 80 ++++++++++++++++------------
1 file changed, 47 insertions(+), 33 deletions(-)
diff --git a/src/port/pg_popcount_avx512_choose.c b/src/port/pg_popcount_avx512_choose.cindex ae3fa3d306..b37107803a 100644--- a/src/port/pg_popcount_avx512_choose.c+++ b/src/port/pg_popcount_avx512_choose.c@@ -34,39 +34,13 @@
#ifdef TRY_POPCNT_FAST
/*
- * Returns true if the CPU supports the instructions required for the AVX-512- * pg_popcount() implementation.+ * Does CPUID say there's support for XSAVE instructions?
*/
-bool-pg_popcount_avx512_available(void)+static inline bool+xsave_available(void)
{
unsigned int exx[4] = {0, 0, 0, 0};
- /* Does CPUID say there's support for AVX-512 popcount instructions? */-#if defined(HAVE__GET_CPUID_COUNT)- __get_cpuid_count(7, 0, &exx[0], &exx[1], &exx[2], &exx[3]);-#elif defined(HAVE__CPUIDEX)- __cpuidex(exx, 7, 0);-#else-#error cpuid instruction not available-#endif- if ((exx[2] & (1 << 14)) == 0) /* avx512-vpopcntdq */- return false;-- /* Does CPUID say there's support for AVX-512 byte and word instructions? */- memset(exx, 0, sizeof(exx));-#if defined(HAVE__GET_CPUID_COUNT)- __get_cpuid_count(7, 0, &exx[0], &exx[1], &exx[2], &exx[3]);-#elif defined(HAVE__CPUIDEX)- __cpuidex(exx, 7, 0);-#else-#error cpuid instruction not available-#endif- if ((exx[1] & (1 << 30)) == 0) /* avx512-bw */- return false;-- /* Does CPUID say there's support for XSAVE instructions? */- memset(exx, 0, sizeof(exx));
#if defined(HAVE__GET_CPUID)
__get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
#elif defined(HAVE__CPUID)
@@ -74,15 +48,55 @@ pg_popcount_avx512_available(void)
#else
#error cpuid instruction not available
#endif
- if ((exx[2] & (1 << 26)) == 0) /* xsave */- return false;+ return (exx[2] & (1 << 27)) != 0; /* osxsave */+}- /* Does XGETBV say the ZMM registers are enabled? */+/*+ * Does XGETBV say the ZMM registers are enabled?+ *+ * NB: Caller is responsible for verifying that xsave_available() returns true+ * before calling this.+ */+static inline bool+zmm_regs_available(void)+{
#ifdef HAVE_XSAVE_INTRINSICS
- return (_xgetbv(0) & 0xe0) != 0;+ return (_xgetbv(0) & 0xe6) == 0xe6;
#else
return false;
#endif
}
+/*+ * Does CPUID say there's support for AVX-512 popcount and byte-and-word+ * instructions?+ */+static inline bool+avx512_popcnt_available(void)+{+ unsigned int exx[4] = {0, 0, 0, 0};++#if defined(HAVE__GET_CPUID_COUNT)+ __get_cpuid_count(7, 0, &exx[0], &exx[1], &exx[2], &exx[3]);+#elif defined(HAVE__CPUIDEX)+ __cpuidex(exx, 7, 0);+#else+#error cpuid instruction not available+#endif+ return (exx[2] & (1 << 14)) != 0 && /* avx512-vpopcntdq */+ (exx[1] & (1 << 30)) != 0; /* avx512-bw */+}++/*+ * Returns true if the CPU supports the instructions required for the AVX-512+ * pg_popcount() implementation.+ */+bool+pg_popcount_avx512_available(void)+{+ return xsave_available() &&+ zmm_regs_available() &&+ avx512_popcnt_available();+}+
#endif /* TRY_POPCNT_FAST */
--
2.25.1
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: nathandbossart@gmail.com, raghuveer.devulapalli@intel.com, akash.shankaran@intel.com, tgl@sss.pgh.pa.us, dgrowleyml@gmail.com, ants.aasma@cybertec.at, alvherre@alvh.no-ip.org, paul.d.amonson@intel.com, andres@anarazel.de, noah@leadboat.com, boekewurm+postgres@gmail.com, pgsql-hackers@lists.postgresql.org
Subject: Re: Popcount optimization using AVX512
In-Reply-To: <20240418215902.GA3830246@nathanxps13>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox