From 8af2dc73508f49f2f86dc40c0b808762013904a9 Mon Sep 17 00:00:00 2001 From: Tobias Ribizel Date: Sat, 17 Sep 2022 15:54:02 +0200 Subject: [PATCH] csr_kernels --- cuda/test/CMakeLists.txt | 1 - cuda/test/matrix/CMakeLists.txt | 1 - cuda/test/matrix/csr_kernels.cpp | 1043 ---------------- dpcpp/test/matrix/CMakeLists.txt | 1 - hip/test/matrix/CMakeLists.txt | 1 - hip/test/matrix/csr_kernels.hip.cpp | 1053 ----------------- omp/test/matrix/CMakeLists.txt | 1 - omp/test/matrix/csr_kernels.cpp | 906 -------------- test/matrix/CMakeLists.txt | 1 + .../matrix/csr_kernels2.cpp | 630 +++++++--- 10 files changed, 456 insertions(+), 3182 deletions(-) delete mode 100644 cuda/test/matrix/CMakeLists.txt delete mode 100644 cuda/test/matrix/csr_kernels.cpp delete mode 100644 hip/test/matrix/csr_kernels.hip.cpp delete mode 100644 omp/test/matrix/csr_kernels.cpp rename dpcpp/test/matrix/csr_kernels.cpp => test/matrix/csr_kernels2.cpp (59%) diff --git a/cuda/test/CMakeLists.txt b/cuda/test/CMakeLists.txt index 050994a50c4..36a876b1377 100644 --- a/cuda/test/CMakeLists.txt +++ b/cuda/test/CMakeLists.txt @@ -2,7 +2,6 @@ include(${PROJECT_SOURCE_DIR}/cmake/create_test.cmake) add_subdirectory(base) add_subdirectory(components) -add_subdirectory(matrix) add_subdirectory(reorder) add_subdirectory(solver) add_subdirectory(utils) diff --git a/cuda/test/matrix/CMakeLists.txt b/cuda/test/matrix/CMakeLists.txt deleted file mode 100644 index 8b3a1ec79e8..00000000000 --- a/cuda/test/matrix/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -ginkgo_create_test(csr_kernels) diff --git a/cuda/test/matrix/csr_kernels.cpp b/cuda/test/matrix/csr_kernels.cpp deleted file mode 100644 index ace4ab59a9f..00000000000 --- a/cuda/test/matrix/csr_kernels.cpp +++ /dev/null @@ -1,1043 +0,0 @@ -/************************************************************* -Copyright (c) 2017-2022, the Ginkgo authors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*************************************************************/ - -#include - - -#include - - -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "core/components/prefix_sum_kernels.hpp" -#include "core/matrix/csr_kernels.hpp" -#include "core/test/utils/unsort_matrix.hpp" -#include "core/utils/matrix_utils.hpp" -#include "cuda/test/utils.hpp" - - -namespace { - - -class Csr : public ::testing::Test { -protected: - using Arr = gko::array; - using Vec = gko::matrix::Dense<>; - using Mtx = gko::matrix::Csr<>; - using ComplexVec = gko::matrix::Dense>; - using ComplexMtx = gko::matrix::Csr>; - - Csr() -#ifdef GINKGO_FAST_TESTS - : mtx_size(152, 231), -#else - : mtx_size(532, 231), -#endif - rand_engine(42) - {} - - void SetUp() - { - ASSERT_GT(gko::CudaExecutor::get_num_devices(), 0); - ref = gko::ReferenceExecutor::create(); - cuda = gko::CudaExecutor::create(0, ref); - } - - void TearDown() - { - if (cuda != nullptr) { - ASSERT_NO_THROW(cuda->synchronize()); - } - } - - template - std::unique_ptr gen_mtx(int num_rows, int num_cols, - int min_nnz_row) - { - return gko::test::generate_random_matrix( - num_rows, num_cols, - std::uniform_int_distribution<>(min_nnz_row, num_cols), - std::normal_distribution<>(-1.0, 1.0), rand_engine, ref); - } - - void set_up_apply_data() - { - mtx2 = Mtx::create(ref); - mtx2->copy_from(gen_mtx(mtx_size[0], mtx_size[1], 5)); - dmtx2 = Mtx::create(cuda); - dmtx2->copy_from(mtx2.get()); - } - - void set_up_apply_data(std::shared_ptr strategy, - int num_vectors = 1) - { - mtx = Mtx::create(ref, strategy); - mtx->copy_from(gen_mtx(mtx_size[0], mtx_size[1], 1)); - square_mtx = Mtx::create(ref, strategy); - square_mtx->copy_from(gen_mtx(mtx_size[0], mtx_size[0], 1)); - expected = gen_mtx(mtx_size[0], num_vectors, 1); - y = gen_mtx(mtx_size[1], num_vectors, 1); - alpha = gko::initialize({2.0}, ref); - beta = gko::initialize({-1.0}, ref); - dmtx = Mtx::create(cuda, strategy); - dmtx->copy_from(mtx.get()); - square_dmtx = Mtx::create(cuda, strategy); - square_dmtx->copy_from(square_mtx.get()); - dresult = gko::clone(cuda, expected); - dy = gko::clone(cuda, y); - dalpha = gko::clone(cuda, alpha); - dbeta = gko::clone(cuda, beta); - - std::vector tmp(mtx->get_size()[0], 0); - auto rng = std::default_random_engine{}; - std::iota(tmp.begin(), tmp.end(), 0); - std::shuffle(tmp.begin(), tmp.end(), rng); - std::vector tmp2(mtx->get_size()[1], 0); - std::iota(tmp2.begin(), tmp2.end(), 0); - std::shuffle(tmp2.begin(), tmp2.end(), rng); - rpermute_idxs = std::make_unique(ref, tmp.begin(), tmp.end()); - cpermute_idxs = std::make_unique(ref, tmp2.begin(), tmp2.end()); - } - - void set_up_apply_complex_data( - std::shared_ptr strategy) - { - complex_mtx = ComplexMtx::create(ref, strategy); - complex_mtx->copy_from( - gen_mtx(mtx_size[0], mtx_size[1], 1)); - complex_dmtx = ComplexMtx::create(cuda, strategy); - complex_dmtx->copy_from(complex_mtx.get()); - } - - void unsort_mtx() - { - gko::test::unsort_matrix(mtx.get(), rand_engine); - dmtx->copy_from(mtx.get()); - } - - - std::shared_ptr ref; - std::shared_ptr cuda; - - const gko::dim<2> mtx_size; - std::default_random_engine rand_engine; - - std::unique_ptr mtx; - std::unique_ptr mtx2; - std::unique_ptr complex_mtx; - std::unique_ptr square_mtx; - std::unique_ptr expected; - std::unique_ptr y; - std::unique_ptr alpha; - std::unique_ptr beta; - - std::unique_ptr dmtx; - std::unique_ptr dmtx2; - std::unique_ptr complex_dmtx; - std::unique_ptr square_dmtx; - std::unique_ptr dresult; - std::unique_ptr dy; - std::unique_ptr dalpha; - std::unique_ptr dbeta; - std::unique_ptr rpermute_idxs; - std::unique_ptr cpermute_idxs; -}; - - -TEST_F(Csr, StrategyAfterCopyIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - - ASSERT_EQ(mtx->get_strategy()->get_name(), - dmtx->get_strategy()->get_name()); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithLoadBalance) -{ - set_up_apply_data(std::make_shared(cuda)); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithLoadBalanceUnsorted) -{ - set_up_apply_data(std::make_shared(cuda)); - unsort_mtx(); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithLoadBalance) -{ - set_up_apply_data(std::make_shared(cuda)); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithCusparse) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithCusparseUnsorted) -{ - set_up_apply_data(std::make_shared()); - unsort_mtx(); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithCusparse) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithMergePath) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithMergePathUnsorted) -{ - set_up_apply_data(std::make_shared()); - unsort_mtx(); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithMergePath) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithClassical) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithClassicalUnsorted) -{ - set_up_apply_data(std::make_shared()); - unsort_mtx(); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithClassical) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithAutomatical) -{ - set_up_apply_data(std::make_shared(cuda)); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithLoadBalance) -{ - set_up_apply_data(std::make_shared(cuda), 3); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithLoadBalance) -{ - set_up_apply_data(std::make_shared(cuda), 3); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithClassical) -{ - set_up_apply_data(std::make_shared(), 3); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithClassical) -{ - set_up_apply_data(std::make_shared(), 3); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithMergePath) -{ - set_up_apply_data(std::make_shared(), 3); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithMergePath) -{ - set_up_apply_data(std::make_shared(), 3); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToCsrMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - auto trans = mtx->transpose(); - auto d_trans = dmtx->transpose(); - - mtx->apply(alpha.get(), trans.get(), beta.get(), square_mtx.get()); - dmtx->apply(dalpha.get(), d_trans.get(), dbeta.get(), square_dmtx.get()); - - GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); - GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); - ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); -} - - -TEST_F(Csr, SimpleApplyToCsrMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - auto trans = mtx->transpose(); - auto d_trans = dmtx->transpose(); - - mtx->apply(trans.get(), square_mtx.get()); - dmtx->apply(d_trans.get(), square_dmtx.get()); - - GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); - GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); - ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); -} - - -TEST_F(Csr, AdvancedApplyToIdentityMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - auto a = gen_mtx(mtx_size[0], mtx_size[1], 0); - auto b = gen_mtx(mtx_size[0], mtx_size[1], 0); - auto da = gko::clone(cuda, a); - auto db = gko::clone(cuda, b); - auto id = gko::matrix::Identity::create(ref, mtx_size[1]); - auto did = - gko::matrix::Identity::create(cuda, mtx_size[1]); - - a->apply(alpha.get(), id.get(), beta.get(), b.get()); - da->apply(dalpha.get(), did.get(), dbeta.get(), db.get()); - - GKO_ASSERT_MTX_NEAR(b, db, 1e-14); - GKO_ASSERT_MTX_EQ_SPARSITY(b, db); - ASSERT_TRUE(db->is_sorted_by_column_index()); -} - - -TEST_F(Csr, ApplyToComplexIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - auto complex_b = gen_mtx(this->mtx_size[1], 3, 1); - auto dcomplex_b = gko::clone(cuda, complex_b); - auto complex_x = gen_mtx(this->mtx_size[0], 3, 1); - auto dcomplex_x = gko::clone(cuda, complex_x); - - mtx->apply(complex_b.get(), complex_x.get()); - dmtx->apply(dcomplex_b.get(), dcomplex_x.get()); - - GKO_ASSERT_MTX_NEAR(dcomplex_x, complex_x, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToComplexIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - auto complex_b = gen_mtx(this->mtx_size[1], 3, 1); - auto dcomplex_b = gko::clone(cuda, complex_b); - auto complex_x = gen_mtx(this->mtx_size[0], 3, 1); - auto dcomplex_x = gko::clone(cuda, complex_x); - - mtx->apply(alpha.get(), complex_b.get(), beta.get(), complex_x.get()); - dmtx->apply(dalpha.get(), dcomplex_b.get(), dbeta.get(), dcomplex_x.get()); - - GKO_ASSERT_MTX_NEAR(dcomplex_x, complex_x, 1e-14); -} - - -TEST_F(Csr, TransposeIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - - auto trans = gko::as(mtx->transpose()); - auto d_trans = gko::as(dmtx->transpose()); - - GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); - ASSERT_TRUE(d_trans->is_sorted_by_column_index()); -} - - -TEST_F(Csr, Transpose64IsEquivalentToRef) -{ - using Mtx64 = gko::matrix::Csr; - auto mtx = gen_mtx(123, 234, 0); - auto dmtx = gko::clone(cuda, mtx); - - auto trans = gko::as(mtx->transpose()); - auto d_trans = gko::as(dmtx->transpose()); - - GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); - ASSERT_TRUE(d_trans->is_sorted_by_column_index()); -} - - -TEST_F(Csr, ConjugateTransposeIsEquivalentToRef) -{ - set_up_apply_complex_data(std::make_shared(cuda)); - - auto trans = gko::as(complex_mtx->conj_transpose()); - auto d_trans = gko::as(complex_dmtx->conj_transpose()); - - GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); - ASSERT_TRUE(d_trans->is_sorted_by_column_index()); -} - - -TEST_F(Csr, ConjugateTranspose64IsEquivalentToRef) -{ - using Mtx64 = gko::matrix::Csr; - auto mtx = gen_mtx(123, 234, 0); - auto dmtx = gko::clone(cuda, mtx); - - auto trans = gko::as(mtx->transpose()); - auto d_trans = gko::as(dmtx->transpose()); - - GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); - ASSERT_TRUE(d_trans->is_sorted_by_column_index()); -} - - -TEST_F(Csr, ConvertToDenseIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto dense_mtx = gko::matrix::Dense<>::create(ref); - auto ddense_mtx = gko::matrix::Dense<>::create(cuda); - - mtx->convert_to(dense_mtx.get()); - dmtx->convert_to(ddense_mtx.get()); - - GKO_ASSERT_MTX_NEAR(dense_mtx.get(), ddense_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToDenseIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto dense_mtx = gko::matrix::Dense<>::create(ref); - auto ddense_mtx = gko::matrix::Dense<>::create(cuda); - - mtx->move_to(dense_mtx.get()); - dmtx->move_to(ddense_mtx.get()); - - GKO_ASSERT_MTX_NEAR(dense_mtx.get(), ddense_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToEllIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto ell_mtx = gko::matrix::Ell<>::create(ref); - auto dell_mtx = gko::matrix::Ell<>::create(cuda); - - mtx->convert_to(ell_mtx.get()); - dmtx->convert_to(dell_mtx.get()); - - GKO_ASSERT_MTX_NEAR(ell_mtx.get(), dell_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToEllIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto ell_mtx = gko::matrix::Ell<>::create(ref); - auto dell_mtx = gko::matrix::Ell<>::create(cuda); - - mtx->move_to(ell_mtx.get()); - dmtx->move_to(dell_mtx.get()); - - GKO_ASSERT_MTX_NEAR(ell_mtx.get(), dell_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToSparsityCsrIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto sparsity_mtx = gko::matrix::SparsityCsr<>::create(ref); - auto d_sparsity_mtx = gko::matrix::SparsityCsr<>::create(cuda); - - mtx->convert_to(sparsity_mtx.get()); - dmtx->convert_to(d_sparsity_mtx.get()); - - GKO_ASSERT_MTX_NEAR(sparsity_mtx.get(), d_sparsity_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToSparsityCsrIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto sparsity_mtx = gko::matrix::SparsityCsr<>::create(ref); - auto d_sparsity_mtx = gko::matrix::SparsityCsr<>::create(cuda); - - mtx->move_to(sparsity_mtx.get()); - dmtx->move_to(d_sparsity_mtx.get()); - - GKO_ASSERT_MTX_NEAR(sparsity_mtx.get(), d_sparsity_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToCooIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto coo_mtx = gko::matrix::Coo<>::create(ref); - auto dcoo_mtx = gko::matrix::Coo<>::create(cuda); - - mtx->convert_to(coo_mtx.get()); - dmtx->convert_to(dcoo_mtx.get()); - - GKO_ASSERT_MTX_NEAR(coo_mtx.get(), dcoo_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToCooIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto coo_mtx = gko::matrix::Coo<>::create(ref); - auto dcoo_mtx = gko::matrix::Coo<>::create(cuda); - - mtx->move_to(coo_mtx.get()); - dmtx->move_to(dcoo_mtx.get()); - - GKO_ASSERT_MTX_NEAR(coo_mtx.get(), dcoo_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToSellpIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto sellp_mtx = gko::matrix::Sellp<>::create(ref); - auto dsellp_mtx = gko::matrix::Sellp<>::create(cuda); - - mtx->convert_to(sellp_mtx.get()); - dmtx->convert_to(dsellp_mtx.get()); - - GKO_ASSERT_MTX_NEAR(sellp_mtx.get(), dsellp_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToSellpIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto sellp_mtx = gko::matrix::Sellp<>::create(ref); - auto dsellp_mtx = gko::matrix::Sellp<>::create(cuda); - - mtx->move_to(sellp_mtx.get()); - dmtx->move_to(dsellp_mtx.get()); - - GKO_ASSERT_MTX_NEAR(sellp_mtx.get(), dsellp_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertsEmptyToSellp) -{ - auto dempty_mtx = Mtx::create(cuda); - auto dsellp_mtx = gko::matrix::Sellp<>::create(cuda); - - dempty_mtx->convert_to(dsellp_mtx.get()); - - ASSERT_EQ(cuda->copy_val_to_host(dsellp_mtx->get_const_slice_sets()), 0); - ASSERT_FALSE(dsellp_mtx->get_size()); -} - - -TEST_F(Csr, ConvertToHybridIsEquivalentToRef) -{ - using Hybrid_type = gko::matrix::Hybrid<>; - set_up_apply_data(std::make_shared()); - auto hybrid_mtx = Hybrid_type::create( - ref, std::make_shared(2)); - auto dhybrid_mtx = Hybrid_type::create( - cuda, std::make_shared(2)); - - mtx->convert_to(hybrid_mtx.get()); - dmtx->convert_to(dhybrid_mtx.get()); - - GKO_ASSERT_MTX_NEAR(hybrid_mtx.get(), dhybrid_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToHybridIsEquivalentToRef) -{ - using Hybrid_type = gko::matrix::Hybrid<>; - set_up_apply_data(std::make_shared()); - auto hybrid_mtx = Hybrid_type::create( - ref, std::make_shared(2)); - auto dhybrid_mtx = Hybrid_type::create( - cuda, std::make_shared(2)); - - mtx->move_to(hybrid_mtx.get()); - dmtx->move_to(dhybrid_mtx.get()); - - GKO_ASSERT_MTX_NEAR(hybrid_mtx.get(), dhybrid_mtx.get(), 0); -} - - -TEST_F(Csr, IsPermutable) -{ - set_up_apply_data(std::make_shared()); - - auto permuted = gko::as(square_mtx->permute(rpermute_idxs.get())); - auto dpermuted = gko::as(square_dmtx->permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(permuted, dpermuted); - GKO_ASSERT_MTX_NEAR(permuted, dpermuted, 0); -} - - -TEST_F(Csr, IsInversePermutable) -{ - set_up_apply_data(std::make_shared()); - - auto permuted = - gko::as(square_mtx->inverse_permute(rpermute_idxs.get())); - auto dpermuted = - gko::as(square_dmtx->inverse_permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(permuted, dpermuted); - GKO_ASSERT_MTX_NEAR(permuted, dpermuted, 0); -} - - -TEST_F(Csr, IsRowPermutable) -{ - set_up_apply_data(std::make_shared()); - - auto r_permute = gko::as(mtx->row_permute(rpermute_idxs.get())); - auto dr_permute = gko::as(dmtx->row_permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(r_permute, dr_permute); - GKO_ASSERT_MTX_NEAR(r_permute, dr_permute, 0); -} - - -TEST_F(Csr, IsColPermutable) -{ - set_up_apply_data(std::make_shared()); - - auto c_permute = gko::as(mtx->column_permute(cpermute_idxs.get())); - auto dc_permute = gko::as(dmtx->column_permute(cpermute_idxs.get())); - - ASSERT_TRUE(dc_permute->is_sorted_by_column_index()); - GKO_ASSERT_MTX_EQ_SPARSITY(c_permute, dc_permute); - GKO_ASSERT_MTX_NEAR(c_permute, dc_permute, 0); -} - - -TEST_F(Csr, IsInverseRowPermutable) -{ - set_up_apply_data(std::make_shared()); - - auto inverse_r_permute = - gko::as(mtx->inverse_row_permute(rpermute_idxs.get())); - auto d_inverse_r_permute = - gko::as(dmtx->inverse_row_permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(inverse_r_permute, d_inverse_r_permute); - GKO_ASSERT_MTX_NEAR(inverse_r_permute, d_inverse_r_permute, 0); -} - - -TEST_F(Csr, IsInverseColPermutable) -{ - set_up_apply_data(std::make_shared()); - - auto inverse_c_permute = - gko::as(mtx->inverse_column_permute(cpermute_idxs.get())); - auto d_inverse_c_permute = - gko::as(dmtx->inverse_column_permute(cpermute_idxs.get())); - - ASSERT_TRUE(d_inverse_c_permute->is_sorted_by_column_index()); - GKO_ASSERT_MTX_EQ_SPARSITY(inverse_c_permute, d_inverse_c_permute); - GKO_ASSERT_MTX_NEAR(inverse_c_permute, d_inverse_c_permute, 0); -} - - -TEST_F(Csr, RecognizeSortedMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - bool is_sorted_cuda{}; - bool is_sorted_ref{}; - - is_sorted_ref = mtx->is_sorted_by_column_index(); - is_sorted_cuda = dmtx->is_sorted_by_column_index(); - - ASSERT_EQ(is_sorted_ref, is_sorted_cuda); -} - - -TEST_F(Csr, RecognizeUnsortedMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - unsort_mtx(); - bool is_sorted_cuda{}; - bool is_sorted_ref{}; - - is_sorted_ref = mtx->is_sorted_by_column_index(); - is_sorted_cuda = dmtx->is_sorted_by_column_index(); - - ASSERT_EQ(is_sorted_ref, is_sorted_cuda); -} - - -TEST_F(Csr, SortSortedMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - - mtx->sort_by_column_index(); - dmtx->sort_by_column_index(); - - // Values must be unchanged, therefore, tolerance is `0` - GKO_ASSERT_MTX_NEAR(mtx, dmtx, 0); -} - - -TEST_F(Csr, SortUnsortedMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - unsort_mtx(); - - mtx->sort_by_column_index(); - dmtx->sort_by_column_index(); - - // Values must be unchanged, therefore, tolerance is `0` - GKO_ASSERT_MTX_NEAR(mtx, dmtx, 0); -} - - -TEST_F(Csr, OneAutomaticalWorksWithDifferentMatrices) -{ - auto automatical = std::make_shared(cuda); - auto row_len_limit = std::max(automatical->nvidia_row_len_limit, - automatical->amd_row_len_limit); - auto load_balance_mtx = - gen_mtx(1, row_len_limit + 1000, row_len_limit + 1); - auto classical_mtx = gen_mtx(50, 50, 1); - auto load_balance_mtx_d = gko::clone(cuda, load_balance_mtx); - auto classical_mtx_d = gko::clone(cuda, classical_mtx); - - load_balance_mtx_d->set_strategy(automatical); - classical_mtx_d->set_strategy(automatical); - - EXPECT_EQ("load_balance", load_balance_mtx_d->get_strategy()->get_name()); - EXPECT_EQ("classical", classical_mtx_d->get_strategy()->get_name()); - ASSERT_NE(load_balance_mtx_d->get_strategy().get(), - classical_mtx_d->get_strategy().get()); -} - - -TEST_F(Csr, ExtractDiagonalIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - - auto diag = mtx->extract_diagonal(); - auto ddiag = dmtx->extract_diagonal(); - - GKO_ASSERT_MTX_NEAR(diag.get(), ddiag.get(), 0); -} - - -TEST_F(Csr, InplaceAbsoluteMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - - mtx->compute_absolute_inplace(); - dmtx->compute_absolute_inplace(); - - GKO_ASSERT_MTX_NEAR(mtx, dmtx, 1e-14); -} - - -TEST_F(Csr, OutplaceAbsoluteMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(cuda)); - - auto abs_mtx = mtx->compute_absolute(); - auto dabs_mtx = dmtx->compute_absolute(); - - GKO_ASSERT_MTX_NEAR(abs_mtx, dabs_mtx, 1e-14); -} - - -TEST_F(Csr, InplaceAbsoluteComplexMatrixIsEquivalentToRef) -{ - set_up_apply_complex_data(std::make_shared(cuda)); - - complex_mtx->compute_absolute_inplace(); - complex_dmtx->compute_absolute_inplace(); - - GKO_ASSERT_MTX_NEAR(complex_mtx, complex_dmtx, 1e-14); -} - - -TEST_F(Csr, OutplaceAbsoluteComplexMatrixIsEquivalentToRef) -{ - set_up_apply_complex_data(std::make_shared(cuda)); - - auto abs_mtx = complex_mtx->compute_absolute(); - auto dabs_mtx = complex_dmtx->compute_absolute(); - - GKO_ASSERT_MTX_NEAR(abs_mtx, dabs_mtx, 1e-14); -} - - -TEST_F(Csr, CalculateNnzPerRowInSpanIsEquivalentToRef) -{ - using Mtx = gko::matrix::Csr<>; - set_up_apply_data(); - gko::span rspan{7, 51}; - gko::span cspan{22, 88}; - auto size = this->mtx2->get_size(); - auto row_nnz = gko::array(this->ref, rspan.length() + 1); - auto drow_nnz = gko::array(this->cuda, row_nnz); - - gko::kernels::reference::csr::calculate_nonzeros_per_row_in_span( - this->ref, this->mtx2.get(), rspan, cspan, &row_nnz); - gko::kernels::cuda::csr::calculate_nonzeros_per_row_in_span( - this->cuda, this->dmtx2.get(), rspan, cspan, &drow_nnz); - - GKO_ASSERT_ARRAY_EQ(row_nnz, drow_nnz); -} - - -TEST_F(Csr, ComputeSubmatrixIsEquivalentToRef) -{ - using Mtx = gko::matrix::Csr<>; - using IndexType = int; - using ValueType = double; - set_up_apply_data(); - gko::span rspan{7, 51}; - gko::span cspan{22, 88}; - auto size = this->mtx2->get_size(); - auto row_nnz = gko::array(this->ref, rspan.length() + 1); - gko::kernels::reference::csr::calculate_nonzeros_per_row_in_span( - this->ref, this->mtx2.get(), rspan, cspan, &row_nnz); - gko::kernels::reference::components::prefix_sum( - this->ref, row_nnz.get_data(), row_nnz.get_num_elems()); - auto num_nnz = row_nnz.get_data()[rspan.length()]; - auto drow_nnz = gko::array(this->cuda, row_nnz); - auto smat1 = - Mtx::create(this->ref, gko::dim<2>(rspan.length(), cspan.length()), - std::move(gko::array(this->ref, num_nnz)), - std::move(gko::array(this->ref, num_nnz)), - std::move(row_nnz)); - auto sdmat1 = - Mtx::create(this->cuda, gko::dim<2>(rspan.length(), cspan.length()), - std::move(gko::array(this->cuda, num_nnz)), - std::move(gko::array(this->cuda, num_nnz)), - std::move(drow_nnz)); - - - gko::kernels::reference::csr::compute_submatrix(this->ref, this->mtx2.get(), - rspan, cspan, smat1.get()); - gko::kernels::cuda::csr::compute_submatrix(this->cuda, this->dmtx2.get(), - rspan, cspan, sdmat1.get()); - - GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); -} - - -TEST_F(Csr, CreateSubMatrixIsEquivalentToRef) -{ - using Mtx = gko::matrix::Csr<>; - set_up_apply_data(); - gko::span rspan{47, 81}; - gko::span cspan{2, 31}; - - auto smat1 = this->mtx2->create_submatrix(rspan, cspan); - auto sdmat1 = this->dmtx2->create_submatrix(rspan, cspan); - - GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); -} - - -TEST_F(Csr, CanDetectMissingDiagonalEntry) -{ - using T = double; - using Csr = Mtx; - auto ref_mtx = gen_mtx(103, 98, 10); - const auto rowptrs = ref_mtx->get_row_ptrs(); - const auto colidxs = ref_mtx->get_col_idxs(); - const int testrow = 15; - gko::utils::remove_diagonal_entry_from_row(ref_mtx.get(), testrow); - auto mtx = gko::clone(cuda, ref_mtx); - bool has_diags = true; - - gko::kernels::cuda::csr::check_diagonal_entries_exist(cuda, mtx.get(), - has_diags); - - ASSERT_FALSE(has_diags); -} - - -TEST_F(Csr, CanDetectWhenAllDiagonalEntriesArePresent) -{ - using T = double; - using Csr = Mtx; - auto ref_mtx = gen_mtx(103, 98, 10); - gko::utils::ensure_all_diagonal_entries(ref_mtx.get()); - auto mtx = gko::clone(cuda, ref_mtx); - bool has_diags = true; - - gko::kernels::cuda::csr::check_diagonal_entries_exist(cuda, mtx.get(), - has_diags); - - ASSERT_TRUE(has_diags); -} - - -TEST_F(Csr, AddScaledIdentityToNonSquare) -{ - set_up_apply_data(std::make_shared()); - gko::utils::ensure_all_diagonal_entries(mtx.get()); - dmtx->copy_from(mtx.get()); - - mtx->add_scaled_identity(alpha.get(), beta.get()); - dmtx->add_scaled_identity(dalpha.get(), dbeta.get()); - - GKO_ASSERT_MTX_NEAR(mtx, dmtx, r::value); -} - - -} // namespace diff --git a/dpcpp/test/matrix/CMakeLists.txt b/dpcpp/test/matrix/CMakeLists.txt index a2ad1935447..88ab52e9c3f 100644 --- a/dpcpp/test/matrix/CMakeLists.txt +++ b/dpcpp/test/matrix/CMakeLists.txt @@ -1,2 +1 @@ -ginkgo_create_test(csr_kernels) ginkgo_create_test(fbcsr_kernels) diff --git a/hip/test/matrix/CMakeLists.txt b/hip/test/matrix/CMakeLists.txt index dc8c638aebe..82db4b8b376 100644 --- a/hip/test/matrix/CMakeLists.txt +++ b/hip/test/matrix/CMakeLists.txt @@ -1,4 +1,3 @@ -ginkgo_create_hip_test(csr_kernels) ginkgo_create_hip_test(fbcsr_kernels) if (hipfft_FOUND) ginkgo_create_hip_test(fft_kernels) diff --git a/hip/test/matrix/csr_kernels.hip.cpp b/hip/test/matrix/csr_kernels.hip.cpp deleted file mode 100644 index f4cd6b53254..00000000000 --- a/hip/test/matrix/csr_kernels.hip.cpp +++ /dev/null @@ -1,1053 +0,0 @@ -/************************************************************* -Copyright (c) 2017-2022, the Ginkgo authors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*************************************************************/ - -#include - - -#include - - -#include - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "core/components/prefix_sum_kernels.hpp" -#include "core/matrix/csr_kernels.hpp" -#include "core/test/utils/unsort_matrix.hpp" -#include "core/utils/matrix_utils.hpp" -#include "hip/test/utils.hip.hpp" - - -namespace { - - -class Csr : public ::testing::Test { -protected: - using Arr = gko::array; - using Vec = gko::matrix::Dense<>; - using Mtx = gko::matrix::Csr<>; - using ComplexVec = gko::matrix::Dense>; - using ComplexMtx = gko::matrix::Csr>; - - Csr() -#ifdef GINKGO_FAST_TESTS - : mtx_size(152, 231), -#else - : mtx_size(532, 231), -#endif - rand_engine(42) - {} - - void SetUp() - { - ASSERT_GT(gko::HipExecutor::get_num_devices(), 0); - ref = gko::ReferenceExecutor::create(); - hip = gko::HipExecutor::create(0, ref); - } - - void TearDown() - { - if (hip != nullptr) { - ASSERT_NO_THROW(hip->synchronize()); - } - } - - template - std::unique_ptr gen_mtx(int num_rows, int num_cols, - int min_nnz_row) - { - return gko::test::generate_random_matrix( - num_rows, num_cols, - std::uniform_int_distribution<>(min_nnz_row, num_cols), - std::normal_distribution<>(-1.0, 1.0), rand_engine, ref); - } - - void set_up_apply_data() - { - mtx2 = Mtx::create(ref); - mtx2->copy_from(gen_mtx(mtx_size[0], mtx_size[1], 5)); - dmtx2 = Mtx::create(hip); - dmtx2->copy_from(mtx2.get()); - } - - void set_up_apply_data(std::shared_ptr strategy, - int num_vectors = 1) - { - mtx = Mtx::create(ref, strategy); - mtx->copy_from(gen_mtx(mtx_size[0], mtx_size[1], 1)); - square_mtx = Mtx::create(ref, strategy); - square_mtx->copy_from(gen_mtx(mtx_size[0], mtx_size[0], 1)); - expected = gen_mtx(mtx_size[0], num_vectors, 1); - y = gen_mtx(mtx_size[1], num_vectors, 1); - alpha = gko::initialize({2.0}, ref); - beta = gko::initialize({-1.0}, ref); - dmtx = Mtx::create(hip, strategy); - dmtx->copy_from(mtx.get()); - square_dmtx = Mtx::create(hip, strategy); - square_dmtx->copy_from(square_mtx.get()); - dresult = gko::clone(hip, expected); - dy = gko::clone(hip, y); - dalpha = gko::clone(hip, alpha); - dbeta = gko::clone(hip, beta); - - std::vector tmp(mtx->get_size()[0], 0); - auto rng = std::default_random_engine{}; - std::iota(tmp.begin(), tmp.end(), 0); - std::shuffle(tmp.begin(), tmp.end(), rng); - std::vector tmp2(mtx->get_size()[1], 0); - std::iota(tmp2.begin(), tmp2.end(), 0); - std::shuffle(tmp2.begin(), tmp2.end(), rng); - rpermute_idxs = std::make_unique(ref, tmp.begin(), tmp.end()); - cpermute_idxs = std::make_unique(ref, tmp2.begin(), tmp2.end()); - } - - void set_up_apply_complex_data( - std::shared_ptr strategy) - { - complex_mtx = ComplexMtx::create(ref, strategy); - complex_mtx->copy_from( - gen_mtx(mtx_size[0], mtx_size[1], 1)); - complex_dmtx = ComplexMtx::create(hip, strategy); - complex_dmtx->copy_from(complex_mtx.get()); - } - - void unsort_mtx() - { - gko::test::unsort_matrix(mtx.get(), rand_engine); - dmtx->copy_from(mtx.get()); - } - - std::shared_ptr ref; - std::shared_ptr hip; - - const gko::dim<2> mtx_size; - std::default_random_engine rand_engine; - - std::unique_ptr mtx; - std::unique_ptr mtx2; - std::unique_ptr complex_mtx; - std::unique_ptr square_mtx; - std::unique_ptr expected; - std::unique_ptr y; - std::unique_ptr alpha; - std::unique_ptr beta; - - std::unique_ptr dmtx; - std::unique_ptr dmtx2; - std::unique_ptr complex_dmtx; - std::unique_ptr square_dmtx; - std::unique_ptr dresult; - std::unique_ptr dy; - std::unique_ptr dalpha; - std::unique_ptr dbeta; - std::unique_ptr rpermute_idxs; - std::unique_ptr cpermute_idxs; -}; - - -TEST_F(Csr, StrategyAfterCopyIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - - ASSERT_EQ(mtx->get_strategy()->get_name(), - dmtx->get_strategy()->get_name()); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithLoadBalance) -{ - set_up_apply_data(std::make_shared(hip)); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithLoadBalanceUnsorted) -{ - set_up_apply_data(std::make_shared(hip)); - unsort_mtx(); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithLoadBalance) -{ - set_up_apply_data(std::make_shared(hip)); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithHipsparse) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithHipsparseUnsorted) -{ - set_up_apply_data(std::make_shared()); - unsort_mtx(); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithHipsparse) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithMergePath) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithMergePathUnsorted) -{ - set_up_apply_data(std::make_shared()); - unsort_mtx(); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithMergePath) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithClassical) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithClassicalUnsorted) -{ - set_up_apply_data(std::make_shared()); - unsort_mtx(); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithClassical) -{ - set_up_apply_data(std::make_shared()); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithAutomatical) -{ - set_up_apply_data(std::make_shared(hip)); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithAutomaticalUnsorted) -{ - set_up_apply_data(std::make_shared(hip)); - unsort_mtx(); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithLoadBalance) -{ - set_up_apply_data(std::make_shared(hip), 3); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithLoadBalance) -{ - set_up_apply_data(std::make_shared(hip), 3); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithClassical) -{ - set_up_apply_data(std::make_shared(), 3); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithClassical) -{ - set_up_apply_data(std::make_shared(), 3); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithMergePath) -{ - set_up_apply_data(std::make_shared(), 3); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithMergePath) -{ - set_up_apply_data(std::make_shared(), 3); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToCsrMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - auto trans = mtx->transpose(); - auto d_trans = dmtx->transpose(); - - mtx->apply(alpha.get(), trans.get(), beta.get(), square_mtx.get()); - dmtx->apply(dalpha.get(), d_trans.get(), dbeta.get(), square_dmtx.get()); - - GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); - GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); - ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); -} - - -TEST_F(Csr, SimpleApplyToCsrMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - auto trans = mtx->transpose(); - auto d_trans = dmtx->transpose(); - - mtx->apply(trans.get(), square_mtx.get()); - dmtx->apply(d_trans.get(), square_dmtx.get()); - - GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); - GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); - ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); -} - - -TEST_F(Csr, AdvancedApplyToIdentityMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - auto a = gen_mtx(mtx_size[0], mtx_size[1], 0); - auto b = gen_mtx(mtx_size[0], mtx_size[1], 0); - auto da = gko::clone(hip, a); - auto db = gko::clone(hip, b); - auto id = gko::matrix::Identity::create(ref, mtx_size[1]); - auto did = gko::matrix::Identity::create(hip, mtx_size[1]); - - a->apply(alpha.get(), id.get(), beta.get(), b.get()); - da->apply(dalpha.get(), did.get(), dbeta.get(), db.get()); - - GKO_ASSERT_MTX_NEAR(b, db, 1e-14); - GKO_ASSERT_MTX_EQ_SPARSITY(b, db); - ASSERT_TRUE(db->is_sorted_by_column_index()); -} - - -TEST_F(Csr, ApplyToComplexIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - auto complex_b = gen_mtx(this->mtx_size[1], 3, 1); - auto dcomplex_b = gko::clone(hip, complex_b); - auto complex_x = gen_mtx(this->mtx_size[0], 3, 1); - auto dcomplex_x = gko::clone(hip, complex_x); - - mtx->apply(complex_b.get(), complex_x.get()); - dmtx->apply(dcomplex_b.get(), dcomplex_x.get()); - - GKO_ASSERT_MTX_NEAR(dcomplex_x, complex_x, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToComplexIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - auto complex_b = gen_mtx(this->mtx_size[1], 3, 1); - auto dcomplex_b = gko::clone(hip, complex_b); - auto complex_x = gen_mtx(this->mtx_size[0], 3, 1); - auto dcomplex_x = gko::clone(hip, complex_x); - - mtx->apply(alpha.get(), complex_b.get(), beta.get(), complex_x.get()); - dmtx->apply(dalpha.get(), dcomplex_b.get(), dbeta.get(), dcomplex_x.get()); - - GKO_ASSERT_MTX_NEAR(dcomplex_x, complex_x, 1e-14); -} - - -TEST_F(Csr, TransposeIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - - auto trans = gko::as(mtx->transpose()); - auto d_trans = gko::as(dmtx->transpose()); - - GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); - ASSERT_TRUE(d_trans->is_sorted_by_column_index()); -} - - -TEST_F(Csr, Transpose64IsEquivalentToRef) -{ - using Mtx64 = gko::matrix::Csr; - auto mtx = gen_mtx(123, 234, 0); - auto dmtx = gko::clone(hip, mtx); - - auto trans = gko::as(mtx->transpose()); - auto d_trans = gko::as(dmtx->transpose()); - - GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); - ASSERT_TRUE(d_trans->is_sorted_by_column_index()); -} - - -TEST_F(Csr, ConjugateTransposeIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - - auto trans = gko::as(mtx->conj_transpose()); - auto d_trans = gko::as(dmtx->conj_transpose()); - - GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); - ASSERT_TRUE(d_trans->is_sorted_by_column_index()); -} - - -TEST_F(Csr, ConjugateTranspose64IsEquivalentToRef) -{ - using Mtx64 = gko::matrix::Csr; - auto mtx = gen_mtx(123, 234, 0); - auto dmtx = gko::clone(hip, mtx); - - auto trans = gko::as(mtx->transpose()); - auto d_trans = gko::as(dmtx->transpose()); - - GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); - ASSERT_TRUE(d_trans->is_sorted_by_column_index()); -} - - -TEST_F(Csr, ConvertToDenseIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto dense_mtx = gko::matrix::Dense<>::create(ref); - auto ddense_mtx = gko::matrix::Dense<>::create(hip); - - mtx->convert_to(dense_mtx.get()); - dmtx->convert_to(ddense_mtx.get()); - - GKO_ASSERT_MTX_NEAR(dense_mtx.get(), ddense_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToDenseIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto dense_mtx = gko::matrix::Dense<>::create(ref); - auto ddense_mtx = gko::matrix::Dense<>::create(hip); - - mtx->move_to(dense_mtx.get()); - dmtx->move_to(ddense_mtx.get()); - - GKO_ASSERT_MTX_NEAR(dense_mtx.get(), ddense_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToEllIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto ell_mtx = gko::matrix::Ell<>::create(ref); - auto dell_mtx = gko::matrix::Ell<>::create(hip); - - mtx->convert_to(ell_mtx.get()); - dmtx->convert_to(dell_mtx.get()); - - GKO_ASSERT_MTX_NEAR(ell_mtx.get(), dell_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToEllIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto ell_mtx = gko::matrix::Ell<>::create(ref); - auto dell_mtx = gko::matrix::Ell<>::create(hip); - - mtx->move_to(ell_mtx.get()); - dmtx->move_to(dell_mtx.get()); - - GKO_ASSERT_MTX_NEAR(ell_mtx.get(), dell_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToSparsityCsrIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto sparsity_mtx = gko::matrix::SparsityCsr<>::create(ref); - auto d_sparsity_mtx = gko::matrix::SparsityCsr<>::create(hip); - - mtx->convert_to(sparsity_mtx.get()); - dmtx->convert_to(d_sparsity_mtx.get()); - - GKO_ASSERT_MTX_NEAR(sparsity_mtx.get(), d_sparsity_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToSparsityCsrIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto sparsity_mtx = gko::matrix::SparsityCsr<>::create(ref); - auto d_sparsity_mtx = gko::matrix::SparsityCsr<>::create(hip); - - mtx->move_to(sparsity_mtx.get()); - dmtx->move_to(d_sparsity_mtx.get()); - - GKO_ASSERT_MTX_NEAR(sparsity_mtx.get(), d_sparsity_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToCooIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto coo_mtx = gko::matrix::Coo<>::create(ref); - auto dcoo_mtx = gko::matrix::Coo<>::create(hip); - - mtx->convert_to(coo_mtx.get()); - dmtx->convert_to(dcoo_mtx.get()); - - GKO_ASSERT_MTX_NEAR(coo_mtx.get(), dcoo_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToCooIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto coo_mtx = gko::matrix::Coo<>::create(ref); - auto dcoo_mtx = gko::matrix::Coo<>::create(hip); - - mtx->move_to(coo_mtx.get()); - dmtx->move_to(dcoo_mtx.get()); - - GKO_ASSERT_MTX_NEAR(coo_mtx.get(), dcoo_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToSellpIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto sellp_mtx = gko::matrix::Sellp<>::create(ref); - auto dsellp_mtx = gko::matrix::Sellp<>::create(hip); - - mtx->convert_to(sellp_mtx.get()); - dmtx->convert_to(dsellp_mtx.get()); - - GKO_ASSERT_MTX_NEAR(sellp_mtx.get(), dsellp_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToSellpIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - auto sellp_mtx = gko::matrix::Sellp<>::create(ref); - auto dsellp_mtx = gko::matrix::Sellp<>::create(hip); - - mtx->move_to(sellp_mtx.get()); - dmtx->move_to(dsellp_mtx.get()); - - GKO_ASSERT_MTX_NEAR(sellp_mtx.get(), dsellp_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertsEmptyToSellp) -{ - auto dempty_mtx = Mtx::create(hip); - auto dsellp_mtx = gko::matrix::Sellp<>::create(hip); - - dempty_mtx->convert_to(dsellp_mtx.get()); - - ASSERT_EQ(hip->copy_val_to_host(dsellp_mtx->get_const_slice_sets()), 0); - ASSERT_FALSE(dsellp_mtx->get_size()); -} - - -TEST_F(Csr, ConvertToHybridIsEquivalentToRef) -{ - using Hybrid_type = gko::matrix::Hybrid<>; - set_up_apply_data(std::make_shared()); - auto hybrid_mtx = Hybrid_type::create( - ref, std::make_shared(2)); - auto dhybrid_mtx = Hybrid_type::create( - hip, std::make_shared(2)); - - mtx->convert_to(hybrid_mtx.get()); - dmtx->convert_to(dhybrid_mtx.get()); - - GKO_ASSERT_MTX_NEAR(hybrid_mtx.get(), dhybrid_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToHybridIsEquivalentToRef) -{ - using Hybrid_type = gko::matrix::Hybrid<>; - set_up_apply_data(std::make_shared()); - auto hybrid_mtx = Hybrid_type::create( - ref, std::make_shared(2)); - auto dhybrid_mtx = Hybrid_type::create( - hip, std::make_shared(2)); - - mtx->move_to(hybrid_mtx.get()); - dmtx->move_to(dhybrid_mtx.get()); - - GKO_ASSERT_MTX_NEAR(hybrid_mtx.get(), dhybrid_mtx.get(), 0); -} - - -TEST_F(Csr, IsPermutable) -{ - set_up_apply_data(std::make_shared()); - - auto permuted = gko::as(square_mtx->permute(rpermute_idxs.get())); - auto dpermuted = gko::as(square_dmtx->permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(permuted, dpermuted); - GKO_ASSERT_MTX_NEAR(permuted, dpermuted, 0); -} - - -TEST_F(Csr, IsInversePermutable) -{ - set_up_apply_data(std::make_shared()); - - auto permuted = - gko::as(square_mtx->inverse_permute(rpermute_idxs.get())); - auto dpermuted = - gko::as(square_dmtx->inverse_permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(permuted, dpermuted); - GKO_ASSERT_MTX_NEAR(permuted, dpermuted, 0); -} - - -TEST_F(Csr, IsRowPermutable) -{ - set_up_apply_data(std::make_shared()); - - auto r_permute = gko::as(mtx->row_permute(rpermute_idxs.get())); - auto dr_permute = gko::as(dmtx->row_permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(r_permute, dr_permute); - GKO_ASSERT_MTX_NEAR(r_permute, dr_permute, 0); -} - - -TEST_F(Csr, IsColPermutable) -{ - set_up_apply_data(std::make_shared()); - - auto c_permute = gko::as(mtx->column_permute(cpermute_idxs.get())); - auto dc_permute = gko::as(dmtx->column_permute(cpermute_idxs.get())); - - ASSERT_TRUE(dc_permute->is_sorted_by_column_index()); - GKO_ASSERT_MTX_EQ_SPARSITY(c_permute, dc_permute); - GKO_ASSERT_MTX_NEAR(c_permute, dc_permute, 0); -} - - -TEST_F(Csr, IsInverseRowPermutable) -{ - set_up_apply_data(std::make_shared()); - - auto inverse_r_permute = - gko::as(mtx->inverse_row_permute(rpermute_idxs.get())); - auto d_inverse_r_permute = - gko::as(dmtx->inverse_row_permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(inverse_r_permute, d_inverse_r_permute); - GKO_ASSERT_MTX_NEAR(inverse_r_permute, d_inverse_r_permute, 0); -} - - -TEST_F(Csr, IsInverseColPermutable) -{ - set_up_apply_data(std::make_shared()); - - auto inverse_c_permute = - gko::as(mtx->inverse_column_permute(cpermute_idxs.get())); - auto d_inverse_c_permute = - gko::as(dmtx->inverse_column_permute(cpermute_idxs.get())); - - ASSERT_TRUE(d_inverse_c_permute->is_sorted_by_column_index()); - GKO_ASSERT_MTX_EQ_SPARSITY(inverse_c_permute, d_inverse_c_permute); - GKO_ASSERT_MTX_NEAR(inverse_c_permute, d_inverse_c_permute, 0); -} - - -TEST_F(Csr, RecognizeSortedMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - bool is_sorted_hip{}; - bool is_sorted_ref{}; - - is_sorted_ref = mtx->is_sorted_by_column_index(); - is_sorted_hip = dmtx->is_sorted_by_column_index(); - - ASSERT_EQ(is_sorted_ref, is_sorted_hip); -} - - -TEST_F(Csr, RecognizeUnsortedMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - unsort_mtx(); - bool is_sorted_hip{}; - bool is_sorted_ref{}; - - is_sorted_ref = mtx->is_sorted_by_column_index(); - is_sorted_hip = dmtx->is_sorted_by_column_index(); - - ASSERT_EQ(is_sorted_ref, is_sorted_hip); -} - - -TEST_F(Csr, SortSortedMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - - mtx->sort_by_column_index(); - dmtx->sort_by_column_index(); - - // Values must be unchanged, therefore, tolerance is `0` - GKO_ASSERT_MTX_NEAR(mtx, dmtx, 0); -} - - -TEST_F(Csr, SortUnsortedMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared()); - unsort_mtx(); - - mtx->sort_by_column_index(); - dmtx->sort_by_column_index(); - - // Values must be unchanged, therefore, tolerance is `0` - GKO_ASSERT_MTX_NEAR(mtx, dmtx, 0); -} - - -TEST_F(Csr, OneAutomaticalWorksWithDifferentMatrices) -{ - auto automatical = std::make_shared(hip); - auto row_len_limit = std::max(automatical->nvidia_row_len_limit, - automatical->amd_row_len_limit); - auto load_balance_mtx = - gen_mtx(1, row_len_limit + 1000, row_len_limit + 1); - auto classical_mtx = gen_mtx(50, 50, 1); - auto load_balance_mtx_d = gko::clone(hip, load_balance_mtx); - auto classical_mtx_d = gko::clone(hip, classical_mtx); - - load_balance_mtx_d->set_strategy(automatical); - classical_mtx_d->set_strategy(automatical); - - EXPECT_EQ("load_balance", load_balance_mtx_d->get_strategy()->get_name()); - EXPECT_EQ("classical", classical_mtx_d->get_strategy()->get_name()); - ASSERT_NE(load_balance_mtx_d->get_strategy().get(), - classical_mtx_d->get_strategy().get()); -} - - -TEST_F(Csr, ExtractDiagonalIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - - auto diag = mtx->extract_diagonal(); - auto ddiag = dmtx->extract_diagonal(); - - GKO_ASSERT_MTX_NEAR(diag.get(), ddiag.get(), 0); -} - - -TEST_F(Csr, InplaceAbsoluteMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - - mtx->compute_absolute_inplace(); - dmtx->compute_absolute_inplace(); - - GKO_ASSERT_MTX_NEAR(mtx, dmtx, 1e-14); -} - - -TEST_F(Csr, OutplaceAbsoluteMatrixIsEquivalentToRef) -{ - set_up_apply_data(std::make_shared(hip)); - - auto abs_mtx = mtx->compute_absolute(); - auto dabs_mtx = dmtx->compute_absolute(); - - GKO_ASSERT_MTX_NEAR(abs_mtx, dabs_mtx, 1e-14); -} - - -TEST_F(Csr, InplaceAbsoluteComplexMatrixIsEquivalentToRef) -{ - set_up_apply_complex_data(std::make_shared(hip)); - - complex_mtx->compute_absolute_inplace(); - complex_dmtx->compute_absolute_inplace(); - - GKO_ASSERT_MTX_NEAR(complex_mtx, complex_dmtx, 1e-14); -} - - -TEST_F(Csr, OutplaceAbsoluteComplexMatrixIsEquivalentToRef) -{ - set_up_apply_complex_data(std::make_shared(hip)); - - auto abs_mtx = complex_mtx->compute_absolute(); - auto dabs_mtx = complex_dmtx->compute_absolute(); - - GKO_ASSERT_MTX_NEAR(abs_mtx, dabs_mtx, 1e-14); -} - - -TEST_F(Csr, CalculateNnzPerRowInSpanIsEquivalentToRef) -{ - using Mtx = gko::matrix::Csr<>; - set_up_apply_data(); - gko::span rspan{7, 51}; - gko::span cspan{22, 88}; - auto size = this->mtx2->get_size(); - auto row_nnz = gko::array(this->ref, rspan.length() + 1); - auto drow_nnz = gko::array(this->hip, row_nnz); - - gko::kernels::reference::csr::calculate_nonzeros_per_row_in_span( - this->ref, this->mtx2.get(), rspan, cspan, &row_nnz); - gko::kernels::hip::csr::calculate_nonzeros_per_row_in_span( - this->hip, this->dmtx2.get(), rspan, cspan, &drow_nnz); - - GKO_ASSERT_ARRAY_EQ(row_nnz, drow_nnz); -} - - -TEST_F(Csr, ComputeSubmatrixIsEquivalentToRef) -{ - using Mtx = gko::matrix::Csr<>; - using IndexType = int; - using ValueType = double; - set_up_apply_data(); - gko::span rspan{7, 51}; - gko::span cspan{22, 88}; - auto size = this->mtx2->get_size(); - auto row_nnz = gko::array(this->ref, rspan.length() + 1); - gko::kernels::reference::csr::calculate_nonzeros_per_row_in_span( - this->ref, this->mtx2.get(), rspan, cspan, &row_nnz); - gko::kernels::reference::components::prefix_sum( - this->ref, row_nnz.get_data(), row_nnz.get_num_elems()); - auto num_nnz = row_nnz.get_data()[rspan.length()]; - auto drow_nnz = gko::array(this->hip, row_nnz); - auto smat1 = - Mtx::create(this->ref, gko::dim<2>(rspan.length(), cspan.length()), - std::move(gko::array(this->ref, num_nnz)), - std::move(gko::array(this->ref, num_nnz)), - std::move(row_nnz)); - auto sdmat1 = - Mtx::create(this->hip, gko::dim<2>(rspan.length(), cspan.length()), - std::move(gko::array(this->hip, num_nnz)), - std::move(gko::array(this->hip, num_nnz)), - std::move(drow_nnz)); - - - gko::kernels::reference::csr::compute_submatrix(this->ref, this->mtx2.get(), - rspan, cspan, smat1.get()); - gko::kernels::hip::csr::compute_submatrix(this->hip, this->dmtx2.get(), - rspan, cspan, sdmat1.get()); - - GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); -} - - -TEST_F(Csr, CreateSubMatrixIsEquivalentToRef) -{ - using Mtx = gko::matrix::Csr<>; - set_up_apply_data(); - gko::span rspan{47, 81}; - gko::span cspan{2, 31}; - - auto smat1 = this->mtx2->create_submatrix(rspan, cspan); - auto sdmat1 = this->dmtx2->create_submatrix(rspan, cspan); - - GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); -} - - -TEST_F(Csr, CanDetectMissingDiagonalEntry) -{ - using T = double; - using Csr = Mtx; - auto ref_mtx = gen_mtx(103, 98, 10); - const auto rowptrs = ref_mtx->get_row_ptrs(); - const auto colidxs = ref_mtx->get_col_idxs(); - const int testrow = 15; - gko::utils::remove_diagonal_entry_from_row(ref_mtx.get(), testrow); - auto mtx = gko::clone(hip, ref_mtx); - bool has_diags = true; - - gko::kernels::hip::csr::check_diagonal_entries_exist(hip, mtx.get(), - has_diags); - - ASSERT_FALSE(has_diags); -} - - -TEST_F(Csr, CanDetectWhenAllDiagonalEntriesArePresent) -{ - using T = double; - using Csr = Mtx; - auto ref_mtx = gen_mtx(103, 98, 10); - gko::utils::ensure_all_diagonal_entries(ref_mtx.get()); - auto mtx = gko::clone(hip, ref_mtx); - bool has_diags = false; - - gko::kernels::hip::csr::check_diagonal_entries_exist(hip, mtx.get(), - has_diags); - - ASSERT_TRUE(has_diags); -} - - -TEST_F(Csr, AddScaledIdentityToNonSquare) -{ - set_up_apply_data(std::make_shared()); - gko::utils::ensure_all_diagonal_entries(mtx.get()); - dmtx->copy_from(mtx.get()); - - mtx->add_scaled_identity(alpha.get(), beta.get()); - dmtx->add_scaled_identity(dalpha.get(), dbeta.get()); - - GKO_ASSERT_MTX_NEAR(mtx, dmtx, r::value); -} - - -} // namespace diff --git a/omp/test/matrix/CMakeLists.txt b/omp/test/matrix/CMakeLists.txt index a2ad1935447..88ab52e9c3f 100644 --- a/omp/test/matrix/CMakeLists.txt +++ b/omp/test/matrix/CMakeLists.txt @@ -1,2 +1 @@ -ginkgo_create_test(csr_kernels) ginkgo_create_test(fbcsr_kernels) diff --git a/omp/test/matrix/csr_kernels.cpp b/omp/test/matrix/csr_kernels.cpp deleted file mode 100644 index 521a923e55d..00000000000 --- a/omp/test/matrix/csr_kernels.cpp +++ /dev/null @@ -1,906 +0,0 @@ -/************************************************************* -Copyright (c) 2017-2022, the Ginkgo authors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*************************************************************/ - -#include - - -#include -#include -#include -#include - - -#include - - -#include -#include -#include -#include -#include -#include -#include - - -#include "core/components/prefix_sum_kernels.hpp" -#include "core/matrix/csr_kernels.hpp" -#include "core/matrix/csr_lookup.hpp" -#include "core/test/utils.hpp" -#include "core/test/utils/unsort_matrix.hpp" -#include "core/utils/matrix_utils.hpp" - - -namespace { - - -class Csr : public ::testing::Test { -protected: - using Arr = gko::array; - using Mtx = gko::matrix::Csr<>; - using Vec = gko::matrix::Dense<>; - using ComplexVec = gko::matrix::Dense>; - using ComplexMtx = gko::matrix::Csr>; - - Csr() -#ifdef GINKGO_FAST_TESTS - : mtx_size(152, 185), -#else - : mtx_size(532, 231), -#endif - rand_engine(42) - {} - - void SetUp() - { - ref = gko::ReferenceExecutor::create(); - omp = gko::OmpExecutor::create(); - } - - void TearDown() - { - if (omp != nullptr) { - ASSERT_NO_THROW(omp->synchronize()); - } - } - - template - std::unique_ptr gen_mtx(int num_rows, int num_cols, - int min_nnz_row, int max_nnz_row) - { - return gko::test::generate_random_matrix( - num_rows, num_cols, - std::uniform_int_distribution<>(min_nnz_row, max_nnz_row), - std::normal_distribution<>(-1.0, 1.0), rand_engine, ref); - } - - template - std::unique_ptr gen_mtx(int num_rows, int num_cols, - int min_nnz_row) - { - return gen_mtx(num_rows, num_cols, min_nnz_row, num_cols); - } - - void set_up_mat_data() - { - mtx2 = Mtx::create(ref); - mtx2->copy_from(gen_mtx(mtx_size[0], mtx_size[1], 5)); - dmtx2 = Mtx::create(omp); - dmtx2->copy_from(mtx2.get()); - } - - void set_up_apply_data(int num_vectors = 1) - { - mtx = gen_mtx(mtx_size[0], mtx_size[1], 1); - complex_mtx = gen_mtx(mtx_size[0], mtx_size[1], 1); - square_mtx = gen_mtx(mtx_size[0], mtx_size[0], 1); - expected = gen_mtx(mtx_size[0], num_vectors, 1); - y = gen_mtx(mtx_size[1], num_vectors, 1); - alpha = gko::initialize({2.0}, ref); - beta = gko::initialize({-1.0}, ref); - dmtx = gko::clone(omp, mtx); - complex_dmtx = gko::clone(omp, complex_mtx); - square_dmtx = gko::clone(omp, square_mtx); - dresult = gko::clone(omp, expected); - dy = gko::clone(omp, y); - dalpha = gko::clone(omp, alpha); - dbeta = gko::clone(omp, beta); - - std::vector tmp(mtx->get_size()[0], 0); - auto rng = std::default_random_engine{}; - std::iota(tmp.begin(), tmp.end(), 0); - std::shuffle(tmp.begin(), tmp.end(), rng); - std::vector tmp2(mtx->get_size()[1], 0); - std::iota(tmp2.begin(), tmp2.end(), 0); - std::shuffle(tmp2.begin(), tmp2.end(), rng); - rpermute_idxs = std::make_unique(ref, tmp.begin(), tmp.end()); - cpermute_idxs = std::make_unique(ref, tmp2.begin(), tmp2.end()); - } - - struct matrix_pair { - std::unique_ptr ref; - std::unique_ptr omp; - }; - - matrix_pair gen_unsorted_mtx() - { - constexpr int min_nnz_per_row{2}; - auto local_mtx_ref = - gen_mtx(mtx_size[0], mtx_size[1], min_nnz_per_row); - gko::test::unsort_matrix(gko::lend(local_mtx_ref), rand_engine); - - auto local_mtx_omp = gko::clone(omp, local_mtx_ref); - - return {std::move(local_mtx_ref), std::move(local_mtx_omp)}; - } - - std::shared_ptr ref; - std::shared_ptr omp; - - const gko::dim<2> mtx_size; - std::default_random_engine rand_engine; - - std::unique_ptr mtx; - std::unique_ptr mtx2; - std::unique_ptr complex_mtx; - std::unique_ptr square_mtx; - std::unique_ptr expected; - std::unique_ptr y; - std::unique_ptr alpha; - std::unique_ptr beta; - - std::unique_ptr dmtx; - std::unique_ptr dmtx2; - std::unique_ptr complex_dmtx; - std::unique_ptr square_dmtx; - std::unique_ptr dresult; - std::unique_ptr dy; - std::unique_ptr dalpha; - std::unique_ptr dbeta; - std::unique_ptr rpermute_idxs; - std::unique_ptr cpermute_idxs; -}; - - -TEST_F(Csr, SimpleApplyIsEquivalentToRef) -{ - set_up_apply_data(); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyIsEquivalentToRef) -{ - set_up_apply_data(); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRef) -{ - set_up_apply_data(3); - - mtx->apply(y.get(), expected.get()); - dmtx->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefUnsorted) -{ - set_up_apply_data(3); - auto pair = gen_unsorted_mtx(); - - pair.ref->apply(y.get(), expected.get()); - pair.omp->apply(dy.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToCsrMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - auto trans = mtx->transpose(); - auto d_trans = dmtx->transpose(); - - mtx->apply(alpha.get(), trans.get(), beta.get(), square_mtx.get()); - dmtx->apply(dalpha.get(), d_trans.get(), dbeta.get(), square_dmtx.get()); - - GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); - GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); - ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); -} - - -TEST_F(Csr, SimpleApplyToCsrMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - auto trans = mtx->transpose(); - auto d_trans = dmtx->transpose(); - - mtx->apply(trans.get(), square_mtx.get()); - dmtx->apply(d_trans.get(), square_dmtx.get()); - - GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); - GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); - ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); -} - - -TEST_F(Csr, SimpleApplyToSparseCsrMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - auto mtx2 = - gen_mtx(mtx->get_size()[1], square_mtx->get_size()[1], 0, 10); - auto dmtx2 = Mtx::create(omp, mtx2->get_size()); - dmtx2->copy_from(mtx2.get()); - - mtx->apply(mtx2.get(), square_mtx.get()); - dmtx->apply(dmtx2.get(), square_dmtx.get()); - - GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); - GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); - ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); -} - - -TEST_F(Csr, SimpleApplySparseToSparseCsrMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - auto mtx1 = gen_mtx(mtx->get_size()[0], mtx->get_size()[1], 0, 10); - auto mtx2 = - gen_mtx(mtx->get_size()[1], square_mtx->get_size()[1], 0, 10); - auto dmtx1 = Mtx::create(omp, mtx1->get_size()); - auto dmtx2 = Mtx::create(omp, mtx2->get_size()); - dmtx1->copy_from(mtx1.get()); - dmtx2->copy_from(mtx2.get()); - - mtx1->apply(mtx2.get(), square_mtx.get()); - dmtx1->apply(dmtx2.get(), square_dmtx.get()); - - GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); - GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); - ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); -} - - -TEST_F(Csr, SimpleApplyToEmptyCsrMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - auto mtx2 = - gen_mtx(mtx->get_size()[1], square_mtx->get_size()[1], 0, 0); - auto dmtx2 = Mtx::create(omp, mtx2->get_size()); - dmtx2->copy_from(mtx2.get()); - - mtx->apply(mtx2.get(), square_mtx.get()); - dmtx->apply(dmtx2.get(), square_dmtx.get()); - - GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); - GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); - ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); -} - - -TEST_F(Csr, AdvancedApplyToIdentityMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - auto a = gen_mtx(mtx_size[0], mtx_size[1], 0); - auto b = gen_mtx(mtx_size[0], mtx_size[1], 0); - auto da = gko::clone(omp, a); - auto db = gko::clone(omp, b); - auto id = gko::matrix::Identity::create(ref, mtx_size[1]); - auto did = gko::matrix::Identity::create(omp, mtx_size[1]); - - a->apply(alpha.get(), id.get(), beta.get(), b.get()); - da->apply(dalpha.get(), did.get(), dbeta.get(), db.get()); - - GKO_ASSERT_MTX_NEAR(b, db, 1e-14); - GKO_ASSERT_MTX_EQ_SPARSITY(b, db); - ASSERT_TRUE(db->is_sorted_by_column_index()); -} - - -TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRef) -{ - set_up_apply_data(3); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, 1e-14); -} - - -TEST_F(Csr, ApplyToComplexIsEquivalentToRef) -{ - set_up_apply_data(3); - auto complex_b = gen_mtx(this->mtx_size[1], 3, 1); - auto dcomplex_b = gko::clone(omp, complex_b); - auto complex_x = gen_mtx(this->mtx_size[0], 3, 1); - auto dcomplex_x = gko::clone(omp, complex_x); - - mtx->apply(complex_b.get(), complex_x.get()); - dmtx->apply(dcomplex_b.get(), dcomplex_x.get()); - - GKO_ASSERT_MTX_NEAR(dcomplex_x, complex_x, 1e-14); -} - - -TEST_F(Csr, AdvancedApplyToComplexIsEquivalentToRef) -{ - set_up_apply_data(3); - auto complex_b = gen_mtx(this->mtx_size[1], 3, 1); - auto dcomplex_b = gko::clone(omp, complex_b); - auto complex_x = gen_mtx(this->mtx_size[0], 3, 1); - auto dcomplex_x = gko::clone(omp, complex_x); - - mtx->apply(alpha.get(), complex_b.get(), beta.get(), complex_x.get()); - dmtx->apply(dalpha.get(), dcomplex_b.get(), dbeta.get(), dcomplex_x.get()); - - GKO_ASSERT_MTX_NEAR(dcomplex_x, complex_x, 1e-14); -} - - -TEST_F(Csr, TransposeIsEquivalentToRef) -{ - set_up_apply_data(); - - auto trans = gko::as(mtx->transpose()); - auto d_trans = gko::as(dmtx->transpose()); - - GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); - ASSERT_TRUE(d_trans->is_sorted_by_column_index()); -} - - -TEST_F(Csr, ConjugateTransposeIsEquivalentToRef) -{ - set_up_apply_data(); - - auto trans = gko::as(complex_mtx->conj_transpose()); - auto d_trans = gko::as(complex_dmtx->conj_transpose()); - - GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); - ASSERT_TRUE(d_trans->is_sorted_by_column_index()); -} - - -TEST_F(Csr, ConvertToCooIsEquivalentToRef) -{ - set_up_apply_data(); - auto coo_mtx = gko::matrix::Coo<>::create(ref); - auto dcoo_mtx = gko::matrix::Coo<>::create(omp); - - mtx->convert_to(coo_mtx.get()); - dmtx->convert_to(dcoo_mtx.get()); - - GKO_ASSERT_MTX_NEAR(coo_mtx.get(), dcoo_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToCooIsEquivalentToRef) -{ - set_up_apply_data(); - auto coo_mtx = gko::matrix::Coo<>::create(ref); - auto dcoo_mtx = gko::matrix::Coo<>::create(omp); - - mtx->move_to(coo_mtx.get()); - dmtx->move_to(dcoo_mtx.get()); - - GKO_ASSERT_MTX_NEAR(coo_mtx.get(), dcoo_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToDenseIsEquivalentToRef) -{ - set_up_apply_data(); - auto dense_mtx = gko::matrix::Dense<>::create(ref); - auto ddense_mtx = gko::matrix::Dense<>::create(omp); - - mtx->convert_to(dense_mtx.get()); - dmtx->convert_to(ddense_mtx.get()); - - GKO_ASSERT_MTX_NEAR(ddense_mtx.get(), dense_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToDenseIsEquivalentToRef) -{ - set_up_apply_data(); - auto dense_mtx = gko::matrix::Dense<>::create(ref); - auto ddense_mtx = gko::matrix::Dense<>::create(omp); - - mtx->move_to(dense_mtx.get()); - dmtx->move_to(ddense_mtx.get()); - - GKO_ASSERT_MTX_NEAR(ddense_mtx.get(), dense_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToSparsityCsrIsEquivalentToRef) -{ - set_up_apply_data(); - auto sparsity_mtx = gko::matrix::SparsityCsr<>::create(ref); - auto d_sparsity_mtx = gko::matrix::SparsityCsr<>::create(omp); - - mtx->convert_to(sparsity_mtx.get()); - dmtx->convert_to(d_sparsity_mtx.get()); - - GKO_ASSERT_MTX_NEAR(d_sparsity_mtx.get(), sparsity_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToSparsityCsrIsEquivalentToRef) -{ - set_up_apply_data(); - auto sparsity_mtx = gko::matrix::SparsityCsr<>::create(ref); - auto d_sparsity_mtx = gko::matrix::SparsityCsr<>::create(omp); - - mtx->move_to(sparsity_mtx.get()); - dmtx->move_to(d_sparsity_mtx.get()); - - GKO_ASSERT_MTX_NEAR(d_sparsity_mtx.get(), sparsity_mtx.get(), 0); -} - - -TEST_F(Csr, ConvertToHybridIsEquivalentToRef) -{ - using Hybrid_type = gko::matrix::Hybrid<>; - set_up_apply_data(); - auto hybrid_mtx = Hybrid_type::create( - ref, std::make_shared(2)); - auto dhybrid_mtx = Hybrid_type::create( - omp, std::make_shared(2)); - - mtx->convert_to(hybrid_mtx.get()); - dmtx->convert_to(dhybrid_mtx.get()); - - GKO_ASSERT_MTX_NEAR(hybrid_mtx.get(), dhybrid_mtx.get(), 0); -} - - -TEST_F(Csr, MoveToHybridIsEquivalentToRef) -{ - using Hybrid_type = gko::matrix::Hybrid<>; - set_up_apply_data(); - auto hybrid_mtx = Hybrid_type::create( - ref, std::make_shared(2)); - auto dhybrid_mtx = Hybrid_type::create( - omp, std::make_shared(2)); - - mtx->move_to(hybrid_mtx.get()); - dmtx->move_to(dhybrid_mtx.get()); - - GKO_ASSERT_MTX_NEAR(hybrid_mtx.get(), dhybrid_mtx.get(), 0); -} - - -TEST_F(Csr, IsPermutable) -{ - set_up_apply_data(); - - auto permuted = gko::as(square_mtx->permute(rpermute_idxs.get())); - auto dpermuted = gko::as(square_dmtx->permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(permuted, dpermuted); - GKO_ASSERT_MTX_NEAR(permuted, dpermuted, 0); -} - - -TEST_F(Csr, IsInversePermutable) -{ - set_up_apply_data(); - - auto permuted = - gko::as(square_mtx->inverse_permute(rpermute_idxs.get())); - auto dpermuted = - gko::as(square_dmtx->inverse_permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(permuted, dpermuted); - GKO_ASSERT_MTX_NEAR(permuted, dpermuted, 0); -} - - -TEST_F(Csr, IsRowPermutable) -{ - set_up_apply_data(); - - auto r_permute = gko::as(mtx->row_permute(rpermute_idxs.get())); - auto dr_permute = gko::as(dmtx->row_permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(r_permute, dr_permute); - GKO_ASSERT_MTX_NEAR(r_permute, dr_permute, 0); -} - - -TEST_F(Csr, IsColPermutable) -{ - set_up_apply_data(); - - auto c_permute = gko::as(mtx->column_permute(cpermute_idxs.get())); - auto dc_permute = gko::as(dmtx->column_permute(cpermute_idxs.get())); - - ASSERT_TRUE(dc_permute->is_sorted_by_column_index()); - GKO_ASSERT_MTX_EQ_SPARSITY(c_permute, dc_permute); - GKO_ASSERT_MTX_NEAR(c_permute, dc_permute, 0); -} - - -TEST_F(Csr, IsInverseRowPermutable) -{ - set_up_apply_data(); - - auto inverse_r_permute = - gko::as(mtx->inverse_row_permute(rpermute_idxs.get())); - auto d_inverse_r_permute = - gko::as(dmtx->inverse_row_permute(rpermute_idxs.get())); - - GKO_ASSERT_MTX_EQ_SPARSITY(inverse_r_permute, d_inverse_r_permute); - GKO_ASSERT_MTX_NEAR(inverse_r_permute, d_inverse_r_permute, 0); -} - - -TEST_F(Csr, IsInverseColPermutable) -{ - set_up_apply_data(); - - auto inverse_c_permute = - gko::as(mtx->inverse_column_permute(cpermute_idxs.get())); - auto d_inverse_c_permute = - gko::as(dmtx->inverse_column_permute(cpermute_idxs.get())); - - ASSERT_TRUE(d_inverse_c_permute->is_sorted_by_column_index()); - GKO_ASSERT_MTX_EQ_SPARSITY(inverse_c_permute, d_inverse_c_permute); - GKO_ASSERT_MTX_NEAR(inverse_c_permute, d_inverse_c_permute, 0); -} - - -TEST_F(Csr, RecognizeSortedMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - bool is_sorted_omp{}; - bool is_sorted_ref{}; - - is_sorted_ref = mtx->is_sorted_by_column_index(); - is_sorted_omp = dmtx->is_sorted_by_column_index(); - - ASSERT_EQ(is_sorted_ref, is_sorted_omp); -} - - -TEST_F(Csr, RecognizeUnsortedMatrixIsEquivalentToRef) -{ - auto uns_mtx = gen_unsorted_mtx(); - bool is_sorted_omp{}; - bool is_sorted_ref{}; - - is_sorted_ref = uns_mtx.ref->is_sorted_by_column_index(); - is_sorted_omp = uns_mtx.omp->is_sorted_by_column_index(); - - ASSERT_EQ(is_sorted_ref, is_sorted_omp); -} - - -TEST_F(Csr, SortSortedMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - - mtx->sort_by_column_index(); - dmtx->sort_by_column_index(); - - // Values must be unchanged, therefore, tolerance is `0` - GKO_ASSERT_MTX_NEAR(mtx, dmtx, 0); -} - - -TEST_F(Csr, SortUnsortedMatrixIsEquivalentToRef) -{ - auto uns_mtx = gen_unsorted_mtx(); - - uns_mtx.ref->sort_by_column_index(); - uns_mtx.omp->sort_by_column_index(); - - // Values must be unchanged, therefore, tolerance is `0` - GKO_ASSERT_MTX_NEAR(uns_mtx.ref, uns_mtx.omp, 0); -} - - -TEST_F(Csr, ExtractDiagonalIsEquivalentToRef) -{ - set_up_apply_data(); - - auto diag = mtx->extract_diagonal(); - auto ddiag = dmtx->extract_diagonal(); - - GKO_ASSERT_MTX_NEAR(diag.get(), ddiag.get(), 0); -} - - -TEST_F(Csr, InplaceAbsoluteMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - - mtx->compute_absolute_inplace(); - dmtx->compute_absolute_inplace(); - - GKO_ASSERT_MTX_NEAR(mtx, dmtx, 1e-14); -} - - -TEST_F(Csr, OutplaceAbsoluteMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - - auto abs_mtx = mtx->compute_absolute(); - auto dabs_mtx = dmtx->compute_absolute(); - - GKO_ASSERT_MTX_NEAR(abs_mtx, dabs_mtx, 1e-14); -} - - -TEST_F(Csr, InplaceAbsoluteComplexMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - - complex_mtx->compute_absolute_inplace(); - complex_dmtx->compute_absolute_inplace(); - - GKO_ASSERT_MTX_NEAR(complex_mtx, complex_dmtx, 1e-14); -} - - -TEST_F(Csr, OutplaceAbsoluteComplexMatrixIsEquivalentToRef) -{ - set_up_apply_data(); - - auto abs_mtx = complex_mtx->compute_absolute(); - auto dabs_mtx = complex_dmtx->compute_absolute(); - - GKO_ASSERT_MTX_NEAR(abs_mtx, dabs_mtx, 1e-14); -} - - -TEST_F(Csr, CalculateNnzPerRowInSpanIsEquivalentToRef) -{ - using Mtx = gko::matrix::Csr<>; - set_up_mat_data(); - gko::span rspan{7, 51}; - gko::span cspan{22, 88}; - auto size = this->mtx2->get_size(); - auto row_nnz = gko::array(this->ref, rspan.length() + 1); - row_nnz.fill(gko::zero()); - auto drow_nnz = gko::array(this->omp, row_nnz); - - gko::kernels::reference::csr::calculate_nonzeros_per_row_in_span( - this->ref, this->mtx2.get(), rspan, cspan, &row_nnz); - gko::kernels::omp::csr::calculate_nonzeros_per_row_in_span( - this->omp, this->dmtx2.get(), rspan, cspan, &drow_nnz); - - GKO_ASSERT_ARRAY_EQ(row_nnz, drow_nnz); -} - - -TEST_F(Csr, ComputeSubmatrixIsEquivalentToRef) -{ - using Mtx = gko::matrix::Csr<>; - using IndexType = int; - using ValueType = double; - set_up_mat_data(); - gko::span rspan{7, 51}; - gko::span cspan{22, 88}; - auto size = this->mtx2->get_size(); - auto row_nnz = gko::array(this->ref, rspan.length() + 1); - row_nnz.fill(gko::zero()); - gko::kernels::reference::csr::calculate_nonzeros_per_row_in_span( - this->ref, this->mtx2.get(), rspan, cspan, &row_nnz); - gko::kernels::reference::components::prefix_sum( - this->ref, row_nnz.get_data(), row_nnz.get_num_elems()); - auto num_nnz = row_nnz.get_data()[rspan.length()]; - auto drow_nnz = gko::array(this->omp, row_nnz); - auto smat1 = - Mtx::create(this->ref, gko::dim<2>(rspan.length(), cspan.length()), - std::move(gko::array(this->ref, num_nnz)), - std::move(gko::array(this->ref, num_nnz)), - std::move(row_nnz)); - auto sdmat1 = - Mtx::create(this->omp, gko::dim<2>(rspan.length(), cspan.length()), - std::move(gko::array(this->omp, num_nnz)), - std::move(gko::array(this->omp, num_nnz)), - std::move(drow_nnz)); - - - gko::kernels::reference::csr::compute_submatrix(this->ref, this->mtx2.get(), - rspan, cspan, smat1.get()); - gko::kernels::omp::csr::compute_submatrix(this->omp, this->dmtx2.get(), - rspan, cspan, sdmat1.get()); - - GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); -} - - -TEST_F(Csr, CalculateNnzPerRowInindex_setIsEquivalentToRef) -{ - using Mtx = gko::matrix::Csr<>; - using IndexType = int; - using ValueType = double; - set_up_mat_data(); - gko::index_set rset{ - this->ref, {42, 7, 8, 9, 10, 22, 25, 26, 34, 35, 36, 51}}; - gko::index_set cset{this->ref, - {42, 22, 24, 26, 28, 30, 81, 82, 83, 88}}; - gko::index_set drset(this->omp, rset); - gko::index_set dcset(this->omp, cset); - auto size = this->mtx2->get_size(); - auto row_nnz = gko::array(this->ref, rset.get_num_elems() + 1); - row_nnz.fill(gko::zero()); - auto drow_nnz = gko::array(this->omp, row_nnz); - - gko::kernels::reference::csr::calculate_nonzeros_per_row_in_index_set( - this->ref, this->mtx2.get(), rset, cset, row_nnz.get_data()); - gko::kernels::omp::csr::calculate_nonzeros_per_row_in_index_set( - this->omp, this->dmtx2.get(), drset, dcset, drow_nnz.get_data()); - - GKO_ASSERT_ARRAY_EQ(row_nnz, drow_nnz); -} - - -TEST_F(Csr, ComputeSubmatrixFromindex_setIsEquivalentToRef) -{ - using Mtx = gko::matrix::Csr<>; - using IndexType = int; - using ValueType = double; - set_up_mat_data(); - gko::index_set rset{ - this->ref, {42, 7, 8, 9, 10, 22, 25, 26, 34, 35, 36, 51}}; - gko::index_set cset{this->ref, - {42, 22, 24, 26, 28, 30, 81, 82, 83, 88}}; - gko::index_set drset(this->omp, rset); - gko::index_set dcset(this->omp, cset); - auto size = this->mtx2->get_size(); - auto row_nnz = gko::array(this->ref, rset.get_num_elems() + 1); - row_nnz.fill(gko::zero()); - gko::kernels::reference::csr::calculate_nonzeros_per_row_in_index_set( - this->ref, this->mtx2.get(), rset, cset, row_nnz.get_data()); - gko::kernels::reference::components::prefix_sum( - this->ref, row_nnz.get_data(), row_nnz.get_num_elems()); - auto num_nnz = row_nnz.get_data()[rset.get_num_elems()]; - auto drow_nnz = gko::array(this->omp, row_nnz); - auto smat1 = Mtx::create( - this->ref, gko::dim<2>(rset.get_num_elems(), cset.get_num_elems()), - std::move(gko::array(this->ref, num_nnz)), - std::move(gko::array(this->ref, num_nnz)), - std::move(row_nnz)); - auto sdmat1 = Mtx::create( - this->omp, gko::dim<2>(rset.get_num_elems(), cset.get_num_elems()), - std::move(gko::array(this->omp, num_nnz)), - std::move(gko::array(this->omp, num_nnz)), - std::move(drow_nnz)); - - gko::kernels::reference::csr::compute_submatrix_from_index_set( - this->ref, this->mtx2.get(), rset, cset, smat1.get()); - gko::kernels::omp::csr::compute_submatrix_from_index_set( - this->omp, this->dmtx2.get(), drset, dcset, sdmat1.get()); - - GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); -} - - -TEST_F(Csr, CreateSubMatrixIsEquivalentToRef) -{ - set_up_mat_data(); - - gko::span rspan{36, 98}; - gko::span cspan{26, 104}; - auto smat1 = this->mtx2->create_submatrix(rspan, cspan); - auto sdmat1 = this->dmtx2->create_submatrix(rspan, cspan); - - GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); -} - - -TEST_F(Csr, CanDetectMissingDiagonalEntry) -{ - using T = double; - using Csr = Mtx; - auto ref_mtx = gen_mtx(103, 98, 10); - const auto rowptrs = ref_mtx->get_row_ptrs(); - const auto colidxs = ref_mtx->get_col_idxs(); - const int testrow = 15; - gko::utils::remove_diagonal_entry_from_row(ref_mtx.get(), testrow); - auto mtx = gko::clone(omp, ref_mtx); - bool has_diags = true; - - gko::kernels::omp::csr::check_diagonal_entries_exist(omp, mtx.get(), - has_diags); - - ASSERT_FALSE(has_diags); -} - - -TEST_F(Csr, CanDetectWhenAllDiagonalEntriesArePresent) -{ - using T = double; - using Csr = Mtx; - auto ref_mtx = gen_mtx(103, 98, 10); - gko::utils::ensure_all_diagonal_entries(ref_mtx.get()); - auto mtx = gko::clone(omp, ref_mtx); - bool has_diags = true; - - gko::kernels::omp::csr::check_diagonal_entries_exist(omp, mtx.get(), - has_diags); - - ASSERT_TRUE(has_diags); -} - - -TEST_F(Csr, AddScaledIdentityToNonSquare) -{ - set_up_apply_data(); - gko::utils::ensure_all_diagonal_entries(mtx.get()); - dmtx->copy_from(mtx.get()); - - mtx->add_scaled_identity(alpha.get(), beta.get()); - dmtx->add_scaled_identity(dalpha.get(), dbeta.get()); - - GKO_ASSERT_MTX_NEAR(mtx, dmtx, r::value); -} - - -TEST_F(Csr, CreateSubMatrixFromindex_setIsEquivalentToRef) -{ - using IndexType = int; - using ValueType = double; - set_up_mat_data(); - - gko::index_set rset{ - this->ref, {42, 7, 8, 9, 10, 22, 25, 26, 34, 35, 36, 51}}; - gko::index_set cset{this->ref, - {42, 22, 24, 26, 28, 30, 81, 82, 83, 88}}; - gko::index_set drset(this->omp, rset); - gko::index_set dcset(this->omp, cset); - auto smat1 = this->mtx2->create_submatrix(rset, cset); - auto sdmat1 = this->dmtx2->create_submatrix(drset, dcset); - - GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); -} - - -} // namespace diff --git a/test/matrix/CMakeLists.txt b/test/matrix/CMakeLists.txt index 6b9ddb30ab0..e6984420207 100644 --- a/test/matrix/CMakeLists.txt +++ b/test/matrix/CMakeLists.txt @@ -1,4 +1,5 @@ ginkgo_create_common_device_test(csr_kernels) +ginkgo_create_common_device_test(csr_kernels2) ginkgo_create_common_test(coo_kernels) ginkgo_create_common_test(dense_kernels) ginkgo_create_common_test(diagonal_kernels) diff --git a/dpcpp/test/matrix/csr_kernels.cpp b/test/matrix/csr_kernels2.cpp similarity index 59% rename from dpcpp/test/matrix/csr_kernels.cpp rename to test/matrix/csr_kernels2.cpp index 375f7d93a93..ee1ac589752 100644 --- a/dpcpp/test/matrix/csr_kernels.cpp +++ b/test/matrix/csr_kernels2.cpp @@ -30,6 +30,9 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *************************************************************/ +#include + + #include @@ -46,18 +49,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include "core/components/prefix_sum_kernels.hpp" #include "core/matrix/csr_kernels.hpp" #include "core/test/utils.hpp" #include "core/test/utils/unsort_matrix.hpp" +#include "core/utils/matrix_utils.hpp" +#include "test/utils/executor.hpp" -namespace { - - -class Csr : public ::testing::Test { +class Csr : public CommonTestFixture { protected: #if GINKGO_DPCPP_SINGLE_MODE using vtype = float; @@ -79,41 +82,74 @@ class Csr : public ::testing::Test { rand_engine(42) {} - void SetUp() - { - ASSERT_GT(gko::DpcppExecutor::get_num_devices("all"), 0); - ref = gko::ReferenceExecutor::create(); - dpcpp = gko::DpcppExecutor::create(0, ref); - } - - void TearDown() + template + std::unique_ptr gen_mtx(int num_rows, int num_cols, + int min_nnz_row, int max_nnz_row) { - if (dpcpp != nullptr) { - ASSERT_NO_THROW(dpcpp->synchronize()); - } + return gko::test::generate_random_matrix( + num_rows, num_cols, + std::uniform_int_distribution<>(min_nnz_row, max_nnz_row), + std::normal_distribution(-1.0, 1.0), rand_engine, ref); } template std::unique_ptr gen_mtx(int num_rows, int num_cols, int min_nnz_row) { - return gko::test::generate_random_matrix( - num_rows, num_cols, - std::uniform_int_distribution<>(min_nnz_row, num_cols), - std::normal_distribution(-1.0, 1.0), rand_engine, ref); + return gen_mtx(num_rows, num_cols, min_nnz_row, num_cols); } - void set_up_apply_data() + void set_up_mat_data() { mtx2 = Mtx::create(ref); mtx2->copy_from(gen_mtx(mtx_size[0], mtx_size[1], 5)); - dmtx2 = Mtx::create(dpcpp); + dmtx2 = Mtx::create(exec); dmtx2->copy_from(mtx2.get()); } - void set_up_apply_data(std::shared_ptr strategy, - int num_vectors = 1) + template + void set_up_strategy(std::shared_ptr& strategy) + { +#ifdef GKO_COMPILING_OMP + throw std::runtime_error{"We shouldn't be testing this"}; +#else + strategy = std::make_shared(exec); +#endif + } + + template + void set_up_strategy(std::shared_ptr& strategy) + { + strategy = std::make_shared(); + } + + template + void set_up_strategy(std::shared_ptr& strategy) + { +#ifdef GKO_COMPILING_OMP + throw std::runtime_error{"We shouldn't be testing this"}; +#else + strategy = std::make_shared(exec); +#endif + } + + template + void set_up_strategy(std::shared_ptr& strategy) + { + strategy = std::make_shared(); + } + + template + void set_up_strategy(std::shared_ptr& strategy) + { + strategy = std::make_shared(); + } + + template + void set_up_apply_data(int num_vectors = 1) { + std::shared_ptr strategy; + set_up_strategy(strategy); mtx = Mtx::create(ref, strategy); mtx->copy_from(gen_mtx(mtx_size[0], mtx_size[1], 1)); square_mtx = Mtx::create(ref, strategy); @@ -122,14 +158,14 @@ class Csr : public ::testing::Test { y = gen_mtx(mtx_size[1], num_vectors, 1); alpha = gko::initialize({2.0}, ref); beta = gko::initialize({-1.0}, ref); - dmtx = Mtx::create(dpcpp, strategy); + dmtx = Mtx::create(exec, strategy); dmtx->copy_from(mtx.get()); - square_dmtx = Mtx::create(dpcpp, strategy); + square_dmtx = Mtx::create(exec, strategy); square_dmtx->copy_from(square_mtx.get()); - dresult = gko::clone(dpcpp, expected); - dy = gko::clone(dpcpp, y); - dalpha = gko::clone(dpcpp, alpha); - dbeta = gko::clone(dpcpp, beta); + dresult = gko::clone(exec, expected); + dy = gko::clone(exec, y); + dalpha = gko::clone(exec, alpha); + dbeta = gko::clone(exec, beta); std::vector tmp(mtx->get_size()[0], 0); auto rng = std::default_random_engine{}; @@ -142,13 +178,15 @@ class Csr : public ::testing::Test { cpermute_idxs = std::make_unique(ref, tmp2.begin(), tmp2.end()); } - void set_up_apply_complex_data( - std::shared_ptr strategy) + template + void set_up_apply_complex_data() { + std::shared_ptr strategy; + set_up_strategy(strategy); complex_mtx = ComplexMtx::create(ref, strategy); complex_mtx->copy_from( gen_mtx(mtx_size[0], mtx_size[1], 1)); - complex_dmtx = ComplexMtx::create(dpcpp, strategy); + complex_dmtx = ComplexMtx::create(exec, strategy); complex_dmtx->copy_from(complex_mtx.get()); } @@ -158,9 +196,6 @@ class Csr : public ::testing::Test { dmtx->copy_from(mtx.get()); } - std::shared_ptr ref; - std::shared_ptr dpcpp; - const gko::dim<2> mtx_size; std::default_random_engine rand_engine; @@ -188,16 +223,16 @@ class Csr : public ::testing::Test { TEST_F(Csr, StrategyAfterCopyIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); ASSERT_EQ(mtx->get_strategy()->get_name(), dmtx->get_strategy()->get_name()); } -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithLoadBalance) +TEST_F(Csr, SimpleApplyIsEquivalentToRefWithClassical) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); mtx->apply(y.get(), expected.get()); dmtx->apply(dy.get(), dresult.get()); @@ -206,9 +241,9 @@ TEST_F(Csr, SimpleApplyIsEquivalentToRefWithLoadBalance) } -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithLoadBalanceUnsorted) +TEST_F(Csr, SimpleApplyIsEquivalentToRefWithClassicalUnsorted) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); unsort_mtx(); mtx->apply(y.get(), expected.get()); @@ -218,9 +253,31 @@ TEST_F(Csr, SimpleApplyIsEquivalentToRefWithLoadBalanceUnsorted) } -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithLoadBalance) +TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithClassical) +{ + set_up_apply_data(); + + mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); + dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); + + GKO_ASSERT_MTX_NEAR(dresult, expected, r::value); +} + + +TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithClassical) +{ + set_up_apply_data(3); + + mtx->apply(y.get(), expected.get()); + dmtx->apply(dy.get(), dresult.get()); + + GKO_ASSERT_MTX_NEAR(dresult, expected, r::value); +} + + +TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithClassical) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(3); mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); @@ -229,9 +286,13 @@ TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithLoadBalance) } -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithOnemkl) +// OpenMP doesn't have strategies +#ifndef GKO_COMPILING_OMP + + +TEST_F(Csr, SimpleApplyIsEquivalentToRefWithLoadBalance) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); mtx->apply(y.get(), expected.get()); dmtx->apply(dy.get(), dresult.get()); @@ -240,9 +301,9 @@ TEST_F(Csr, SimpleApplyIsEquivalentToRefWithOnemkl) } -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithOnemklUnsorted) +TEST_F(Csr, SimpleApplyIsEquivalentToRefWithLoadBalanceUnsorted) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); unsort_mtx(); mtx->apply(y.get(), expected.get()); @@ -252,9 +313,9 @@ TEST_F(Csr, SimpleApplyIsEquivalentToRefWithOnemklUnsorted) } -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithOnemkl) +TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithLoadBalance) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); @@ -263,9 +324,9 @@ TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithOnemkl) } -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithMergePath) +TEST_F(Csr, SimpleApplyIsEquivalentToRefWithSparselib) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); mtx->apply(y.get(), expected.get()); dmtx->apply(dy.get(), dresult.get()); @@ -274,9 +335,9 @@ TEST_F(Csr, SimpleApplyIsEquivalentToRefWithMergePath) } -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithMergePathUnsorted) +TEST_F(Csr, SimpleApplyIsEquivalentToRefWithSparselibUnsorted) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); unsort_mtx(); mtx->apply(y.get(), expected.get()); @@ -286,9 +347,9 @@ TEST_F(Csr, SimpleApplyIsEquivalentToRefWithMergePathUnsorted) } -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithMergePath) +TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithSparselib) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); @@ -297,9 +358,9 @@ TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithMergePath) } -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithClassical) +TEST_F(Csr, SimpleApplyIsEquivalentToRefWithMergePath) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); mtx->apply(y.get(), expected.get()); dmtx->apply(dy.get(), dresult.get()); @@ -308,9 +369,9 @@ TEST_F(Csr, SimpleApplyIsEquivalentToRefWithClassical) } -TEST_F(Csr, SimpleApplyIsEquivalentToRefWithClassicalUnsorted) +TEST_F(Csr, SimpleApplyIsEquivalentToRefWithMergePathUnsorted) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); unsort_mtx(); mtx->apply(y.get(), expected.get()); @@ -320,9 +381,9 @@ TEST_F(Csr, SimpleApplyIsEquivalentToRefWithClassicalUnsorted) } -TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithClassical) +TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithMergePath) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); @@ -333,7 +394,7 @@ TEST_F(Csr, AdvancedApplyIsEquivalentToRefWithClassical) TEST_F(Csr, SimpleApplyIsEquivalentToRefWithAutomatical) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); mtx->apply(y.get(), expected.get()); dmtx->apply(dy.get(), dresult.get()); @@ -342,9 +403,10 @@ TEST_F(Csr, SimpleApplyIsEquivalentToRefWithAutomatical) } -TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithLoadBalance) +TEST_F(Csr, SimpleApplyIsEquivalentToRefWithAutomaticalUnsorted) { - set_up_apply_data(std::make_shared(dpcpp), 3); + set_up_apply_data(); + unsort_mtx(); mtx->apply(y.get(), expected.get()); dmtx->apply(dy.get(), dresult.get()); @@ -353,20 +415,9 @@ TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithLoadBalance) } -TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithLoadBalance) -{ - set_up_apply_data(std::make_shared(dpcpp), 3); - - mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); - dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); - - GKO_ASSERT_MTX_NEAR(dresult, expected, r::value); -} - - -TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithClassical) +TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithLoadBalance) { - set_up_apply_data(std::make_shared(), 3); + set_up_apply_data(3); mtx->apply(y.get(), expected.get()); dmtx->apply(dy.get(), dresult.get()); @@ -375,9 +426,9 @@ TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithClassical) } -TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithClassical) +TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithLoadBalance) { - set_up_apply_data(std::make_shared(), 3); + set_up_apply_data(3); mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); @@ -388,7 +439,7 @@ TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithClassical) TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithMergePath) { - set_up_apply_data(std::make_shared(), 3); + set_up_apply_data(3); mtx->apply(y.get(), expected.get()); dmtx->apply(dy.get(), dresult.get()); @@ -399,7 +450,7 @@ TEST_F(Csr, SimpleApplyToDenseMatrixIsEquivalentToRefWithMergePath) TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithMergePath) { - set_up_apply_data(std::make_shared(), 3); + set_up_apply_data(3); mtx->apply(alpha.get(), y.get(), beta.get(), expected.get()); dmtx->apply(dalpha.get(), dy.get(), dbeta.get(), dresult.get()); @@ -408,9 +459,39 @@ TEST_F(Csr, AdvancedApplyToDenseMatrixIsEquivalentToRefWithMergePath) } +TEST_F(Csr, OneAutomaticalWorksWithDifferentMatrices) +{ + auto automatical = std::make_shared(exec); +#ifdef GKO_COMPILING_CUDA + auto row_len_limit = automatical->nvidia_row_len_limit; +#elif defined(GKO_COMPILING_HIP) + auto row_len_limit = std::max(automatical->nvidia_row_len_limit, + automatical->amd_row_len_limit); +#else + auto row_len_limit = automatical->intel_row_len_limit; +#endif + auto load_balance_mtx = + gen_mtx(1, row_len_limit + 1000, row_len_limit + 1); + auto classical_mtx = gen_mtx(50, 50, 1); + auto load_balance_mtx_d = gko::clone(exec, load_balance_mtx); + auto classical_mtx_d = gko::clone(exec, classical_mtx); + + load_balance_mtx_d->set_strategy(automatical); + classical_mtx_d->set_strategy(automatical); + + EXPECT_EQ("load_balance", load_balance_mtx_d->get_strategy()->get_name()); + EXPECT_EQ("classical", classical_mtx_d->get_strategy()->get_name()); + ASSERT_NE(load_balance_mtx_d->get_strategy().get(), + classical_mtx_d->get_strategy().get()); +} + + +#endif + + TEST_F(Csr, AdvancedApplyToCsrMatrixIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); auto trans = mtx->transpose(); auto d_trans = dmtx->transpose(); @@ -425,7 +506,7 @@ TEST_F(Csr, AdvancedApplyToCsrMatrixIsEquivalentToRef) TEST_F(Csr, SimpleApplyToCsrMatrixIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); auto trans = mtx->transpose(); auto d_trans = dmtx->transpose(); @@ -438,16 +519,70 @@ TEST_F(Csr, SimpleApplyToCsrMatrixIsEquivalentToRef) } +TEST_F(Csr, SimpleApplyToSparseCsrMatrixIsEquivalentToRef) +{ + set_up_apply_data(); + auto mtx2 = + gen_mtx(mtx->get_size()[1], square_mtx->get_size()[1], 0, 10); + auto dmtx2 = Mtx::create(exec, mtx2->get_size()); + dmtx2->copy_from(mtx2.get()); + + mtx->apply(mtx2.get(), square_mtx.get()); + dmtx->apply(dmtx2.get(), square_dmtx.get()); + + GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); + GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); + ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); +} + + +TEST_F(Csr, SimpleApplySparseToSparseCsrMatrixIsEquivalentToRef) +{ + set_up_apply_data(); + auto mtx1 = gen_mtx(mtx->get_size()[0], mtx->get_size()[1], 0, 10); + auto mtx2 = + gen_mtx(mtx->get_size()[1], square_mtx->get_size()[1], 0, 10); + auto dmtx1 = Mtx::create(exec, mtx1->get_size()); + auto dmtx2 = Mtx::create(exec, mtx2->get_size()); + dmtx1->copy_from(mtx1.get()); + dmtx2->copy_from(mtx2.get()); + + mtx1->apply(mtx2.get(), square_mtx.get()); + dmtx1->apply(dmtx2.get(), square_dmtx.get()); + + GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); + GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); + ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); +} + + +TEST_F(Csr, SimpleApplyToEmptyCsrMatrixIsEquivalentToRef) +{ + set_up_apply_data(); + auto mtx2 = + gen_mtx(mtx->get_size()[1], square_mtx->get_size()[1], 0, 0); + auto dmtx2 = Mtx::create(exec, mtx2->get_size()); + dmtx2->copy_from(mtx2.get()); + + mtx->apply(mtx2.get(), square_mtx.get()); + dmtx->apply(dmtx2.get(), square_dmtx.get()); + + GKO_ASSERT_MTX_EQ_SPARSITY(square_dmtx, square_mtx); + GKO_ASSERT_MTX_NEAR(square_dmtx, square_mtx, 1e-14); + ASSERT_TRUE(square_dmtx->is_sorted_by_column_index()); +} + + TEST_F(Csr, AdvancedApplyToIdentityMatrixIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); auto a = gen_mtx(mtx_size[0], mtx_size[1], 0); auto b = gen_mtx(mtx_size[0], mtx_size[1], 0); - auto da = gko::clone(dpcpp, a); - auto db = gko::clone(dpcpp, b); + auto da = gko::clone(exec, a); + auto db = gko::clone(exec, b); auto id = gko::matrix::Identity::create(ref, mtx_size[1]); auto did = - gko::matrix::Identity::create(dpcpp, mtx_size[1]); + gko::matrix::Identity::create(exec, mtx_size[1]); a->apply(alpha.get(), id.get(), beta.get(), b.get()); da->apply(dalpha.get(), did.get(), dbeta.get(), db.get()); @@ -460,11 +595,11 @@ TEST_F(Csr, AdvancedApplyToIdentityMatrixIsEquivalentToRef) TEST_F(Csr, ApplyToComplexIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); auto complex_b = gen_mtx(this->mtx_size[1], 3, 1); - auto dcomplex_b = gko::clone(dpcpp, complex_b); + auto dcomplex_b = gko::clone(exec, complex_b); auto complex_x = gen_mtx(this->mtx_size[0], 3, 1); - auto dcomplex_x = gko::clone(dpcpp, complex_x); + auto dcomplex_x = gko::clone(exec, complex_x); mtx->apply(complex_b.get(), complex_x.get()); dmtx->apply(dcomplex_b.get(), dcomplex_x.get()); @@ -475,11 +610,11 @@ TEST_F(Csr, ApplyToComplexIsEquivalentToRef) TEST_F(Csr, AdvancedApplyToComplexIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); auto complex_b = gen_mtx(this->mtx_size[1], 3, 1); - auto dcomplex_b = gko::clone(dpcpp, complex_b); + auto dcomplex_b = gko::clone(exec, complex_b); auto complex_x = gen_mtx(this->mtx_size[0], 3, 1); - auto dcomplex_x = gko::clone(dpcpp, complex_x); + auto dcomplex_x = gko::clone(exec, complex_x); mtx->apply(alpha.get(), complex_b.get(), beta.get(), complex_x.get()); dmtx->apply(dalpha.get(), dcomplex_b.get(), dbeta.get(), dcomplex_x.get()); @@ -490,7 +625,7 @@ TEST_F(Csr, AdvancedApplyToComplexIsEquivalentToRef) TEST_F(Csr, TransposeIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); auto trans = gko::as(mtx->transpose()); auto d_trans = gko::as(dmtx->transpose()); @@ -500,9 +635,23 @@ TEST_F(Csr, TransposeIsEquivalentToRef) } +TEST_F(Csr, Transpose64IsEquivalentToRef) +{ + using Mtx64 = gko::matrix::Csr; + auto mtx = gen_mtx(123, 234, 0); + auto dmtx = gko::clone(exec, mtx); + + auto trans = gko::as(mtx->transpose()); + auto d_trans = gko::as(dmtx->transpose()); + + GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); + ASSERT_TRUE(d_trans->is_sorted_by_column_index()); +} + + TEST_F(Csr, ConjugateTransposeIsEquivalentToRef) { - set_up_apply_complex_data(std::make_shared(dpcpp)); + set_up_apply_complex_data(); auto trans = gko::as(complex_mtx->conj_transpose()); auto d_trans = gko::as(complex_dmtx->conj_transpose()); @@ -512,11 +661,25 @@ TEST_F(Csr, ConjugateTransposeIsEquivalentToRef) } +TEST_F(Csr, ConjugateTranspose64IsEquivalentToRef) +{ + using Mtx64 = gko::matrix::Csr; + auto mtx = gen_mtx(123, 234, 0); + auto dmtx = gko::clone(exec, mtx); + + auto trans = gko::as(mtx->transpose()); + auto d_trans = gko::as(dmtx->transpose()); + + GKO_ASSERT_MTX_NEAR(d_trans, trans, 0.0); + ASSERT_TRUE(d_trans->is_sorted_by_column_index()); +} + + TEST_F(Csr, ConvertToDenseIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto dense_mtx = gko::matrix::Dense::create(ref); - auto ddense_mtx = gko::matrix::Dense::create(dpcpp); + auto ddense_mtx = gko::matrix::Dense::create(exec); mtx->convert_to(dense_mtx.get()); dmtx->convert_to(ddense_mtx.get()); @@ -527,9 +690,9 @@ TEST_F(Csr, ConvertToDenseIsEquivalentToRef) TEST_F(Csr, MoveToDenseIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto dense_mtx = gko::matrix::Dense::create(ref); - auto ddense_mtx = gko::matrix::Dense::create(dpcpp); + auto ddense_mtx = gko::matrix::Dense::create(exec); mtx->move_to(dense_mtx.get()); dmtx->move_to(ddense_mtx.get()); @@ -540,9 +703,9 @@ TEST_F(Csr, MoveToDenseIsEquivalentToRef) TEST_F(Csr, ConvertToEllIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto ell_mtx = gko::matrix::Ell::create(ref); - auto dell_mtx = gko::matrix::Ell::create(dpcpp); + auto dell_mtx = gko::matrix::Ell::create(exec); mtx->convert_to(ell_mtx.get()); dmtx->convert_to(dell_mtx.get()); @@ -553,9 +716,9 @@ TEST_F(Csr, ConvertToEllIsEquivalentToRef) TEST_F(Csr, MoveToEllIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto ell_mtx = gko::matrix::Ell::create(ref); - auto dell_mtx = gko::matrix::Ell::create(dpcpp); + auto dell_mtx = gko::matrix::Ell::create(exec); mtx->move_to(ell_mtx.get()); dmtx->move_to(dell_mtx.get()); @@ -566,9 +729,9 @@ TEST_F(Csr, MoveToEllIsEquivalentToRef) TEST_F(Csr, ConvertToSparsityCsrIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto sparsity_mtx = gko::matrix::SparsityCsr::create(ref); - auto d_sparsity_mtx = gko::matrix::SparsityCsr::create(dpcpp); + auto d_sparsity_mtx = gko::matrix::SparsityCsr::create(exec); mtx->convert_to(sparsity_mtx.get()); dmtx->convert_to(d_sparsity_mtx.get()); @@ -579,9 +742,9 @@ TEST_F(Csr, ConvertToSparsityCsrIsEquivalentToRef) TEST_F(Csr, MoveToSparsityCsrIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto sparsity_mtx = gko::matrix::SparsityCsr::create(ref); - auto d_sparsity_mtx = gko::matrix::SparsityCsr::create(dpcpp); + auto d_sparsity_mtx = gko::matrix::SparsityCsr::create(exec); mtx->move_to(sparsity_mtx.get()); dmtx->move_to(d_sparsity_mtx.get()); @@ -592,9 +755,9 @@ TEST_F(Csr, MoveToSparsityCsrIsEquivalentToRef) TEST_F(Csr, ConvertToCooIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto coo_mtx = gko::matrix::Coo::create(ref); - auto dcoo_mtx = gko::matrix::Coo::create(dpcpp); + auto dcoo_mtx = gko::matrix::Coo::create(exec); mtx->convert_to(coo_mtx.get()); dmtx->convert_to(dcoo_mtx.get()); @@ -605,9 +768,9 @@ TEST_F(Csr, ConvertToCooIsEquivalentToRef) TEST_F(Csr, MoveToCooIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto coo_mtx = gko::matrix::Coo::create(ref); - auto dcoo_mtx = gko::matrix::Coo::create(dpcpp); + auto dcoo_mtx = gko::matrix::Coo::create(exec); mtx->move_to(coo_mtx.get()); dmtx->move_to(dcoo_mtx.get()); @@ -618,9 +781,9 @@ TEST_F(Csr, MoveToCooIsEquivalentToRef) TEST_F(Csr, ConvertToSellpIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto sellp_mtx = gko::matrix::Sellp::create(ref); - auto dsellp_mtx = gko::matrix::Sellp::create(dpcpp); + auto dsellp_mtx = gko::matrix::Sellp::create(exec); mtx->convert_to(sellp_mtx.get()); dmtx->convert_to(dsellp_mtx.get()); @@ -631,9 +794,9 @@ TEST_F(Csr, ConvertToSellpIsEquivalentToRef) TEST_F(Csr, MoveToSellpIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto sellp_mtx = gko::matrix::Sellp::create(ref); - auto dsellp_mtx = gko::matrix::Sellp::create(dpcpp); + auto dsellp_mtx = gko::matrix::Sellp::create(exec); mtx->move_to(sellp_mtx.get()); dmtx->move_to(dsellp_mtx.get()); @@ -644,12 +807,12 @@ TEST_F(Csr, MoveToSellpIsEquivalentToRef) TEST_F(Csr, ConvertsEmptyToSellp) { - auto dempty_mtx = Mtx::create(dpcpp); - auto dsellp_mtx = gko::matrix::Sellp::create(dpcpp); + auto dempty_mtx = Mtx::create(exec); + auto dsellp_mtx = gko::matrix::Sellp::create(exec); dempty_mtx->convert_to(dsellp_mtx.get()); - ASSERT_EQ(dpcpp->copy_val_to_host(dsellp_mtx->get_const_slice_sets()), 0); + ASSERT_EQ(exec->copy_val_to_host(dsellp_mtx->get_const_slice_sets()), 0); ASSERT_FALSE(dsellp_mtx->get_size()); } @@ -657,11 +820,11 @@ TEST_F(Csr, ConvertsEmptyToSellp) TEST_F(Csr, ConvertToHybridIsEquivalentToRef) { using Hybrid_type = gko::matrix::Hybrid; - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto hybrid_mtx = Hybrid_type::create( ref, std::make_shared(2)); auto dhybrid_mtx = Hybrid_type::create( - dpcpp, std::make_shared(2)); + exec, std::make_shared(2)); mtx->convert_to(hybrid_mtx.get()); dmtx->convert_to(dhybrid_mtx.get()); @@ -673,11 +836,11 @@ TEST_F(Csr, ConvertToHybridIsEquivalentToRef) TEST_F(Csr, MoveToHybridIsEquivalentToRef) { using Hybrid_type = gko::matrix::Hybrid; - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto hybrid_mtx = Hybrid_type::create( ref, std::make_shared(2)); auto dhybrid_mtx = Hybrid_type::create( - dpcpp, std::make_shared(2)); + exec, std::make_shared(2)); mtx->move_to(hybrid_mtx.get()); dmtx->move_to(dhybrid_mtx.get()); @@ -688,7 +851,7 @@ TEST_F(Csr, MoveToHybridIsEquivalentToRef) TEST_F(Csr, IsPermutable) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto permuted = gko::as(square_mtx->permute(rpermute_idxs.get())); auto dpermuted = gko::as(square_dmtx->permute(rpermute_idxs.get())); @@ -700,7 +863,7 @@ TEST_F(Csr, IsPermutable) TEST_F(Csr, IsInversePermutable) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto permuted = gko::as(square_mtx->inverse_permute(rpermute_idxs.get())); @@ -714,7 +877,7 @@ TEST_F(Csr, IsInversePermutable) TEST_F(Csr, IsRowPermutable) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto r_permute = gko::as(mtx->row_permute(rpermute_idxs.get())); auto dr_permute = gko::as(dmtx->row_permute(rpermute_idxs.get())); @@ -726,7 +889,7 @@ TEST_F(Csr, IsRowPermutable) TEST_F(Csr, IsColPermutable) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto c_permute = gko::as(mtx->column_permute(cpermute_idxs.get())); auto dc_permute = gko::as(dmtx->column_permute(cpermute_idxs.get())); @@ -739,7 +902,7 @@ TEST_F(Csr, IsColPermutable) TEST_F(Csr, IsInverseRowPermutable) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto inverse_r_permute = gko::as(mtx->inverse_row_permute(rpermute_idxs.get())); @@ -753,7 +916,7 @@ TEST_F(Csr, IsInverseRowPermutable) TEST_F(Csr, IsInverseColPermutable) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); auto inverse_c_permute = gko::as(mtx->inverse_column_permute(cpermute_idxs.get())); @@ -768,34 +931,34 @@ TEST_F(Csr, IsInverseColPermutable) TEST_F(Csr, RecognizeSortedMatrixIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); - bool is_sorted_dpcpp{}; + set_up_apply_data(); + bool is_sorted_exec{}; bool is_sorted_ref{}; is_sorted_ref = mtx->is_sorted_by_column_index(); - is_sorted_dpcpp = dmtx->is_sorted_by_column_index(); + is_sorted_exec = dmtx->is_sorted_by_column_index(); - ASSERT_EQ(is_sorted_ref, is_sorted_dpcpp); + ASSERT_EQ(is_sorted_ref, is_sorted_exec); } TEST_F(Csr, RecognizeUnsortedMatrixIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); unsort_mtx(); - bool is_sorted_dpcpp{}; + bool is_sorted_exec{}; bool is_sorted_ref{}; is_sorted_ref = mtx->is_sorted_by_column_index(); - is_sorted_dpcpp = dmtx->is_sorted_by_column_index(); + is_sorted_exec = dmtx->is_sorted_by_column_index(); - ASSERT_EQ(is_sorted_ref, is_sorted_dpcpp); + ASSERT_EQ(is_sorted_ref, is_sorted_exec); } TEST_F(Csr, SortSortedMatrixIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); mtx->sort_by_column_index(); dmtx->sort_by_column_index(); @@ -807,7 +970,7 @@ TEST_F(Csr, SortSortedMatrixIsEquivalentToRef) TEST_F(Csr, SortUnsortedMatrixIsEquivalentToRef) { - set_up_apply_data(std::make_shared()); + set_up_apply_data(); unsort_mtx(); mtx->sort_by_column_index(); @@ -818,29 +981,9 @@ TEST_F(Csr, SortUnsortedMatrixIsEquivalentToRef) } -TEST_F(Csr, OneAutomaticalWorksWithDifferentMatrices) -{ - auto automatical = std::make_shared(dpcpp); - auto row_len_limit = automatical->intel_row_len_limit; - auto load_balance_mtx = - gen_mtx(1, row_len_limit + 1000, row_len_limit + 1); - auto classical_mtx = gen_mtx(50, 50, 1); - auto load_balance_mtx_d = gko::clone(dpcpp, load_balance_mtx); - auto classical_mtx_d = gko::clone(dpcpp, classical_mtx); - - load_balance_mtx_d->set_strategy(automatical); - classical_mtx_d->set_strategy(automatical); - - EXPECT_EQ("load_balance", load_balance_mtx_d->get_strategy()->get_name()); - EXPECT_EQ("classical", classical_mtx_d->get_strategy()->get_name()); - ASSERT_NE(load_balance_mtx_d->get_strategy().get(), - classical_mtx_d->get_strategy().get()); -} - - TEST_F(Csr, ExtractDiagonalIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); auto diag = mtx->extract_diagonal(); auto ddiag = dmtx->extract_diagonal(); @@ -851,7 +994,7 @@ TEST_F(Csr, ExtractDiagonalIsEquivalentToRef) TEST_F(Csr, InplaceAbsoluteMatrixIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); mtx->compute_absolute_inplace(); dmtx->compute_absolute_inplace(); @@ -862,7 +1005,7 @@ TEST_F(Csr, InplaceAbsoluteMatrixIsEquivalentToRef) TEST_F(Csr, OutplaceAbsoluteMatrixIsEquivalentToRef) { - set_up_apply_data(std::make_shared(dpcpp)); + set_up_apply_data(); auto abs_mtx = mtx->compute_absolute(); auto dabs_mtx = dmtx->compute_absolute(); @@ -873,7 +1016,7 @@ TEST_F(Csr, OutplaceAbsoluteMatrixIsEquivalentToRef) TEST_F(Csr, InplaceAbsoluteComplexMatrixIsEquivalentToRef) { - set_up_apply_complex_data(std::make_shared(dpcpp)); + set_up_apply_complex_data(); complex_mtx->compute_absolute_inplace(); complex_dmtx->compute_absolute_inplace(); @@ -884,7 +1027,7 @@ TEST_F(Csr, InplaceAbsoluteComplexMatrixIsEquivalentToRef) TEST_F(Csr, OutplaceAbsoluteComplexMatrixIsEquivalentToRef) { - set_up_apply_complex_data(std::make_shared(dpcpp)); + set_up_apply_complex_data(); auto abs_mtx = complex_mtx->compute_absolute(); auto dabs_mtx = complex_dmtx->compute_absolute(); @@ -896,17 +1039,17 @@ TEST_F(Csr, OutplaceAbsoluteComplexMatrixIsEquivalentToRef) TEST_F(Csr, CalculateNnzPerRowInSpanIsEquivalentToRef) { using Mtx = gko::matrix::Csr; - set_up_apply_data(); + set_up_mat_data(); gko::span rspan{7, 51}; gko::span cspan{22, 88}; auto size = this->mtx2->get_size(); auto row_nnz = gko::array(this->ref, rspan.length() + 1); - auto drow_nnz = gko::array(this->dpcpp, row_nnz); + auto drow_nnz = gko::array(this->exec, row_nnz); gko::kernels::reference::csr::calculate_nonzeros_per_row_in_span( this->ref, this->mtx2.get(), rspan, cspan, &row_nnz); - gko::kernels::dpcpp::csr::calculate_nonzeros_per_row_in_span( - this->dpcpp, this->dmtx2.get(), rspan, cspan, &drow_nnz); + gko::kernels::EXEC_NAMESPACE::csr::calculate_nonzeros_per_row_in_span( + this->exec, this->dmtx2.get(), rspan, cspan, &drow_nnz); GKO_ASSERT_ARRAY_EQ(row_nnz, drow_nnz); } @@ -917,7 +1060,7 @@ TEST_F(Csr, ComputeSubmatrixIsEquivalentToRef) using Mtx = gko::matrix::Csr; using IndexType = int; using ValueType = vtype; - set_up_apply_data(); + set_up_mat_data(); gko::span rspan{7, 51}; gko::span cspan{22, 88}; auto size = this->mtx2->get_size(); @@ -928,32 +1071,124 @@ TEST_F(Csr, ComputeSubmatrixIsEquivalentToRef) gko::kernels::reference::components::prefix_sum( this->ref, row_nnz.get_data(), row_nnz.get_num_elems()); auto num_nnz = row_nnz.get_data()[rspan.length()]; - auto drow_nnz = gko::array(this->dpcpp, row_nnz); + auto drow_nnz = gko::array(this->exec, row_nnz); auto smat1 = Mtx::create(this->ref, gko::dim<2>(rspan.length(), cspan.length()), std::move(gko::array(this->ref, num_nnz)), std::move(gko::array(this->ref, num_nnz)), std::move(row_nnz)); auto sdmat1 = - Mtx::create(this->dpcpp, gko::dim<2>(rspan.length(), cspan.length()), - std::move(gko::array(this->dpcpp, num_nnz)), - std::move(gko::array(this->dpcpp, num_nnz)), + Mtx::create(this->exec, gko::dim<2>(rspan.length(), cspan.length()), + std::move(gko::array(this->exec, num_nnz)), + std::move(gko::array(this->exec, num_nnz)), std::move(drow_nnz)); gko::kernels::reference::csr::compute_submatrix(this->ref, this->mtx2.get(), rspan, cspan, smat1.get()); - gko::kernels::dpcpp::csr::compute_submatrix(this->dpcpp, this->dmtx2.get(), - rspan, cspan, sdmat1.get()); + gko::kernels::EXEC_NAMESPACE::csr::compute_submatrix( + this->exec, this->dmtx2.get(), rspan, cspan, sdmat1.get()); + + GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); +} + + +#ifdef GKO_COMPILING_OMP + + +TEST_F(Csr, CalculateNnzPerRowInIndexSetIsEquivalentToRef) +{ + using Mtx = gko::matrix::Csr<>; + using IndexType = int; + using ValueType = double; + set_up_mat_data(); + gko::index_set rset{ + this->ref, {42, 7, 8, 9, 10, 22, 25, 26, 34, 35, 36, 51}}; + gko::index_set cset{this->ref, + {42, 22, 24, 26, 28, 30, 81, 82, 83, 88}}; + gko::index_set drset(this->exec, rset); + gko::index_set dcset(this->exec, cset); + auto size = this->mtx2->get_size(); + auto row_nnz = gko::array(this->ref, rset.get_num_elems() + 1); + row_nnz.fill(gko::zero()); + auto drow_nnz = gko::array(this->exec, row_nnz); + + gko::kernels::reference::csr::calculate_nonzeros_per_row_in_index_set( + this->ref, this->mtx2.get(), rset, cset, row_nnz.get_data()); + gko::kernels::omp::csr::calculate_nonzeros_per_row_in_index_set( + this->exec, this->dmtx2.get(), drset, dcset, drow_nnz.get_data()); + + GKO_ASSERT_ARRAY_EQ(row_nnz, drow_nnz); +} + + +TEST_F(Csr, ComputeSubmatrixFromIndexSetIsEquivalentToRef) +{ + using Mtx = gko::matrix::Csr<>; + using IndexType = int; + using ValueType = double; + set_up_mat_data(); + gko::index_set rset{ + this->ref, {42, 7, 8, 9, 10, 22, 25, 26, 34, 35, 36, 51}}; + gko::index_set cset{this->ref, + {42, 22, 24, 26, 28, 30, 81, 82, 83, 88}}; + gko::index_set drset(this->exec, rset); + gko::index_set dcset(this->exec, cset); + auto size = this->mtx2->get_size(); + auto row_nnz = gko::array(this->ref, rset.get_num_elems() + 1); + row_nnz.fill(gko::zero()); + gko::kernels::reference::csr::calculate_nonzeros_per_row_in_index_set( + this->ref, this->mtx2.get(), rset, cset, row_nnz.get_data()); + gko::kernels::reference::components::prefix_sum( + this->ref, row_nnz.get_data(), row_nnz.get_num_elems()); + auto num_nnz = row_nnz.get_data()[rset.get_num_elems()]; + auto drow_nnz = gko::array(this->exec, row_nnz); + auto smat1 = Mtx::create( + this->ref, gko::dim<2>(rset.get_num_elems(), cset.get_num_elems()), + std::move(gko::array(this->ref, num_nnz)), + std::move(gko::array(this->ref, num_nnz)), + std::move(row_nnz)); + auto sdmat1 = Mtx::create( + this->exec, gko::dim<2>(rset.get_num_elems(), cset.get_num_elems()), + std::move(gko::array(this->exec, num_nnz)), + std::move(gko::array(this->exec, num_nnz)), + std::move(drow_nnz)); + + gko::kernels::reference::csr::compute_submatrix_from_index_set( + this->ref, this->mtx2.get(), rset, cset, smat1.get()); + gko::kernels::omp::csr::compute_submatrix_from_index_set( + this->exec, this->dmtx2.get(), drset, dcset, sdmat1.get()); + + GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); +} + + +TEST_F(Csr, CreateSubMatrixFromIndexSetIsEquivalentToRef) +{ + using IndexType = int; + using ValueType = double; + set_up_mat_data(); + + gko::index_set rset{ + this->ref, {42, 7, 8, 9, 10, 22, 25, 26, 34, 35, 36, 51}}; + gko::index_set cset{this->ref, + {42, 22, 24, 26, 28, 30, 81, 82, 83, 88}}; + gko::index_set drset(this->exec, rset); + gko::index_set dcset(this->exec, cset); + auto smat1 = this->mtx2->create_submatrix(rset, cset); + auto sdmat1 = this->dmtx2->create_submatrix(drset, dcset); GKO_ASSERT_MTX_NEAR(sdmat1, smat1, 0.0); } +#endif // GKO_COMPILING_OMP + + TEST_F(Csr, CreateSubMatrixIsEquivalentToRef) { using Mtx = gko::matrix::Csr; - set_up_apply_data(); + set_up_mat_data(); gko::span rspan{47, 81}; gko::span cspan{2, 31}; @@ -964,4 +1199,49 @@ TEST_F(Csr, CreateSubMatrixIsEquivalentToRef) } -} // namespace +TEST_F(Csr, CanDetectMissingDiagonalEntry) +{ + using T = double; + using Csr = Mtx; + auto ref_mtx = gen_mtx(103, 98, 10); + const auto rowptrs = ref_mtx->get_row_ptrs(); + const auto colidxs = ref_mtx->get_col_idxs(); + const int testrow = 15; + gko::utils::remove_diagonal_entry_from_row(ref_mtx.get(), testrow); + auto mtx = gko::clone(exec, ref_mtx); + bool has_diags = true; + + gko::kernels::EXEC_NAMESPACE::csr::check_diagonal_entries_exist( + exec, mtx.get(), has_diags); + + ASSERT_FALSE(has_diags); +} + + +TEST_F(Csr, CanDetectWhenAllDiagonalEntriesArePresent) +{ + using T = double; + using Csr = Mtx; + auto ref_mtx = gen_mtx(103, 98, 10); + gko::utils::ensure_all_diagonal_entries(ref_mtx.get()); + auto mtx = gko::clone(exec, ref_mtx); + bool has_diags = true; + + gko::kernels::EXEC_NAMESPACE::csr::check_diagonal_entries_exist( + exec, mtx.get(), has_diags); + + ASSERT_TRUE(has_diags); +} + + +TEST_F(Csr, AddScaledIdentityToNonSquare) +{ + set_up_apply_data(); + gko::utils::ensure_all_diagonal_entries(mtx.get()); + dmtx->copy_from(mtx.get()); + + mtx->add_scaled_identity(alpha.get(), beta.get()); + dmtx->add_scaled_identity(dalpha.get(), dbeta.get()); + + GKO_ASSERT_MTX_NEAR(mtx, dmtx, r::value); +}