Re: Reduce timing overhead of EXPLAIN ANALYZE using rdtsc?

From: John Naylor <johncnaylorls(at)gmail(dot)com>
To: Andres Freund <andres(at)anarazel(dot)de>
Cc: Lukas Fittl <lukas(at)fittl(dot)com>, Jakub Wartak <jakub(dot)wartak(at)enterprisedb(dot)com>, Hannu Krosing <hannuk(at)google(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>, vignesh C <vignesh21(at)gmail(dot)com>, Michael Paquier <michael(at)paquier(dot)xyz>, Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>, Maciek Sakrejda <m(dot)sakrejda(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, David Geier <geidav(dot)pg(at)gmail(dot)com>
Subject: Re: Reduce timing overhead of EXPLAIN ANALYZE using rdtsc?
Date: 2026-04-02 02:17:49
Message-ID: CANWCAZZKkBpTqb5OyHZriaJP=yhZVaiu4pjzeWNTN6DN8ndhjg@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Thu, Apr 2, 2026 at 7:54 AM Andres Freund <andres(at)anarazel(dot)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(at)fittl(dot)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

In response to

Browse pgsql-hackers by date

  From Date Subject
Previous Message Thomas Munro 2026-04-02 02:14:09 Re: pg_waldump: support decoding of WAL inside tarfile