From 2f20e73402a07319511b934f39b814fdc69ad89e Mon Sep 17 00:00:00 2001 From: Peter Munch Date: Mon, 12 Dec 2022 08:10:35 +0100 Subject: [PATCH] TensorProductMatrixSymmetricSumCollection: fix vectorization --- include/deal.II/lac/tensor_product_matrix.h | 114 +++++++++--- tests/lac/tensor_product_matrix_08.cc | 170 +++++++++++++----- ..._product_matrix_08.with_lapack=true.output | 90 +++++++--- ...duct_matrix_08.with_lapack=true.output.axx | 129 +++++++++++++ ...t_matrix_08.with_lapack=true.output.axx512 | 161 +++++++++++++++++ ...duct_matrix_08.with_lapack=true.output.sse | 97 ++++++++++ 6 files changed, 659 insertions(+), 102 deletions(-) create mode 100644 tests/lac/tensor_product_matrix_08.with_lapack=true.output.axx create mode 100644 tests/lac/tensor_product_matrix_08.with_lapack=true.output.axx512 create mode 100644 tests/lac/tensor_product_matrix_08.with_lapack=true.output.sse diff --git a/include/deal.II/lac/tensor_product_matrix.h b/include/deal.II/lac/tensor_product_matrix.h index dcb542fffb..20550c3f00 100644 --- a/include/deal.II/lac/tensor_product_matrix.h +++ b/include/deal.II/lac/tensor_product_matrix.h @@ -281,12 +281,15 @@ namespace internal template struct MatrixPairComparator { - using MatrixPairType = std::pair, Table<2, Number>>; using VectorizedArrayTrait = dealii::internal::VectorizedArrayTrait; using ScalarNumber = typename VectorizedArrayTrait::value_type; static constexpr std::size_t width = VectorizedArrayTrait::width(); + using MatrixPairType = + std::pair, + std::pair, Table<2, Number>>>; + MatrixPairComparator() : eps(std::sqrt(std::numeric_limits::epsilon())) {} @@ -294,29 +297,15 @@ namespace internal bool operator()(const MatrixPairType &left, const MatrixPairType &right) const { - const auto &M_0 = left.first; - const auto &K_0 = left.second; - const auto &M_1 = right.first; - const auto &K_1 = right.second; + const auto &M_0 = left.second.first; + const auto &K_0 = left.second.second; + const auto &M_1 = right.second.first; + const auto &K_1 = right.second.second; std::bitset mask; for (unsigned int v = 0; v < width; ++v) - { - ScalarNumber a = 0.0; - ScalarNumber b = 0.0; - - for (unsigned int i = 0; i < M_0.size(0); ++i) - for (unsigned int j = 0; j < M_0.size(1); ++j) - { - a += std::abs(VectorizedArrayTrait::get(M_0[i][j], v)); - a += std::abs(VectorizedArrayTrait::get(K_0[i][j], v)); - b += std::abs(VectorizedArrayTrait::get(M_1[i][j], v)); - b += std::abs(VectorizedArrayTrait::get(K_1[i][j], v)); - } - - mask[v] = (a != 0.0) && (b != 0.0); - } + mask[v] = left.first[v] && right.first[v]; const FloatingPointComparator comparator( eps, false /*use relative tolerance*/, mask); @@ -367,6 +356,10 @@ class TensorProductMatrixSymmetricSumCollection { using MatrixPairType = std::pair, Table<2, Number>>; + using MatrixPairTypeWithMask = std::pair< + std::bitset::width()>, + MatrixPairType>; + public: /** * Struct to configure TensorProductMatrixSymmetricSumCollection. @@ -467,7 +460,7 @@ private: * matrices. The memory is freed during finalize(). */ std::map< - MatrixPairType, + MatrixPairTypeWithMask, unsigned int, internal::TensorProductMatrixSymmetricSum::MatrixPairComparator> cache; @@ -1157,18 +1150,85 @@ TensorProductMatrixSymmetricSumCollection::insert( for (unsigned int d = 0; d < dim; ++d) { - const MatrixPairType matrix(Ms[d], Ks[d]); - if (compress_matrices == false) { + const MatrixPairType matrix(Ms[d], Ks[d]); mass_and_derivative_matrices[index * dim + d] = matrix; } else { + using VectorizedArrayTrait = + dealii::internal::VectorizedArrayTrait; + + std::bitset mask; + + for (unsigned int v = 0; v < VectorizedArrayTrait::width(); ++v) + { + typename VectorizedArrayTrait::value_type a = 0.0; + + for (unsigned int i = 0; i < Ms[d].size(0); ++i) + for (unsigned int j = 0; j < Ms[d].size(1); ++j) + { + a += std::abs(VectorizedArrayTrait::get(Ms[d][i][j], v)); + a += std::abs(VectorizedArrayTrait::get(Ks[d][i][j], v)); + } + + mask[v] = (a != 0.0); + } + + const MatrixPairTypeWithMask matrix{mask, {Ms[d], Ks[d]}}; + const auto ptr = cache.find(matrix); if (ptr != cache.end()) - indices[index * dim + d] = ptr->second; + { + const auto ptr_index = ptr->second; + indices[index * dim + d] = ptr_index; + + if ([&]() { + for (unsigned int v = 0; v < VectorizedArrayTrait::width(); + ++v) + if ((mask[v] == true) && (ptr->first.first[v] == false)) + return false; + + return true; + }()) + { + // nothing to do + } + else + { + auto mask_new = ptr->first.first; + auto Ms_new = ptr->first.second.first; + auto Ks_new = ptr->first.second.second; + + for (unsigned int v = 0; v < VectorizedArrayTrait::width(); + ++v) + if (mask_new[v] == false && mask[v] == true) + { + mask_new[v] = true; + + for (unsigned int i = 0; i < Ms_new.size(0); ++i) + for (unsigned int j = 0; j < Ms_new.size(1); ++j) + { + VectorizedArrayTrait::get(Ms_new[i][j], v) = + VectorizedArrayTrait::get(Ms[d][i][j], v); + VectorizedArrayTrait::get(Ks_new[i][j], v) = + VectorizedArrayTrait::get(Ks[d][i][j], v); + } + } + + cache.erase(ptr); + + const MatrixPairTypeWithMask entry_new{mask_new, + {Ms_new, Ks_new}}; + + const auto ptr_ = cache.find(entry_new); + AssertThrow(ptr_ == cache.end(), ExcNotImplemented()); + + cache[entry_new] = ptr_index; + } + } else { const auto size = cache.size(); @@ -1260,7 +1320,7 @@ TensorProductMatrixSymmetricSumCollection::finalize() std::map inverted_cache; for (const auto &i : cache) - inverted_cache[i.second] = i.first; + inverted_cache[i.second] = i.first.second; for (unsigned int i = 0; i < indices.size(); ++i) { @@ -1296,7 +1356,7 @@ TensorProductMatrixSymmetricSumCollection::finalize() for (const auto &i : cache) { - const auto &M = i.first.first; + const auto &M = i.first.second.first; this->vector_ptr[i.second + 1] = M.n_rows(); this->matrix_ptr[i.second + 1] = M.n_rows() * M.n_cols(); @@ -1314,7 +1374,7 @@ TensorProductMatrixSymmetricSumCollection::finalize() this->eigenvalues.resize_fast(vector_ptr.back()); for (const auto &i : cache) - store(i.second, i.first); + store(i.second, i.first.second); cache.clear(); } diff --git a/tests/lac/tensor_product_matrix_08.cc b/tests/lac/tensor_product_matrix_08.cc index bbe162923a..9ee0b7b415 100644 --- a/tests/lac/tensor_product_matrix_08.cc +++ b/tests/lac/tensor_product_matrix_08.cc @@ -40,6 +40,10 @@ template void do_test_mesh(const Mapping &mapping, const Triangulation &tria) { + using VectorizedArrayTrait = dealii::internal::VectorizedArrayTrait; + using ScalarNumber = typename VectorizedArrayTrait::value_type; + static constexpr std::size_t width = VectorizedArrayTrait::width(); + using FDM = TensorProductMatrixSymmetricSumCollection; const unsigned int fe_degree = 3; @@ -58,38 +62,62 @@ do_test_mesh(const Mapping &mapping, const Triangulation &tria) FDM collection_2(typename FDM::AdditionalData(true, true)); FDM collection_3(typename FDM::AdditionalData(false, true)); - collection_0.reserve(tria.n_active_cells()); - collection_1.reserve(tria.n_active_cells()); - collection_2.reserve(tria.n_active_cells()); - collection_3.reserve(tria.n_active_cells()); + const auto n_cell_batches = (tria.n_active_cells() + width - 1) / width; + + collection_0.reserve(n_cell_batches); + collection_1.reserve(n_cell_batches); + collection_2.reserve(n_cell_batches); + collection_3.reserve(n_cell_batches); + + auto cell = tria.begin_active(); - for (const auto &cell : tria.active_cell_iterators()) + for (unsigned int counter = 0; counter < n_cell_batches; ++counter) { - const auto &patch_extent = - harmonic_patch_extent[cell->active_cell_index()]; - - const auto M_and_K = TensorProductMatrixCreator:: - create_laplace_tensor_product_matrix( - cell, - std::set{0}, - std::set{}, - fe_1D, - quadrature_1D, - patch_extent, - n_overlap); - - collection_0.insert(cell->active_cell_index(), - M_and_K.first, - M_and_K.second); - collection_1.insert(cell->active_cell_index(), - M_and_K.first, - M_and_K.second); - collection_2.insert(cell->active_cell_index(), - M_and_K.first, - M_and_K.second); - collection_3.insert(cell->active_cell_index(), - M_and_K.first, - M_and_K.second); + std::array, dim> Ms; + std::array, dim> Ks; + + for (unsigned int v = 0; (v < width) && (cell != tria.end()); ++v, ++cell) + { + const auto &patch_extent = + harmonic_patch_extent[cell->active_cell_index()]; + + const auto M_and_K_scalar = TensorProductMatrixCreator:: + create_laplace_tensor_product_matrix( + cell, + std::set{0}, + std::set{}, + fe_1D, + quadrature_1D, + patch_extent, + n_overlap); + + const auto Ms_scalar = M_and_K_scalar.first; + const auto Ks_scalar = M_and_K_scalar.second; + + for (unsigned int d = 0; d < dim; ++d) + { + if (Ms[d].size(0) == 0 || Ms[d].size(1) == 0) + { + Ms[d].reinit(Ms_scalar[d].size(0), Ms_scalar[d].size(1)); + Ks[d].reinit(Ks_scalar[d].size(0), Ks_scalar[d].size(1)); + } + + for (unsigned int i = 0; i < Ms_scalar[d].size(0); ++i) + for (unsigned int j = 0; j < Ms_scalar[d].size(0); ++j) + VectorizedArrayTrait::get(Ms[d][i][j], v) = + Ms_scalar[d][i][j]; + + for (unsigned int i = 0; i < Ks_scalar[d].size(0); ++i) + for (unsigned int j = 0; j < Ks_scalar[d].size(0); ++j) + VectorizedArrayTrait::get(Ks[d][i][j], v) = + Ks_scalar[d][i][j]; + } + } + + collection_0.insert(counter, Ms, Ks); + collection_1.insert(counter, Ms, Ks); + collection_2.insert(counter, Ms, Ks); + collection_3.insert(counter, Ms, Ks); } collection_0.finalize(); @@ -100,15 +128,15 @@ do_test_mesh(const Mapping &mapping, const Triangulation &tria) deallog << "Storage sizes: " << collection_0.storage_size() << " " << collection_1.storage_size() << std::endl; - Vector src(fe.n_dofs_per_cell()); - Vector dst(fe.n_dofs_per_cell()); + AlignedVector src(fe.n_dofs_per_cell()); + AlignedVector dst(fe.n_dofs_per_cell()); AlignedVector tmp; - FullMatrix matrix_0(fe.n_dofs_per_cell(), fe.n_dofs_per_cell()); - FullMatrix matrix_1(fe.n_dofs_per_cell(), fe.n_dofs_per_cell()); - FullMatrix matrix_2(fe.n_dofs_per_cell(), fe.n_dofs_per_cell()); - FullMatrix matrix_3(fe.n_dofs_per_cell(), fe.n_dofs_per_cell()); + Table<2, Number> matrix_0(fe.n_dofs_per_cell(), fe.n_dofs_per_cell()); + Table<2, Number> matrix_1(fe.n_dofs_per_cell(), fe.n_dofs_per_cell()); + Table<2, Number> matrix_2(fe.n_dofs_per_cell(), fe.n_dofs_per_cell()); + Table<2, Number> matrix_3(fe.n_dofs_per_cell(), fe.n_dofs_per_cell()); - for (unsigned int cell = 0; cell < tria.n_active_cells(); ++cell) + for (unsigned int cell = 0; cell < n_cell_batches; ++cell) { for (unsigned int i = 0; i < fe.n_dofs_per_cell(); ++i) { @@ -116,29 +144,29 @@ do_test_mesh(const Mapping &mapping, const Triangulation &tria) src[j] = i == j; collection_0.apply_inverse(cell, - make_array_view(dst), - make_array_view(src), + make_array_view(dst.begin(), dst.end()), + make_array_view(src.begin(), src.end()), tmp); for (unsigned int j = 0; j < fe.n_dofs_per_cell(); ++j) matrix_0[j][i] = dst[j]; collection_1.apply_inverse(cell, - make_array_view(dst), - make_array_view(src), + make_array_view(dst.begin(), dst.end()), + make_array_view(src.begin(), src.end()), tmp); for (unsigned int j = 0; j < fe.n_dofs_per_cell(); ++j) matrix_1[j][i] = dst[j]; collection_2.apply_inverse(cell, - make_array_view(dst), - make_array_view(src), + make_array_view(dst.begin(), dst.end()), + make_array_view(src.begin(), src.end()), tmp); for (unsigned int j = 0; j < fe.n_dofs_per_cell(); ++j) matrix_2[j][i] = dst[j]; collection_3.apply_inverse(cell, - make_array_view(dst), - make_array_view(src), + make_array_view(dst.begin(), dst.end()), + make_array_view(src.begin(), src.end()), tmp); for (unsigned int j = 0; j < fe.n_dofs_per_cell(); ++j) matrix_3[j][i] = dst[j]; @@ -244,8 +272,56 @@ main() { initlog(); - do_test(); - do_test(); + { + deallog.push("v=0"); + do_test(); + deallog << std::endl; + do_test(); + deallog.pop(); + deallog << std::endl; + } + + { + deallog.push("v=64"); + do_test>(); + deallog << std::endl; + do_test>(); + deallog.pop(); + deallog << std::endl; + } + +#if DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 128 + { + deallog.push("v=128"); + do_test>(); + deallog << std::endl; + do_test>(); + deallog.pop(); + deallog << std::endl; + } +#endif + +#if DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 256 + { + deallog.push("v=256"); + do_test>(); + deallog << std::endl; + do_test>(); + deallog.pop(); + deallog << std::endl; + } +#endif + +#if DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 512 + { + deallog.push("v=512"); + do_test>(); + deallog << std::endl; + do_test>(); + deallog.pop(); + deallog << std::endl; + } +#endif return 0; } diff --git a/tests/lac/tensor_product_matrix_08.with_lapack=true.output b/tests/lac/tensor_product_matrix_08.with_lapack=true.output index d7f63ad173..e99642232b 100644 --- a/tests/lac/tensor_product_matrix_08.with_lapack=true.output +++ b/tests/lac/tensor_product_matrix_08.with_lapack=true.output @@ -1,31 +1,65 @@ -DEAL::Storage sizes: 3 128 -DEAL::OK! +DEAL:v=0::Storage sizes: 3 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 1 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 6 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 2 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 128 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0:: +DEAL:v=0::Storage sizes: 3 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 1 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 6 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 2 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 128 128 +DEAL:v=0::OK! +DEAL:v=0:: DEAL:: -DEAL::Storage sizes: 1 128 -DEAL::OK! -DEAL:: -DEAL::Storage sizes: 6 256 -DEAL::OK! -DEAL:: -DEAL::Storage sizes: 2 256 -DEAL::OK! -DEAL:: -DEAL::Storage sizes: 128 128 -DEAL::OK! -DEAL:: -DEAL::Storage sizes: 3 128 -DEAL::OK! -DEAL:: -DEAL::Storage sizes: 1 128 -DEAL::OK! -DEAL:: -DEAL::Storage sizes: 6 256 -DEAL::OK! -DEAL:: -DEAL::Storage sizes: 2 256 -DEAL::OK! -DEAL:: -DEAL::Storage sizes: 128 128 -DEAL::OK! +DEAL:v=64::Storage sizes: 3 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 1 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 6 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 2 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 128 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64:: +DEAL:v=64::Storage sizes: 3 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 1 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 6 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 2 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 128 128 +DEAL:v=64::OK! +DEAL:v=64:: DEAL:: diff --git a/tests/lac/tensor_product_matrix_08.with_lapack=true.output.axx b/tests/lac/tensor_product_matrix_08.with_lapack=true.output.axx new file mode 100644 index 0000000000..89f5ac96af --- /dev/null +++ b/tests/lac/tensor_product_matrix_08.with_lapack=true.output.axx @@ -0,0 +1,129 @@ + +DEAL:v=0::Storage sizes: 3 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 1 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 6 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 2 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 128 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0:: +DEAL:v=0::Storage sizes: 3 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 1 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 6 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 2 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 128 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:: +DEAL:v=64::Storage sizes: 3 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 1 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 6 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 2 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 128 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64:: +DEAL:v=64::Storage sizes: 3 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 1 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 6 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 2 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 128 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:: +DEAL:v=128::Storage sizes: 5 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 1 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 6 128 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 2 128 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 64 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128:: +DEAL:v=128::Storage sizes: 5 32 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 1 32 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 6 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 2 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 32 32 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:: +DEAL:v=256::Storage sizes: 5 32 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 1 32 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 6 64 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 2 64 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 32 32 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256:: +DEAL:v=256::Storage sizes: 5 16 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 1 16 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 5 32 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 2 32 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 16 16 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:: diff --git a/tests/lac/tensor_product_matrix_08.with_lapack=true.output.axx512 b/tests/lac/tensor_product_matrix_08.with_lapack=true.output.axx512 new file mode 100644 index 0000000000..37508fdb12 --- /dev/null +++ b/tests/lac/tensor_product_matrix_08.with_lapack=true.output.axx512 @@ -0,0 +1,161 @@ + +DEAL:v=0::Storage sizes: 3 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 1 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 6 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 2 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 128 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0:: +DEAL:v=0::Storage sizes: 3 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 1 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 6 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 2 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 128 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:: +DEAL:v=64::Storage sizes: 3 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 1 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 6 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 2 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 128 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64:: +DEAL:v=64::Storage sizes: 3 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 1 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 6 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 2 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 128 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:: +DEAL:v=128::Storage sizes: 5 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 1 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 6 128 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 2 128 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 64 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128:: +DEAL:v=128::Storage sizes: 5 32 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 1 32 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 6 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 2 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 32 32 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:: +DEAL:v=256::Storage sizes: 5 32 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 1 32 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 6 64 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 2 64 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 32 32 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256:: +DEAL:v=256::Storage sizes: 5 16 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 1 16 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 5 32 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 2 32 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:v=256::Storage sizes: 16 16 +DEAL:v=256::OK! +DEAL:v=256:: +DEAL:: +DEAL:v=512::Storage sizes: 5 16 +DEAL:v=512::OK! +DEAL:v=512:: +DEAL:v=512::Storage sizes: 1 16 +DEAL:v=512::OK! +DEAL:v=512:: +DEAL:v=512::Storage sizes: 5 32 +DEAL:v=512::OK! +DEAL:v=512:: +DEAL:v=512::Storage sizes: 2 32 +DEAL:v=512::OK! +DEAL:v=512:: +DEAL:v=512::Storage sizes: 16 16 +DEAL:v=512::OK! +DEAL:v=512:: +DEAL:v=512:: +DEAL:v=512::Storage sizes: 4 8 +DEAL:v=512::OK! +DEAL:v=512:: +DEAL:v=512::Storage sizes: 1 8 +DEAL:v=512::OK! +DEAL:v=512:: +DEAL:v=512::Storage sizes: 5 16 +DEAL:v=512::OK! +DEAL:v=512:: +DEAL:v=512::Storage sizes: 2 16 +DEAL:v=512::OK! +DEAL:v=512:: +DEAL:v=512::Storage sizes: 8 8 +DEAL:v=512::OK! +DEAL:v=512:: +DEAL:: diff --git a/tests/lac/tensor_product_matrix_08.with_lapack=true.output.sse b/tests/lac/tensor_product_matrix_08.with_lapack=true.output.sse new file mode 100644 index 0000000000..64ecbdfd8b --- /dev/null +++ b/tests/lac/tensor_product_matrix_08.with_lapack=true.output.sse @@ -0,0 +1,97 @@ + +DEAL:v=0::Storage sizes: 3 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 1 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 6 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 2 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 128 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0:: +DEAL:v=0::Storage sizes: 3 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 1 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 6 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 2 256 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:v=0::Storage sizes: 128 128 +DEAL:v=0::OK! +DEAL:v=0:: +DEAL:: +DEAL:v=64::Storage sizes: 3 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 1 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 6 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 2 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 128 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64:: +DEAL:v=64::Storage sizes: 3 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 1 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 6 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 2 256 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:v=64::Storage sizes: 128 128 +DEAL:v=64::OK! +DEAL:v=64:: +DEAL:: +DEAL:v=128::Storage sizes: 5 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 1 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 6 128 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 2 128 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 64 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128:: +DEAL:v=128::Storage sizes: 5 32 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 1 32 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 6 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 2 64 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:v=128::Storage sizes: 32 32 +DEAL:v=128::OK! +DEAL:v=128:: +DEAL:: -- 2.39.5