Commit message (Collapse) | Author | Age | ||
---|---|---|---|---|
... | ||||
* | Add missing packet ops for bool, and make it pass the same packet op unit ↵ | Rasmus Munk Larsen | 2020-05-14 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | tests as other arithmetic types. This change also contains a few minor cleanups: 1. Remove packet op pnot, which is not needed for anything other than pcmp_le_or_nan, which can be done in other ways. 2. Remove the "HasInsert" enum, which is no longer needed since we removed the corresponding packet ops. 3. Add faster pselect op for Packet4i when SSE4.1 is supported. Among other things, this makes the fast transposeInPlace() method available for Matrix<bool>. Run on ************** (72 X 2994 MHz CPUs); 2020-05-09T10:51:02.372347913-07:00 CPU: Intel Skylake Xeon with HyperThreading (36 cores) dL1:32KB dL2:1024KB dL3:24MB Benchmark Time(ns) CPU(ns) Iterations ----------------------------------------------------------------------- BM_TransposeInPlace<float>/4 9.77 9.77 71670320 BM_TransposeInPlace<float>/8 21.9 21.9 31929525 BM_TransposeInPlace<float>/16 66.6 66.6 10000000 BM_TransposeInPlace<float>/32 243 243 2879561 BM_TransposeInPlace<float>/59 844 844 829767 BM_TransposeInPlace<float>/64 933 933 750567 BM_TransposeInPlace<float>/128 3944 3945 177405 BM_TransposeInPlace<float>/256 16853 16853 41457 BM_TransposeInPlace<float>/512 204952 204968 3448 BM_TransposeInPlace<float>/1k 1053889 1053861 664 BM_TransposeInPlace<bool>/4 14.4 14.4 48637301 BM_TransposeInPlace<bool>/8 36.0 36.0 19370222 BM_TransposeInPlace<bool>/16 31.5 31.5 22178902 BM_TransposeInPlace<bool>/32 111 111 6272048 BM_TransposeInPlace<bool>/59 626 626 1000000 BM_TransposeInPlace<bool>/64 428 428 1632689 BM_TransposeInPlace<bool>/128 1677 1677 417377 BM_TransposeInPlace<bool>/256 7126 7126 96264 BM_TransposeInPlace<bool>/512 29021 29024 24165 BM_TransposeInPlace<bool>/1k 116321 116330 6068 | |||
* | Remove packet ops pinsertfirst and pinsertlast that are only used in a ↵ | Rasmus Munk Larsen | 2020-05-08 | |
| | | | | | | | | | | | | | | | | single place, and can be replaced by other ops when constructing the first/final packet in linspaced_op_impl::packetOp. I cannot measure any performance changes for SSE, AVX, or AVX512. name old time/op new time/op delta BM_LinSpace<float>/1 1.63ns ± 0% 1.63ns ± 0% ~ (p=0.762 n=5+5) BM_LinSpace<float>/8 4.92ns ± 3% 4.89ns ± 3% ~ (p=0.421 n=5+5) BM_LinSpace<float>/64 34.6ns ± 0% 34.6ns ± 0% ~ (p=0.841 n=5+5) BM_LinSpace<float>/512 217ns ± 0% 217ns ± 0% ~ (p=0.421 n=5+5) BM_LinSpace<float>/4k 1.68µs ± 0% 1.68µs ± 0% ~ (p=1.000 n=5+5) BM_LinSpace<float>/32k 13.3µs ± 0% 13.3µs ± 0% ~ (p=0.905 n=5+4) BM_LinSpace<float>/256k 107µs ± 0% 107µs ± 0% ~ (p=0.841 n=5+5) BM_LinSpace<float>/1M 427µs ± 0% 427µs ± 0% ~ (p=0.690 n=5+5) | |||
* | Remove unused packet op "palign". | Rasmus Munk Larsen | 2020-05-07 | |
| | | | | Clean up a compiler warning in c++03 mode in AVX512/Complex.h. | |||
* | Remove unused packet op "preduxp". | Rasmus Munk Larsen | 2020-04-23 | |
| | ||||
* | Move eigen_packet_wrapper to GenericPacketMath.h and use it for ↵ | Rasmus Munk Larsen | 2020-04-15 | |
| | | | | | | | SSE/AVX/AVX512 as it is already used for NEON. This will allow us to define multiple packet types backed by the same vector type, e.g., __m128i. Use this machanism to define packets for half and clean up the packet op implementations. | |||
* | NEON: Fixed MSVC types definitions | Joel Holdsworth | 2020-03-26 | |
| | ||||
* | Additional NEON packet-math operations | Joel Holdsworth | 2020-03-26 | |
| | ||||
* | Add absolute_difference coefficient-wise binary Array function | Joel Holdsworth | 2020-03-19 | |
| | ||||
* | Add shift_left<N> and shift_right<N> coefficient-wise unary Array functions | Joel Holdsworth | 2020-03-19 | |
| | ||||
* | Implement integer square-root for NEON | Joel Holdsworth | 2020-03-19 | |
| | ||||
* | NEON: Added int64_t and uint64_t packet math | Joel Holdsworth | 2020-03-10 | |
| | ||||
* | NEON: Added int8_t and uint8_t packet math | Joel Holdsworth | 2020-03-10 | |
| | ||||
* | NEON: Added int16_t and uint16_t packet math | Joel Holdsworth | 2020-03-10 | |
| | ||||
* | NEON: Added uint32_t packet math | Joel Holdsworth | 2020-03-10 | |
| | ||||
* | NEON: Implemented half-size vectors | Joel Holdsworth | 2020-03-10 | |
| | ||||
* | NEON: Set packet_traits<double> flags | Joel Holdsworth | 2020-03-10 | |
| | ||||
* | Improvements to the tidiness and completeness of the NEON implementation | Joel Holdsworth | 2020-01-10 | |
| | ||||
* | Improve accuracy of fast approximate tanh and the logistic functions in ↵ | Rasmus Munk Larsen | 2019-12-16 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Eigen, such that they preserve relative accuracy to within a few ULPs where their function values tend to zero (around x=0 for tanh, and for large negative x for the logistic function). This change re-instates the fast rational approximation of the logistic function for float32 in Eigen (removed in https://gitlab.com/libeigen/eigen/commit/66f07efeaed39d6a67005343d7e0caf7d9eeacdb), but uses the more accurate approximation 1/(1+exp(-1)) ~= exp(x) below -9. The exponential is only calculated on the vectorized path if at least one element in the SIMD input vector is less than -9. This change also contains a few improvements to speed up the original float specialization of logistic: - Introduce EIGEN_PREDICT_{FALSE,TRUE} for __builtin_predict and use it to predict that the logistic-only path is most likely (~2-3% speedup for the common case). - Carefully set the upper clipping point to the smallest x where the approximation evaluates to exactly 1. This saves the explicit clamping of the output (~7% speedup). The increased accuracy for tanh comes at a cost of 10-20% depending on instruction set. The benchmarks below repeated calls u = v.logistic() (u = v.tanh(), respectively) where u and v are of type Eigen::ArrayXf, have length 8k, and v contains random numbers in [-1,1]. Benchmark numbers for logistic: Before: Benchmark Time(ns) CPU(ns) Iterations ----------------------------------------------------------------- SSE BM_eigen_logistic_float 4467 4468 155835 model_time: 4827 AVX BM_eigen_logistic_float 2347 2347 299135 model_time: 2926 AVX+FMA BM_eigen_logistic_float 1467 1467 476143 model_time: 2926 AVX512 BM_eigen_logistic_float 805 805 858696 model_time: 1463 After: Benchmark Time(ns) CPU(ns) Iterations ----------------------------------------------------------------- SSE BM_eigen_logistic_float 2589 2590 270264 model_time: 4827 AVX BM_eigen_logistic_float 1428 1428 489265 model_time: 2926 AVX+FMA BM_eigen_logistic_float 1059 1059 662255 model_time: 2926 AVX512 BM_eigen_logistic_float 673 673 1000000 model_time: 1463 Benchmark numbers for tanh: Before: Benchmark Time(ns) CPU(ns) Iterations ----------------------------------------------------------------- SSE BM_eigen_tanh_float 2391 2391 292624 model_time: 4242 AVX BM_eigen_tanh_float 1256 1256 554662 model_time: 2633 AVX+FMA BM_eigen_tanh_float 823 823 866267 model_time: 1609 AVX512 BM_eigen_tanh_float 443 443 1578999 model_time: 805 After: Benchmark Time(ns) CPU(ns) Iterations ----------------------------------------------------------------- SSE BM_eigen_tanh_float 2588 2588 273531 model_time: 4242 AVX BM_eigen_tanh_float 1536 1536 452321 model_time: 2633 AVX+FMA BM_eigen_tanh_float 1007 1007 694681 model_time: 1609 AVX512 BM_eigen_tanh_float 471 471 1472178 model_time: 805 | |||
* | Add generic PacketMath implementation of the Error Function (erf). | Rasmus Munk Larsen | 2019-09-19 | |
| | ||||
* | Add masked_store_available to unpacket_traits | Eugene Zhulenev | 2019-05-02 | |
| | ||||
* | Adding lowlevel APIs for optimized RHS packet load in TensorFlow | Anuj Rawat | 2019-04-20 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | SpatialConvolution Low-level APIs are added in order to optimized packet load in gemm_pack_rhs in TensorFlow SpatialConvolution. The optimization is for scenario when a packet is split across 2 adjacent columns. In this case we read it as two 'partial' packets and then merge these into 1. Currently this only works for Packet16f (AVX512) and Packet8f (AVX2). We plan to add this for other packet types (such as Packet8d) also. This optimization shows significant speedup in SpatialConvolution with certain parameters. Some examples are below. Benchmark parameters are specified as: Batch size, Input dim, Depth, Num of filters, Filter dim Speedup numbers are specified for number of threads 1, 2, 4, 8, 16. AVX512: Parameters | Speedup (Num of threads: 1, 2, 4, 8, 16) ----------------------------|------------------------------------------ 128, 24x24, 3, 64, 5x5 |2.18X, 2.13X, 1.73X, 1.64X, 1.66X 128, 24x24, 1, 64, 8x8 |2.00X, 1.98X, 1.93X, 1.91X, 1.91X 32, 24x24, 3, 64, 5x5 |2.26X, 2.14X, 2.17X, 2.22X, 2.33X 128, 24x24, 3, 64, 3x3 |1.51X, 1.45X, 1.45X, 1.67X, 1.57X 32, 14x14, 24, 64, 5x5 |1.21X, 1.19X, 1.16X, 1.70X, 1.17X 128, 128x128, 3, 96, 11x11 |2.17X, 2.18X, 2.19X, 2.20X, 2.18X AVX2: Parameters | Speedup (Num of threads: 1, 2, 4, 8, 16) ----------------------------|------------------------------------------ 128, 24x24, 3, 64, 5x5 | 1.66X, 1.65X, 1.61X, 1.56X, 1.49X 32, 24x24, 3, 64, 5x5 | 1.71X, 1.63X, 1.77X, 1.58X, 1.68X 128, 24x24, 1, 64, 5x5 | 1.44X, 1.40X, 1.38X, 1.37X, 1.33X 128, 24x24, 3, 64, 3x3 | 1.68X, 1.63X, 1.58X, 1.56X, 1.62X 128, 128x128, 3, 96, 11x11 | 1.36X, 1.36X, 1.37X, 1.37X, 1.37X In the higher level benchmark cifar10, we observe a runtime improvement of around 6% for AVX512 on Intel Skylake server (8 cores). On lower level PackRhs micro-benchmarks specified in TensorFlow tensorflow/core/kernels/eigen_spatial_convolutions_test.cc, we observe the following runtime numbers: AVX512: Parameters | Runtime without patch (ns) | Runtime with patch (ns) | Speedup ---------------------------------------------------------------|----------------------------|-------------------------|--------- BM_RHS_NAME(PackRhs, 128, 24, 24, 3, 64, 5, 5, 1, 1, 256, 56) | 41350 | 15073 | 2.74X BM_RHS_NAME(PackRhs, 32, 64, 64, 32, 64, 5, 5, 1, 1, 256, 56) | 7277 | 7341 | 0.99X BM_RHS_NAME(PackRhs, 32, 64, 64, 32, 64, 5, 5, 2, 2, 256, 56) | 8675 | 8681 | 1.00X BM_RHS_NAME(PackRhs, 32, 64, 64, 30, 64, 5, 5, 1, 1, 256, 56) | 24155 | 16079 | 1.50X BM_RHS_NAME(PackRhs, 32, 64, 64, 30, 64, 5, 5, 2, 2, 256, 56) | 25052 | 17152 | 1.46X BM_RHS_NAME(PackRhs, 32, 256, 256, 4, 16, 8, 8, 1, 1, 256, 56) | 18269 | 18345 | 1.00X BM_RHS_NAME(PackRhs, 32, 256, 256, 4, 16, 8, 8, 2, 4, 256, 56) | 19468 | 19872 | 0.98X BM_RHS_NAME(PackRhs, 32, 64, 64, 4, 16, 3, 3, 1, 1, 36, 432) | 156060 | 42432 | 3.68X BM_RHS_NAME(PackRhs, 32, 64, 64, 4, 16, 3, 3, 2, 2, 36, 432) | 132701 | 36944 | 3.59X AVX2: Parameters | Runtime without patch (ns) | Runtime with patch (ns) | Speedup ---------------------------------------------------------------|----------------------------|-------------------------|--------- BM_RHS_NAME(PackRhs, 128, 24, 24, 3, 64, 5, 5, 1, 1, 256, 56) | 26233 | 12393 | 2.12X BM_RHS_NAME(PackRhs, 32, 64, 64, 32, 64, 5, 5, 1, 1, 256, 56) | 6091 | 6062 | 1.00X BM_RHS_NAME(PackRhs, 32, 64, 64, 32, 64, 5, 5, 2, 2, 256, 56) | 7427 | 7408 | 1.00X BM_RHS_NAME(PackRhs, 32, 64, 64, 30, 64, 5, 5, 1, 1, 256, 56) | 23453 | 20826 | 1.13X BM_RHS_NAME(PackRhs, 32, 64, 64, 30, 64, 5, 5, 2, 2, 256, 56) | 23167 | 22091 | 1.09X BM_RHS_NAME(PackRhs, 32, 256, 256, 4, 16, 8, 8, 1, 1, 256, 56) | 23422 | 23682 | 0.99X BM_RHS_NAME(PackRhs, 32, 256, 256, 4, 16, 8, 8, 2, 4, 256, 56) | 23165 | 23663 | 0.98X BM_RHS_NAME(PackRhs, 32, 64, 64, 4, 16, 3, 3, 1, 1, 36, 432) | 72689 | 44969 | 1.62X BM_RHS_NAME(PackRhs, 32, 64, 64, 4, 16, 3, 3, 2, 2, 36, 432) | 61732 | 39779 | 1.55X All benchmarks on Intel Skylake server with 8 cores. | |||
* | Fix conflicts and merge | Gael Guennebaud | 2019-01-30 | |
|\ | ||||
* | | Add missing logical packet ops for GPU and NEON. | Rasmus Munk Larsen | 2019-01-17 | |
| | | ||||
* | | bug #1652: fix position of EIGEN_ALIGN16 attributes in Neon and Altivec | Gael Guennebaud | 2019-01-14 | |
| | | ||||
* | | Add dedicated implementations of predux_any for AVX512, NEON, and Altivec/VSE | Gael Guennebaud | 2019-01-09 | |
| | | ||||
| * | Introducing "vectorized" byte on unpacket_traits structs | Gustavo Lima Chaves | 2018-12-19 | |
|/ | | | | | | | | | | | | | | | | | | | | | This is a preparation to a change on gebp_traits, where a new template argument will be introduced to dictate the packet size, so it won't be bound to the current/max packet size only anymore. By having packet types defined early on gebp_traits, one has now to act on packet types, not scalars anymore, for the enum values defined on that class. One approach for reaching the vectorizable/size properties one needs there could be getting the packet's scalar again with unpacket_traits<>, then the size/Vectorizable enum entries from packet_traits<>. It turns out guards like "#ifndef EIGEN_VECTORIZE_AVX512" at AVX/PacketMath.h will hide smaller packet variations of packet_traits<> for some types (and it makes sense to keep that). In other words, one can't go back to the scalar and create a new PacketType, as this will always lead to the maximum packet type for the architecture. The less costly/invasive solution for that, thus, is to add the vectorizable info on every unpacket_traits struct as well. | |||
* | Add packet sin and cos to Altivec/VSX and NEON | Gael Guennebaud | 2018-11-30 | |
| | ||||
* | bug #1631: fix compilation with ARM NEON and clang, and cleanup the weird ↵ | Gael Guennebaud | 2018-11-27 | |
| | | | | pshiftright_and_cast and pcast_and_shiftleft functions. | |||
* | Unify NEON's pexp with generic implementation | Gael Guennebaud | 2018-11-26 | |
| | ||||
* | Unify NEON's plog with generic implementation | Gael Guennebaud | 2018-11-26 | |
| | ||||
* | bug #1428: atempt to make NEON vectorization compilable by MSVC. | Gael Guennebaud | 2018-04-24 | |
| | | | | The workaround is to wrap NEON packet types to make them different c++ types. | |||
* | Merged in guillaume_michel/eigen (pull request PR-334) | Christoph Hertzberg | 2017-10-23 | |
| | | | | - Add support for NEON plog PacketMath function | |||
* | Fix compilation with gcc 4.3 and ARM NEON | Gael Guennebaud | 2017-06-09 | |
| | ||||
* | ARM prefetch fixes: Implement prefetch on ARM64. Do not clobber cc on ARM32. | Benoit Jacob | 2017-03-15 | |
| | ||||
* | Use int32_t instead of int in NEON code. Some platforms with 16 bytes int ↵ | Gael Guennebaud | 2017-02-17 | |
| | | | | supports ARM NEON. | |||
* | Use 32 registers on ARM64 | Benoit Jacob | 2016-12-19 | |
| | ||||
* | Merged kmargar/eigen/tip into default, Altivec/VSX port should be working ok ↵ | Konstantinos Margaritis | 2016-07-10 | |
|\ | | | | | | | now. | |||
* | | bug #1240: Remove any assumption on NEON vector types. | Gael Guennebaud | 2016-06-09 | |
| | | ||||
* | | Fix compile errors initializing packets on ARM DS-5 5.20 | Sean Templeton | 2016-06-03 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The ARM DS-5 5.20 compiler fails compiling with the following errors: "src/Core/arch/NEON/PacketMath.h", line 113: Error: #146: too many initializer values Packet4f countdown = EIGEN_INIT_NEON_PACKET4(0, 1, 2, 3); ^ "src/Core/arch/NEON/PacketMath.h", line 118: Error: #146: too many initializer values Packet4i countdown = EIGEN_INIT_NEON_PACKET4(0, 1, 2, 3); ^ "src/Core/arch/NEON/Complex.h", line 30: Error: #146: too many initializer values static uint32x4_t p4ui_CONJ_XOR = EIGEN_INIT_NEON_PACKET4(0x00000000, 0x80000000, 0x00000000, 0x80000000); ^ "src/Core/arch/NEON/Complex.h", line 31: Error: #146: too many initializer values static uint32x2_t p2ui_CONJ_XOR = EIGEN_INIT_NEON_PACKET2(0x00000000, 0x80000000); ^ The vectors are implemented as two doubles, hence the too many initializer values error. Changed the code to use intrinsic load functions which all compilers implementing NEON should have. | |||
* | | Remove now-unused protate PacketMath func | Benoit Jacob | 2016-05-24 | |
| | | ||||
| * | add name to copyrights | Konstantinos Margaritis | 2016-04-28 | |
|/ | ||||
* | Add references to filed LLVM bugs | Benoit Jacob | 2016-04-08 | |
| | ||||
* | bug #1190 - Don't trust __ARM_FEATURE_FMA on Clang/ARM | Benoit Jacob | 2016-04-04 | |
| | ||||
* | bug #1191 - Prevent Clang/ARM from rewriting VMLA into VMUL+VADD | Benoit Jacob | 2016-04-04 | |
| | ||||
* | bug #1186 - vreinterpretq_u64_f64 fails to build on Android/Aarch64/Clang ↵ | Benoit Jacob | 2016-03-30 | |
| | | | | toolchain | |||
* | Fix prototype of plset and generalize linspace functor. | Gael Guennebaud | 2015-08-07 | |
| | ||||
* | Let unpacket_traits<> exposes the required alignment and make use of it ↵ | Gael Guennebaud | 2015-08-07 | |
| | | | | everywhere | |||
* | also uninitialized here, see previous cset | Benoit Jacob | 2015-05-15 | |
| | ||||
* | Fix uninitialized var warning. The compiler was clearing the register ↵ | Benoit Jacob | 2015-05-15 | |
| | | | | anyway, so this does not change resulting code | |||
* | Work around an ICE in Clang 3.5 in the iOS toolchain with double NEON ↵ | Benoit Jacob | 2015-03-03 | |
| | | | | intrinsics. |