Compile-time errors on s390x architecture (Z14)

Submitted by Geert Janssen

Assigned to Nobody

Link to original bugzilla bug (#1743)
Version: 3.4 (development)
Operating system: Linux

Description

Compiling Eigen 3.3.90 as part of TensorFlow Lite on an IBM Z machine gives errors when Z SIMD vectorization is enabled.

g++ flags see below.

I have a fix for this. I made the following changes:

In eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:

470 │

471 │ template<> EIGEN_STRONG_INLINE Packet2d pround<Packet2d>(const Packet2d& a) { \

   return /*vec_round(a);*/ __builtin_s390_vfidb(a, 4, 4); } //GJ19                 

472 │ template<> EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const Packet2d& a) { \

   return /*vec_ceil(a);*/ __builtin_s390_vfidb(a, 4, 6); } //GJ19                  

473 │ template<> EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a) { \

   return /*vec_floor(a);*/ __builtin_s390_vfidb(a, 4, 7); } //GJ19                 

474 │

1073 │ template<> EIGEN_STRONG_INLINE Packet4f pmadd<Packet4f> (const Packet4f& a, c\

   onst Packet4f& b, const Packet4f& c) { return /*vec_madd(a, b, c);*/ __builtin\  

   _s390_vfmasb(a, b, c); } //GJ19   

1083 │ template<> EIGEN_STRONG_INLINE Packet4f pround<Packet4f> (const Packet4f& a) {\

    return /*vec_round(a);*/ __builtin_s390_vfisb(a, 4, 4); } //GJ19                

1084 │ template<> EIGEN_STRONG_INLINE Packet4f pceil<Packet4f> (const Packet4f& a) {\

    return /*vec_ceil(a);*/ __builtin_s390_vfisb(a, 4, 6); } //GJ19                 

1085 │ template<> EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f> (const Packet4f& a) {\

    return /*vec_floor(a);*/ __builtin_s390_vfisb(a, 4, 7); } //GJ19  

In eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h:

100 │

101 │ fx = /vec_floor(fx);/ __builtin_s390_vfidb(fx, 4, 7); //GJ19

102 │

Here are the error messages:

Mon Aug 26 09:58:13 EDT 2019

geert@8e08LP30:~/src/tensorflow-lite$ uname -a

Linux 8e08LP30 4.15.0-45-generic #48 (closed)-Ubuntu SMP Tue Jan 29 16:26:33 UTC 2019 s390x s390x s390x GNU/Linux

geert@8e08LP30:~/src/tensorflow-lite$ gcc --version

gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0

Copyright (C) 2017 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Eigen version:

eigen/Eigen/src/Core/util/Macros.h

#define EIGEN_WORLD_VERSION 3

#define EIGEN_MAJOR_VERSION 3

#define EIGEN_MINOR_VERSION 90

g++ -O3 -DNDEBUG -fPIC -mvx -march=z14 -mzvector -Wno-attributes --std=c++11 -fPIC -DGEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK -pthread -I. -I/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/../../../../../ -I/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/../../../../../../ -I/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/ -I/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen -I/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/absl -I/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/gemmlowp -I/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/neon_2_sse -I/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/farmhash/src -I/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/flatbuffers/include -I -I/usr/local/include -c tensorflow/lite/kernels/activations.cc -o /home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/gen/linux_s390x/obj/tensorflow/lite/kernels/activations.o

In file included from /home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/util/ConfigureVectorization.h:355:0,

             from /home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/Core:22,  

             from ./third_party/eigen3/Eigen/Core:1,  

             from ./tensorflow/lite/kernels/internal/optimized/optimized_ops.h:33,  

             from tensorflow/lite/kernels/activations.cc:25:  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h: In function ‘Packet Eigen::internal::pround(const Packet&) [with Packet = __vector(2) double]’:

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:471:86: error: ‘__builtin_s390_vfi’ was not declared in this scope

RONG_INLINE Packet2d pround<Packet2d>(const Packet2d& a) { return vec_round(a); }

                                                               ^  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:471:86: note: suggested alternative: ‘__builtin_s390_vfidb’

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h: In function ‘Packet Eigen::internal::pceil(const Packet&) [with Packet = __vector(2) double]’:

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:472:86: error: ‘__builtin_s390_vfi’ was not declared in this scope

RONG_INLINE Packet2d pceil<Packet2d>(const Packet2d& a) { return vec_ceil(a); }

                                                               ^  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:472:86: note: suggested alternative: ‘__builtin_s390_vfidb’

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h: In function ‘Packet Eigen::internal::pfloor(const Packet&) [with Packet = __vector(2) double]’:

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:473:86: error: ‘__builtin_s390_vfi’ was not declared in this scope

RONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a) { return vec_floor(a); }

                                                               ^  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:473:86: note: suggested alternative: ‘__builtin_s390_vfidb’

In file included from /home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/Core:191:0,

             from ./third_party/eigen3/Eigen/Core:1,  

             from ./tensorflow/lite/kernels/internal/optimized/optimized_ops.h:33,  

             from tensorflow/lite/kernels/activations.cc:25:  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h: In function ‘Packet Eigen::internal::pmadd(const Packet&, const Packet&, const Packet&) [with Packet = __vector(4) float]’:

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:1073:141: error: cannot convert ‘const Packet4f {aka const __vector(4) float}’ to ‘__vector(2) double’ for argument ‘1’ to ‘__vector(2) double __builtin_s390_vfmadb(__vector(2) double, __vector(2) double, __vector(2) double)’

ket4f& a, const Packet4f& b, const Packet4f& c) { return vec_madd(a, b, c); }

                                                                      ^  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h: In function ‘Packet Eigen::internal::pxor(const Packet&, const Packet&) [with Packet = __vector(4) float]’:

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:1078:118: error: invalid parameter combination for intrinsic ‘__builtin_s390_vec_xor’

<Packet4f> (const Packet4f& a, const Packet4f& b) { return vec_xor(a, b); }

                                                                      ^  

In file included from /home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/util/ConfigureVectorization.h:355:0,

             from /home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/Core:22,  

             from ./third_party/eigen3/Eigen/Core:1,  

             from ./tensorflow/lite/kernels/internal/optimized/optimized_ops.h:33,  

             from tensorflow/lite/kernels/activations.cc:25:  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h: In function ‘Packet Eigen::internal::pround(const Packet&) [with Packet = __vector(4) float]’:

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:1080:87: error: ‘__builtin_s390_vfi’ was not declared in this scope

ONG_INLINE Packet4f pround<Packet4f> (const Packet4f& a) { return vec_round(a); }

                                                               ^  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:1080:87: note: suggested alternative: ‘__builtin_s390_vfidb’

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h: In function ‘Packet Eigen::internal::pceil(const Packet&) [with Packet = __vector(4) float]’:

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:1081:87: error: ‘__builtin_s390_vfi’ was not declared in this scope

ONG_INLINE Packet4f pceil<Packet4f> (const Packet4f& a) { return vec_ceil(a); }

                                                               ^  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:1081:87: note: suggested alternative: ‘__builtin_s390_vfidb’

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h: In function ‘Packet Eigen::internal::pfloor(const Packet&) [with Packet = __vector(4) float]’:

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:1082:87: error: ‘__builtin_s390_vfi’ was not declared in this scope

ONG_INLINE Packet4f pfloor<Packet4f> (const Packet4f& a) { return vec_floor(a); }

                                                               ^  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h:1082:87: note: suggested alternative: ‘__builtin_s390_vfidb’

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h: In function ‘Packet Eigen::internal::pexp(const Packet&) [with Packet = __vector(2) double]’:

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h:101:8: error: ‘__builtin_s390_vfi’ was not declared in this scope

fx = vec_floor(fx);

    ^  

/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/downloads/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h:101:8: note: suggested alternative: ‘__builtin_s390_vfidb’

tensorflow/lite/tools/make/Makefile:208: recipe for target '/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/gen/linux_s390x/obj/tensorflow/lite/kernels/activations.o' failed

make: *** [/home3/geert/src/tensorflow-lite/tensorflow/lite/tools/make/gen/linux_s390x/obj/tensorflow/lite/kernels/activations.o] Error 1

geert@8e08LP30:~/src/tensorflow-lite$