Re: Reduce timing overhead of EXPLAIN ANALYZE using rdtsc? - Mailing list pgsql-hackers

From John Naylor
Subject Re: Reduce timing overhead of EXPLAIN ANALYZE using rdtsc?
Date
Msg-id CANWCAZZKkBpTqb5OyHZriaJP=yhZVaiu4pjzeWNTN6DN8ndhjg@mail.gmail.com
Whole thread
In response to Re: Reduce timing overhead of EXPLAIN ANALYZE using rdtsc?  (Andres Freund <andres@anarazel.de>)
Responses Re: Reduce timing overhead of EXPLAIN ANALYZE using rdtsc?
List pgsql-hackers
On Thu, Apr 2, 2026 at 7:54 AM Andres Freund <andres@anarazel.de> wrote:
>
> On 2026-03-25 18:17:44 -0700, Lukas Fittl wrote:
> > From 7cc7e230e05947892b2aa479eba45144beede48e Mon Sep 17 00:00:00 2001
> > From: Lukas Fittl <lukas@fittl.com>
> > Date: Sat, 31 Jan 2026 08:49:46 -0800
> > Subject: [PATCH v14 1/6] Check for HAVE__CPUIDEX and HAVE__GET_CPUID_COUNT
> >  separately
>
> John, do you want to take this one, or should I take it?

I can. I took another look just now:

-# Check for __get_cpuid_count() and __cpuidex() in a similar fashion.
+# Check for __get_cpuid_count() and __cpuidex() separately, since we sometimes
+# need __cpuidex() even if __get_cpuid_count() is available.

I'm not sure we need to document here that we need them separately. It
seems more important to do that for the __cpuidex helper that's in a
later patch. I don't feel strongly, though.

I'd probably just do

# Check for __get_cpuid_count()
...

# Check for __cpuidex()
...

Either way, we do need a space between separate tests (ditto Meson).

+if cc.links('''
+    #ifdef _MSC_VER
     #include <intrin.h>
+    #else
+    #include <cpuid.h>
+    #endif
     int main(int arg, char **argv)
     {
-        unsigned int exx[4] = {0, 0, 0, 0};
+        int exx[4] = {0, 0, 0, 0};
         __cpuidex(exx, 7, 0);
     }

Hmm, maybe we can declare unsigned and cast to signed for MSVC as we
do where the code is used.

+# __cpuidex()
+AC_CACHE_CHECK([for __cpuidex], [pgac_cv__cpuidex],
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([#ifdef _MSC_VER
+    #include <intrin.h>
+    #else
+    #include <cpuid.h>
+    #endif],
+  [[int exx[4] = {0, 0, 0, 0};
+  __cpuidex(exx, 7, 0);
+  ]])],
+  [pgac_cv__cpuidex="yes"],
+  [pgac_cv__cpuidex="no"])])
+if test x"$pgac_cv__cpuidex" = x"yes"; then
+  AC_DEFINE(HAVE__CPUIDEX, 1, [Define to 1 if you have __cpuidex.])
 fi

MSVC doesn't use autoconf, so we can leave out the intrin.h and keep
using unsigned int.

-#if defined(HAVE__GET_CPUID) || defined(HAVE__GET_CPUID_COUNT)
-#include <cpuid.h>
-#endif
-
-#if defined(HAVE__CPUID) || defined(HAVE__CPUIDEX)
+#if defined(HAVE__CPUID) || defined(HAVE__GET_CPUID) ||
defined(HAVE__GET_CPUID_COUNT) || defined(HAVE__CPUIDEX)
+#if defined(_MSC_VER)
 #include <intrin.h>
+#else
+#include <cpuid.h>
+#endif /* defined(_MSC_VER) */
 #endif

Now I'm thinking at least one of these will be defined, otherwise we'd
have an #error, so we can just gate solely on _MSC_VER.

--
John Naylor
Amazon Web Services



pgsql-hackers by date:

Previous
From: Thomas Munro
Date:
Subject: Re: pg_waldump: support decoding of WAL inside tarfile
Next
From: Peter Smith
Date:
Subject: Re: Redundant/mis-use of _(x) gettext macro?