mirror of
https://gitlab.com/libeigen/eigen.git
synced 2024-12-27 07:29:52 +08:00
8c7a6feb8e
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. |
||
---|---|---|
.. | ||
adjoint.cpp | ||
AnnoyingScalar.h | ||
array_cwise.cpp | ||
array_for_matrix.cpp | ||
array_of_string.cpp | ||
array_replicate.cpp | ||
array_reverse.cpp | ||
bandmatrix.cpp | ||
basicstuff.cpp | ||
bdcsvd.cpp | ||
bicgstab.cpp | ||
block.cpp | ||
boostmultiprec.cpp | ||
bug1213_main.cpp | ||
bug1213.cpp | ||
bug1213.h | ||
cholesky.cpp | ||
cholmod_support.cpp | ||
CMakeLists.txt | ||
commainitializer.cpp | ||
conjugate_gradient.cpp | ||
conservative_resize.cpp | ||
constructor.cpp | ||
corners.cpp | ||
ctorleak.cpp | ||
dense_storage.cpp | ||
denseLM.cpp | ||
determinant.cpp | ||
diagonal_matrix_variadic_ctor.cpp | ||
diagonal.cpp | ||
diagonalmatrices.cpp | ||
dontalign.cpp | ||
dynalloc.cpp | ||
eigen2support.cpp | ||
eigensolver_complex.cpp | ||
eigensolver_generalized_real.cpp | ||
eigensolver_generic.cpp | ||
eigensolver_selfadjoint.cpp | ||
evaluator_common.h | ||
evaluators.cpp | ||
exceptions.cpp | ||
fastmath.cpp | ||
first_aligned.cpp | ||
geo_alignedbox.cpp | ||
geo_eulerangles.cpp | ||
geo_homogeneous.cpp | ||
geo_hyperplane.cpp | ||
geo_orthomethods.cpp | ||
geo_parametrizedline.cpp | ||
geo_quaternion.cpp | ||
geo_transformations.cpp | ||
gpu_basic.cu | ||
gpu_common.h | ||
half_float.cpp | ||
hessenberg.cpp | ||
householder.cpp | ||
incomplete_cholesky.cpp | ||
indexed_view.cpp | ||
initializer_list_construction.cpp | ||
inplace_decomposition.cpp | ||
integer_types.cpp | ||
inverse.cpp | ||
is_same_dense.cpp | ||
jacobi.cpp | ||
jacobisvd.cpp | ||
klu_support.cpp | ||
linearstructure.cpp | ||
lscg.cpp | ||
lu.cpp | ||
main.h | ||
mapped_matrix.cpp | ||
mapstaticmethods.cpp | ||
mapstride.cpp | ||
meta.cpp | ||
metis_support.cpp | ||
miscmatrices.cpp | ||
mixingtypes.cpp | ||
mpl2only.cpp | ||
nestbyvalue.cpp | ||
nesting_ops.cpp | ||
nomalloc.cpp | ||
nullary.cpp | ||
num_dimensions.cpp | ||
numext.cpp | ||
packetmath.cpp | ||
pardiso_support.cpp | ||
pastix_support.cpp | ||
permutationmatrices.cpp | ||
prec_inverse_4x4.cpp | ||
product_extra.cpp | ||
product_large.cpp | ||
product_mmtr.cpp | ||
product_notemporary.cpp | ||
product_selfadjoint.cpp | ||
product_small.cpp | ||
product_symm.cpp | ||
product_syrk.cpp | ||
product_trmm.cpp | ||
product_trmv.cpp | ||
product_trsolve.cpp | ||
product.h | ||
qr_colpivoting.cpp | ||
qr_fullpivoting.cpp | ||
qr.cpp | ||
qtvector.cpp | ||
rand.cpp | ||
real_qz.cpp | ||
redux.cpp | ||
ref.cpp | ||
reshape.cpp | ||
resize.cpp | ||
rvalue_types.cpp | ||
schur_complex.cpp | ||
schur_real.cpp | ||
selfadjoint.cpp | ||
simplicial_cholesky.cpp | ||
sizeof.cpp | ||
sizeoverflow.cpp | ||
smallvectors.cpp | ||
solverbase.h | ||
sparse_basic.cpp | ||
sparse_block.cpp | ||
sparse_permutations.cpp | ||
sparse_product.cpp | ||
sparse_ref.cpp | ||
sparse_solver.h | ||
sparse_solvers.cpp | ||
sparse_vector.cpp | ||
sparse.h | ||
sparseLM.cpp | ||
sparselu.cpp | ||
sparseqr.cpp | ||
special_numbers.cpp | ||
split_test_helper.h | ||
spqr_support.cpp | ||
stable_norm.cpp | ||
stddeque_overload.cpp | ||
stddeque.cpp | ||
stdlist_overload.cpp | ||
stdlist.cpp | ||
stdvector_overload.cpp | ||
stdvector.cpp | ||
stl_iterators.cpp | ||
superlu_support.cpp | ||
svd_common.h | ||
svd_fill.h | ||
swap.cpp | ||
symbolic_index.cpp | ||
triangular.cpp | ||
type_alias.cpp | ||
umeyama.cpp | ||
umfpack_support.cpp | ||
unalignedassert.cpp | ||
unalignedcount.cpp | ||
upperbidiagonalization.cpp | ||
vectorization_logic.cpp | ||
vectorwiseop.cpp | ||
visitor.cpp | ||
zerosized.cpp |