Tim Armstrong created IMPALA-9690:
-------------------------------------

             Summary: Bump minimum x86-64 CPU requirements
                 Key: IMPALA-9690
                 URL: https://issues.apache.org/jira/browse/IMPALA-9690
             Project: IMPALA
          Issue Type: Improvement
          Components: Backend
            Reporter: Tim Armstrong
            Assignee: Tim Armstrong


We still have a minimum CPU requirement of SSSE3 support 
https://impala.apache.org/docs/build/html/topics/impala_prereqs.html. I.e. we 
don't assume SSE4.2 or AVX or AVX2.

There is a lot of legacy code to support CPUs without SSE4.2 and various other 
extensions. As a start, here are all the locations in the code where we branch 
based on CPU feature:
:~/impala/impala$ git grep CpuInfo::IsSupport
be/src/benchmarks/int-hash-benchmark.cc:  if 
(CpuInfo::IsSupported(CpuInfo::SSE4_2)) suite32.BENCH(uint32_t, CRC);
be/src/benchmarks/int-hash-benchmark.cc:  if 
(CpuInfo::IsSupported(CpuInfo::SSE4_2)) {
be/src/benchmarks/int-hash-benchmark.cc:  if 
(CpuInfo::IsSupported(CpuInfo::SSE4_1)) {
be/src/benchmarks/int-hash-benchmark.cc:  if 
(CpuInfo::IsSupported(CpuInfo::AVX2)) {
be/src/benchmarks/string-compare-benchmark.cc:  if 
(CpuInfo::IsSupported(CpuInfo::SSE4_2)) {
be/src/exec/delimited-text-parser.cc:  if 
(CpuInfo::IsSupported(CpuInfo::SSE4_2)) {
be/src/exec/delimited-text-parser.cc:  if 
(CpuInfo::IsSupported(CpuInfo::SSE4_2)) {
be/src/exec/delimited-text-parser.inline.h:  
DCHECK(CpuInfo::IsSupported(CpuInfo::SSE4_2));
be/src/exec/delimited-text-parser.inline.h:  if 
(LIKELY(CpuInfo::IsSupported(CpuInfo::SSE4_2))) {
be/src/runtime/io/disk-io-mgr.cc:  if (!CpuInfo::IsSupported(CpuInfo::SSE4_2)) {
be/src/util/bit-util-test.cc:  if (CpuInfo::IsSupported(CpuInfo::SSSE3)) {
be/src/util/bit-util-test.cc:  if (CpuInfo::IsSupported(CpuInfo::AVX2)) {
be/src/util/bit-util-test.cc:  if (CpuInfo::IsSupported(cpu_info_flag)) {
be/src/util/bit-util-test.cc:// CpuInfo::IsSupported() checks. This doesn't 
test the bug precisely but is a canary for
be/src/util/bit-util.cc:    if (CpuInfo::IsSupported(CpuInfo::AVX2)) {
be/src/util/bit-util.cc:    } else if 
(LIKELY(CpuInfo::IsSupported(CpuInfo::SSSE3))) {
be/src/util/bit-util.cc:    if (LIKELY(CpuInfo::IsSupported(CpuInfo::SSSE3))) {
be/src/util/bit-util.h:    if (LIKELY(CpuInfo::IsSupported(CpuInfo::POPCNT))) {
be/src/util/bloom-filter.cc:  if (CpuInfo::IsSupported(CpuInfo::AVX)) {
be/src/util/bloom-filter.h:  if (CpuInfo::IsSupported(CpuInfo::AVX2)) {
be/src/util/bloom-filter.h:  if (CpuInfo::IsSupported(CpuInfo::AVX2)) {
be/src/util/cpu-info.cc:  if (!CpuInfo::IsSupported(CpuInfo::SSSE3)) {
be/src/util/cpu-info.h:  ///   // line, CpuInfo::IsSupported(CpuInfo::AVX2) 
will return false.
be/src/util/cpu-info.h:      : feature_(feature), 
reenable_(CpuInfo::IsSupported(feature)) {
be/src/util/hash-util.h:    DCHECK(CpuInfo::IsSupported(CpuInfo::SSE4_2));
be/src/util/hash-util.h:    DCHECK(CpuInfo::IsSupported(CpuInfo::SSE4_2));
be/src/util/hash-util.h:    DCHECK(CpuInfo::IsSupported(CpuInfo::SSE4_2));
be/src/util/hash-util.h:    DCHECK(CpuInfo::IsSupported(CpuInfo::SSE4_2));
be/src/util/hash-util.h:    DCHECK(CpuInfo::IsSupported(CpuInfo::SSE4_2));
be/src/util/hash-util.h:    DCHECK(CpuInfo::IsSupported(CpuInfo::SSE4_2));
be/src/util/hash-util.h:    DCHECK(CpuInfo::IsSupported(CpuInfo::SSE4_2));
be/src/util/hash-util.h:    if (LIKELY(CpuInfo::IsSupported(CpuInfo::SSE4_2))) {
be/src/util/openssl-util.cc:      return 
(CpuInfo::IsSupported(CpuInfo::PCLMULQDQ)
{noformat}

We also ship two versions of the codegen module, one of which (nosse42) is 
essentially never used.

I think it would be uncontroversial to bump the minimum requirement to SSE4.2, 
which would allow us to delete some old fallbacks. I think the last time Intel 
or AMD shipped a processor without this was 2010 or 2011. Jumping to AVX is 
probably almost as uncontroversial, since it looks like that has been universal 
for nearly as long: 
https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#CPUs_with_AVX.

Some older lower-performance cloud instance types don't support AVX, it looks 
like, but I think this is an edge case. 

It would be very nice to require AVX2 because that could remove a bunch of 
conditional code (I think the contributors adding ARM support might want to 
keep the scalar fallback code though, potentially). It looks like most Intel 
and AMD processors have supported it since 2013 and 2015 respectively, except 
some low-end Intel processors: 
https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#CPUs_with_AVX2.

In the past we've been a bit conservative about this - people do sometimes use 
very old hardware as a test cluster because it was the hardware that they could 
get their hands on (e.g. I remember someone complaining several years back that 
they couldn't get Impala running on some old AMD CPUs that were missing SSSE3 
support).



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to