[go: up one dir, main page]

Re: [COMMITTERS] pgsql: Use Intel SSE 4.2 CRC instructions where available.

Lists: pgsql-committerspgsql-hackers
From: Heikki Linnakangas <heikki(dot)linnakangas(at)iki(dot)fi>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Use Intel SSE 4.2 CRC instructions where available.
Date: 2015-04-14 14:09:28
Message-ID: E1Yi1Wq-0000tM-Kk@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-committers pgsql-hackers

Use Intel SSE 4.2 CRC instructions where available.

Modern x86 and x86-64 processors with SSE 4.2 support have special
instructions, crc32b and crc32q, for calculating CRC-32C. They greatly
speed up CRC calculation.

Whether the instructions can be used or not depends on the compiler and the
target architecture. If generation of SSE 4.2 instructions is allowed for
the target (-msse4.2 flag on gcc and clang), use them. If they are not
allowed by default, but the compiler supports the -msse4.2 flag to enable
them, compile just the CRC-32C function with -msse4.2 flag, and check at
runtime whether the processor we're running on supports it. If it doesn't,
fall back to the slicing-by-8 algorithm. (With the common defaults on
current operating systems, the runtime-check variant is what you get in
practice.)

Abhijit Menon-Sen, heavily modified by me, reviewed by Andres Freund.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/3dc2d62d0486325bf263655c2d9a96aee0b02abe

Modified Files
--------------
config/c-compiler.m4 | 27 ++++++
configure | 212 +++++++++++++++++++++++++++++++++++++++++
configure.in | 78 +++++++++++++++
src/Makefile.global.in | 4 +
src/include/pg_config.h.in | 15 +++
src/include/pg_config.h.win32 | 23 ++++-
src/include/port/pg_crc32c.h | 44 +++++++++
src/port/Makefile | 8 +-
src/port/pg_crc32c_choose.c | 63 ++++++++++++
src/port/pg_crc32c_sse42.c | 52 ++++++++++
src/tools/msvc/Mkvcbuild.pm | 13 ++-
11 files changed, 534 insertions(+), 5 deletions(-)


From: Simon Riggs <simon(at)2ndQuadrant(dot)com>
To: Heikki Linnakangas <heikki(dot)linnakangas(at)iki(dot)fi>
Cc: pgsql-committers <pgsql-committers(at)postgresql(dot)org>
Subject: Re: pgsql: Use Intel SSE 4.2 CRC instructions where available.
Date: 2015-04-14 15:28:26
Message-ID: CA+U5nM+Aq5tKb7qHZ7rS0B9KNX6HDYiEgGHem-bP6s3rq=HGDA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-committers pgsql-hackers

On 14 April 2015 at 10:09, Heikki Linnakangas <heikki(dot)linnakangas(at)iki(dot)fi> wrote:

> Abhijit Menon-Sen, heavily modified by me, reviewed by Andres Freund.

Did the heavy modifications have any affect on the patch behaviour, or
was this just related to where you would like to put the code?

I know you like to rewrite things your way, just wanted to check what
happened. Thanks.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, RemoteDBA, Training & Services


From: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>
To: Simon Riggs <simon(at)2ndQuadrant(dot)com>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: [COMMITTERS] pgsql: Use Intel SSE 4.2 CRC instructions where available.
Date: 2015-04-14 15:34:31
Message-ID: 552D3387.7090807@iki.fi
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-committers pgsql-hackers

On 04/14/2015 06:28 PM, Simon Riggs wrote:
> On 14 April 2015 at 10:09, Heikki Linnakangas <heikki(dot)linnakangas(at)iki(dot)fi> wrote:
>
>> Abhijit Menon-Sen, heavily modified by me, reviewed by Andres Freund.
>
> Did the heavy modifications have any affect on the patch behaviour, or
> was this just related to where you would like to put the code?

Didn't affect behaviour.

Hmm, the buildfarm animals using Intel C compiler didn't like this
patch. The problem seems to be that unlike on gcc and clang, icc always
has the SSE 4.2 intrinsics (_mm_crc32_u64, _mm_crc32_u8 etc.), even when
the target CPU architecture is not SSE 4.2. On gcc/clang, those
intrinsics are not defined unless you build with -msse4.2.

I'll try to find a fix. I think we could use the __SSE4_2__ define to
check whether SSE4.2 is targeted. Or we can punt and always build the
version with the runtime check, unless overridden manually at configure
command line.

- Heikki


From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Heikki Linnakangas <heikki(dot)linnakangas(at)iki(dot)fi>
Cc: pgsql-committers(at)postgresql(dot)org
Subject: Re: pgsql: Use Intel SSE 4.2 CRC instructions where available.
Date: 2015-04-14 15:40:11
Message-ID: 3073.1429026011@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-committers pgsql-hackers

Heikki Linnakangas <heikki(dot)linnakangas(at)iki(dot)fi> writes:
> Whether the instructions can be used or not depends on the compiler and the
> target architecture. If generation of SSE 4.2 instructions is allowed for
> the target (-msse4.2 flag on gcc and clang), use them. If they are not
> allowed by default, but the compiler supports the -msse4.2 flag to enable
> them, compile just the CRC-32C function with -msse4.2 flag, and check at
> runtime whether the processor we're running on supports it. If it doesn't,
> fall back to the slicing-by-8 algorithm. (With the common defaults on
> current operating systems, the runtime-check variant is what you get in
> practice.)

The buildfarm says this doesn't work terribly well, at least not with icc.

regards, tom lane


From: Simon Riggs <simon(at)2ndQuadrant(dot)com>
To: "hlinnaka(at)iki(dot)fi" <hlinnaka(at)iki(dot)fi>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: [COMMITTERS] pgsql: Use Intel SSE 4.2 CRC instructions where available.
Date: 2015-04-14 16:01:56
Message-ID: CA+U5nMKDOpThHSAp3FGEpQbHhAc9iCoip_-yst1BW-Z2nNUGnQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-committers pgsql-hackers

On 14 April 2015 at 11:34, Heikki Linnakangas <hlinnaka(at)iki(dot)fi> wrote:

> Or we can punt and always build the version with
> the runtime check, unless overridden manually at configure command line.

That seems safer as the default, which is what the original patch did.

We can optimise that for known good builds later if desired.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, RemoteDBA, Training & Services


From: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>
To: Simon Riggs <simon(at)2ndQuadrant(dot)com>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: [COMMITTERS] pgsql: Use Intel SSE 4.2 CRC instructions where available.
Date: 2015-04-14 18:05:34
Message-ID: 552D56EE.1020100@iki.fi
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-committers pgsql-hackers

On 04/14/2015 07:01 PM, Simon Riggs wrote:
> On 14 April 2015 at 11:34, Heikki Linnakangas <hlinnaka(at)iki(dot)fi> wrote:
>
>> Or we can punt and always build the version with
>> the runtime check, unless overridden manually at configure command line.
>
> That seems safer as the default, which is what the original patch did.
>
> We can optimise that for known good builds later if desired.

I committed the __SSE_4_2__ test for now, so we still build the SSE-only
version if the target allows that. We'll see how that works..

- Heikki