From e0673a7874c913ac615869e93ae422b530dcec8f Mon Sep 17 00:00:00 2001 From: Alicia Klinvex Date: Mon, 12 Jun 2023 16:38:42 -0400 Subject: [PATCH 1/4] Used new mdspan namespace Changes to the namespace (std::experimental to std) broke the existing unit tests and examples. This commit should fix the problem. --- examples/01_scale.cpp | 6 +++--- examples/02_matrix_vector_product_basic.cpp | 6 +++--- examples/03_matrix_vector_product_mixedprec.cpp | 8 ++++---- tests/native/add.cpp | 6 +++--- tests/native/conjugate_transposed.cpp | 6 +++--- tests/native/conjugated.cpp | 8 ++++---- tests/native/copy.cpp | 6 +++--- tests/native/dot.cpp | 6 +++--- tests/native/gemm.cpp | 8 ++++---- tests/native/gemv.cpp | 8 ++++---- tests/native/gemv_no_ambig.cpp | 6 +++--- tests/native/givens.cpp | 6 +++--- tests/native/gtest_fixtures.hpp | 6 +++--- tests/native/hemm.cpp | 8 ++++---- tests/native/idx_abs_max.cpp | 14 +++++++------- tests/native/iterator.cpp | 14 +++++++------- tests/native/matrix_inf_norm.cpp | 11 +++++++---- tests/native/matrix_one_norm.cpp | 14 +++++++------- tests/native/norm2.cpp | 6 +++--- tests/native/scale.cpp | 6 +++--- tests/native/scaled.cpp | 6 +++--- tests/native/swap.cpp | 6 +++--- tests/native/symm.cpp | 8 ++++---- tests/native/transposed.cpp | 6 +++--- tests/native/trmm.cpp | 10 +++++----- tests/native/trsm.cpp | 10 +++++----- 26 files changed, 104 insertions(+), 101 deletions(-) diff --git a/examples/01_scale.cpp b/examples/01_scale.cpp index aefd190a..6734e4fe 100644 --- a/examples/01_scale.cpp +++ b/examples/01_scale.cpp @@ -11,9 +11,9 @@ #endif // Make mdspan less verbose -using std::experimental::mdspan; -using std::experimental::extents; -using std::experimental::dynamic_extent; +using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; +using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; +using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; int main(int argc, char* argv[]) { std::cout << "Scale" << std::endl; diff --git a/examples/02_matrix_vector_product_basic.cpp b/examples/02_matrix_vector_product_basic.cpp index 9fc0c907..ebb57c9d 100644 --- a/examples/02_matrix_vector_product_basic.cpp +++ b/examples/02_matrix_vector_product_basic.cpp @@ -11,9 +11,9 @@ #endif // Make mdspan less verbose -using std::experimental::mdspan; -using std::experimental::extents; -using std::experimental::dynamic_extent; +using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; +using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; +using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; int main(int argc, char* argv[]) { std::cout << "Matrix Vector Product Basic" << std::endl; diff --git a/examples/03_matrix_vector_product_mixedprec.cpp b/examples/03_matrix_vector_product_mixedprec.cpp index 94c6db06..f3ee8883 100644 --- a/examples/03_matrix_vector_product_mixedprec.cpp +++ b/examples/03_matrix_vector_product_mixedprec.cpp @@ -3,11 +3,11 @@ #include // Make mdspan less verbose -using std::experimental::mdspan; -using std::experimental::extents; -using std::experimental::dynamic_extent; +using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; +using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; +using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; using std::experimental::submdspan; -using std::experimental::full_extent; +using MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent; int main(int argc, char* argv[]) { std::cout << "Matrix Vector Product MixedPrec" << std::endl; diff --git a/tests/native/add.cpp b/tests/native/add.cpp index 0d387a5e..fee0d2a9 100644 --- a/tests/native/add.cpp +++ b/tests/native/add.cpp @@ -6,9 +6,9 @@ #include namespace { - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::add; TEST(BLAS1_add, vector_double) diff --git a/tests/native/conjugate_transposed.cpp b/tests/native/conjugate_transposed.cpp index 41edac6a..7b32555b 100644 --- a/tests/native/conjugate_transposed.cpp +++ b/tests/native/conjugate_transposed.cpp @@ -6,9 +6,9 @@ #include namespace { - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::conjugate_transposed; TEST(conjugate_transposed, mdspan_complex_double) diff --git a/tests/native/conjugated.cpp b/tests/native/conjugated.cpp index 3362d2c6..00edfd1d 100644 --- a/tests/native/conjugated.cpp +++ b/tests/native/conjugated.cpp @@ -6,10 +6,10 @@ #include namespace { - using std::experimental::dextents; - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dextents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::conjugated; template diff --git a/tests/native/copy.cpp b/tests/native/copy.cpp index 0bfe1023..1606a204 100644 --- a/tests/native/copy.cpp +++ b/tests/native/copy.cpp @@ -6,9 +6,9 @@ #include namespace { - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::copy; template diff --git a/tests/native/dot.cpp b/tests/native/dot.cpp index f5773589..3f97aa52 100644 --- a/tests/native/dot.cpp +++ b/tests/native/dot.cpp @@ -22,9 +22,9 @@ double ddot_wrapper (const int N, const double* DX, #endif // 0 namespace { - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::dot; using std::experimental::linalg::dotc; diff --git a/tests/native/gemm.cpp b/tests/native/gemm.cpp index e88d7267..a66bbb62 100644 --- a/tests/native/gemm.cpp +++ b/tests/native/gemm.cpp @@ -6,10 +6,10 @@ #include namespace { - using std::experimental::mdspan; - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::layout_left; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_left; using std::experimental::linalg::explicit_diagonal; using std::experimental::linalg::implicit_unit_diagonal; using std::experimental::linalg::lower_triangle; diff --git a/tests/native/gemv.cpp b/tests/native/gemv.cpp index b126ae4f..ebdfef1e 100644 --- a/tests/native/gemv.cpp +++ b/tests/native/gemv.cpp @@ -6,10 +6,10 @@ #include namespace { - using std::experimental::mdspan; - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::layout_left; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_left; using std::experimental::linalg::matrix_vector_product; using std::experimental::linalg::transposed; using std::cout; diff --git a/tests/native/gemv_no_ambig.cpp b/tests/native/gemv_no_ambig.cpp index 17c3a21c..f7083edc 100644 --- a/tests/native/gemv_no_ambig.cpp +++ b/tests/native/gemv_no_ambig.cpp @@ -14,9 +14,9 @@ namespace { -using std::experimental::mdspan; -using std::experimental::extents; -using std::experimental::dynamic_extent; +using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; +using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; +using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::matrix_vector_product; using std::experimental::linalg::scaled; diff --git a/tests/native/givens.cpp b/tests/native/givens.cpp index 8a2c57e4..90068f6c 100644 --- a/tests/native/givens.cpp +++ b/tests/native/givens.cpp @@ -6,9 +6,9 @@ #include namespace { - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::givens_rotation_setup; using std::experimental::linalg::givens_rotation_apply; diff --git a/tests/native/gtest_fixtures.hpp b/tests/native/gtest_fixtures.hpp index 04f1a039..5c8afb16 100644 --- a/tests/native/gtest_fixtures.hpp +++ b/tests/native/gtest_fixtures.hpp @@ -49,9 +49,9 @@ #include #include - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using dbl_vector_t = mdspan>; using cpx_vector_t = mdspan, extents>; constexpr ptrdiff_t NROWS(10); diff --git a/tests/native/hemm.cpp b/tests/native/hemm.cpp index e493aa3b..478f1a2b 100644 --- a/tests/native/hemm.cpp +++ b/tests/native/hemm.cpp @@ -7,10 +7,10 @@ #include namespace { - using std::experimental::mdspan; - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::layout_left; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_left; using std::experimental::linalg::explicit_diagonal; using std::experimental::linalg::implicit_unit_diagonal; using std::experimental::linalg::lower_triangle; diff --git a/tests/native/idx_abs_max.cpp b/tests/native/idx_abs_max.cpp index d17148d5..e5130143 100644 --- a/tests/native/idx_abs_max.cpp +++ b/tests/native/idx_abs_max.cpp @@ -6,7 +6,9 @@ #include namespace { - + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::idx_abs_max; TEST_F(unsigned_double_vector, idx_abs_max) @@ -26,17 +28,15 @@ namespace { TEST(BLAS1_idx_abs_max, trivial_case) { - namespace stdexp = std::experimental; - constexpr auto expected = std::numeric_limits::max(); std::array arr; - using extents_type = stdexp::extents; - stdexp::mdspan a(arr.data(),0); + using extents_type = extents; + mdspan a(arr.data(),0); EXPECT_EQ(expected, idx_abs_max(a)); - using extents_type2 = stdexp::extents; - stdexp::mdspan b(arr.data()); + using extents_type2 = extents; + mdspan b(arr.data()); EXPECT_EQ(expected, idx_abs_max(b)); } diff --git a/tests/native/iterator.cpp b/tests/native/iterator.cpp index 75bac785..345f9b43 100644 --- a/tests/native/iterator.cpp +++ b/tests/native/iterator.cpp @@ -10,13 +10,13 @@ #include namespace { - using std::experimental::full_extent; - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::layout_left; - using std::experimental::layout_right; - using std::experimental::layout_stride; // does compile - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_left; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_right; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_stride; // does compile + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::submdspan; MDSPAN_TEMPLATE_REQUIRES( diff --git a/tests/native/matrix_inf_norm.cpp b/tests/native/matrix_inf_norm.cpp index 48e58c38..25555969 100644 --- a/tests/native/matrix_inf_norm.cpp +++ b/tests/native/matrix_inf_norm.cpp @@ -7,16 +7,19 @@ #include namespace { + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::matrix_inf_norm; using std::cout; using std::endl; template - using basic_matrix_t = std::experimental::mdspan< + using basic_matrix_t = mdspan< ElementType, - std::experimental::extents, + extents, Layout, std::experimental::default_accessor>; diff --git a/tests/native/matrix_one_norm.cpp b/tests/native/matrix_one_norm.cpp index 65b8bc1a..a89c2c79 100644 --- a/tests/native/matrix_one_norm.cpp +++ b/tests/native/matrix_one_norm.cpp @@ -7,20 +7,20 @@ #include namespace { - //using std::experimental::mdspan; - //using std::experimental::dynamic_extent; - //using std::experimental::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; using std::experimental::linalg::matrix_one_norm; using std::cout; using std::endl; template - using basic_matrix_t = std::experimental::mdspan< + using basic_matrix_t = mdspan< ElementType, - std::experimental::extents< + extents< std::size_t, - std::experimental::dynamic_extent, - std::experimental::dynamic_extent>, + dynamic_extent, + dynamic_extent>, Layout, std::experimental::default_accessor>; diff --git a/tests/native/norm2.cpp b/tests/native/norm2.cpp index 7294773e..b620831b 100644 --- a/tests/native/norm2.cpp +++ b/tests/native/norm2.cpp @@ -21,9 +21,9 @@ double dnrm2_wrapper(const int N, const double* X, const int INCX) #endif // 0 namespace { - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::vector_norm2; TEST(BLAS1_norm2, mdspan_zero) diff --git a/tests/native/scale.cpp b/tests/native/scale.cpp index 0b3af6b4..a729bfab 100644 --- a/tests/native/scale.cpp +++ b/tests/native/scale.cpp @@ -5,9 +5,9 @@ #include namespace { - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::scale; TEST(BLAS1_scale, mdspan_double) diff --git a/tests/native/scaled.cpp b/tests/native/scaled.cpp index 9f554226..e74a689d 100644 --- a/tests/native/scaled.cpp +++ b/tests/native/scaled.cpp @@ -6,9 +6,9 @@ #include namespace { - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::scaled; template diff --git a/tests/native/swap.cpp b/tests/native/swap.cpp index bc9e7ebc..f0763dc1 100644 --- a/tests/native/swap.cpp +++ b/tests/native/swap.cpp @@ -5,9 +5,9 @@ #include namespace { - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::swap_elements; TEST(BLAS1_swap, mdspan_double) diff --git a/tests/native/symm.cpp b/tests/native/symm.cpp index 45bd9384..4f476e0b 100644 --- a/tests/native/symm.cpp +++ b/tests/native/symm.cpp @@ -7,10 +7,10 @@ #include namespace { - using std::experimental::mdspan; - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::layout_left; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_left; using std::experimental::linalg::explicit_diagonal; using std::experimental::linalg::implicit_unit_diagonal; using std::experimental::linalg::lower_triangle; diff --git a/tests/native/transposed.cpp b/tests/native/transposed.cpp index 24ed4d56..72d8db31 100644 --- a/tests/native/transposed.cpp +++ b/tests/native/transposed.cpp @@ -6,9 +6,9 @@ #include namespace { - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::experimental::linalg::transposed; template diff --git a/tests/native/trmm.cpp b/tests/native/trmm.cpp index 70185745..e218d50c 100644 --- a/tests/native/trmm.cpp +++ b/tests/native/trmm.cpp @@ -12,11 +12,11 @@ namespace { using std::experimental::linalg::matrix_product; using std::experimental::linalg::transposed; using std::experimental::linalg::upper_triangle; - using std::experimental::dextents; - using std::experimental::dynamic_extent; - using std::experimental::extents; - using std::experimental::layout_left; - using std::experimental::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dextents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_left; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using std::cout; using std::endl; diff --git a/tests/native/trsm.cpp b/tests/native/trsm.cpp index 101c2752..fb3b7113 100644 --- a/tests/native/trsm.cpp +++ b/tests/native/trsm.cpp @@ -7,11 +7,11 @@ namespace { - using std::experimental::mdspan; - using std::experimental::dynamic_extent; - using std::experimental::dextents; - using std::experimental::layout_right; - using std::experimental::layout_left; + using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; + using MDSPAN_IMPL_STANDARD_NAMESPACE::dextents; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_right; + using MDSPAN_IMPL_STANDARD_NAMESPACE::layout_left; constexpr std::size_t num_rows_A = 3; constexpr std::size_t num_cols_A = 3; From 1153577a9d1c6bb9652b73619cd413ebfd00985e Mon Sep 17 00:00:00 2001 From: Alicia Klinvex <64440832+amklinv-nnl@users.noreply.github.com> Date: Mon, 12 Jun 2023 17:09:19 -0400 Subject: [PATCH 2/4] Fixed CI Was getting a test error about a missing glibc because the tests were being run in a container. Removed all references to the container. --- .github/workflows/cmake.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 285d5f55..35dc1e6f 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -102,8 +102,6 @@ jobs: test-stdBLAS: runs-on: ubuntu-latest - container: - image: amklinv/mdspan-dependencies:latest needs: build-stdblas steps: From 1e3d13df4c379a0899ef759d8e246e94fd2bf90d Mon Sep 17 00:00:00 2001 From: Alicia Klinvex Date: Wed, 14 Jun 2023 17:02:26 -0400 Subject: [PATCH 3/4] Fixes the include guards surrounding execution The include guards were failing for certain versions of GCC (such as 11.2.0) without TBB. This commit adds TBB as an optional dependency and disables anything involving execution if the build would fail. --- CMakeLists.txt | 12 ++++++++++ README.md | 2 ++ examples/01_scale.cpp | 10 +------- examples/02_matrix_vector_product_basic.cpp | 10 +------- .../__p1673_bits/linalg_config.h.in | 1 + .../__p1673_bits/linalg_execpolicy_mapper.hpp | 9 +++++-- include/experimental/__p1673_bits/macros.hpp | 24 +++++++++++++++++++ tests/native/gemv_no_ambig.cpp | 9 +------ 8 files changed, 49 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c528fa2..a2b7f0a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,6 +121,14 @@ option(LINALG_ENABLE_BLAS "Assume that we are linking with a BLAS library." ${BLAS_FOUND}) +find_package(TBB) +option(LINALG_ENABLE_TBB + "Enable TBB. Default: autodetect TBB installation." + ${TBB_FOUND}) +if(LINALG_ENABLE_TBB) + find_package(TBB REQUIRED) +endif() + find_package(KokkosKernels) option(LINALG_ENABLE_KOKKOS "Enable Kokkos-based implementation. Default: autodetect Kokkos installation." @@ -144,6 +152,10 @@ add_library(std::linalg ALIAS linalg) target_link_libraries(linalg INTERFACE std::mdspan) +if(LINALG_ENABLE_TBB) + target_link_libraries(linalg INTERFACE TBB::tbb) +endif() + if(LINALG_ENABLE_KOKKOS) target_link_libraries(linalg INTERFACE Kokkos::kokkos) target_link_libraries(linalg INTERFACE Kokkos::kokkoskernels) diff --git a/README.md b/README.md index 05240003..c8e3852f 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ Other compilers, including MSVC 2019, have been tested in the past. - If you want to build examples, set LINALG_ENABLE_EXAMPLES=ON - If you have a BLAS installation, set LINALG_ENABLE_BLAS=ON. BLAS support is currently experimental. + - If you have a TBB installation, set LINALG_ENABLE_TBB=ON. + TBB support is currently experimental. 4. Build and install as usual 5. If you enabled tests, use "ctest" to run them diff --git a/examples/01_scale.cpp b/examples/01_scale.cpp index 6734e4fe..53fcc4d4 100644 --- a/examples/01_scale.cpp +++ b/examples/01_scale.cpp @@ -2,14 +2,6 @@ #include -#if (! defined(__GNUC__)) || (__GNUC__ > 9) -# define MDSPAN_EXAMPLES_USE_EXECUTION_POLICIES 1 -#endif - -#ifdef MDSPAN_EXAMPLES_USE_EXECUTION_POLICIES -# include -#endif - // Make mdspan less verbose using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; @@ -30,7 +22,7 @@ int main(int argc, char* argv[]) { // Call linalg::scale x = 2.0*x; std::experimental::linalg::scale(2.0, x); -#ifdef MDSPAN_EXAMPLES_USE_EXECUTION_POLICIES +#ifdef LINALG_HAS_EXECUTION std::experimental::linalg::scale(std::execution::par, 2.0, x); #else std::experimental::linalg::scale(2.0, x); diff --git a/examples/02_matrix_vector_product_basic.cpp b/examples/02_matrix_vector_product_basic.cpp index ebb57c9d..ccabe659 100644 --- a/examples/02_matrix_vector_product_basic.cpp +++ b/examples/02_matrix_vector_product_basic.cpp @@ -2,14 +2,6 @@ #include -#if (! defined(__GNUC__)) || (__GNUC__ > 9) -# define MDSPAN_EXAMPLES_USE_EXECUTION_POLICIES 1 -#endif - -#ifdef MDSPAN_EXAMPLES_USE_EXECUTION_POLICIES -# include -#endif - // Make mdspan less verbose using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan; using MDSPAN_IMPL_STANDARD_NAMESPACE::extents; @@ -41,7 +33,7 @@ int main(int argc, char* argv[]) { std::experimental::linalg::matrix_vector_product(A, x, y); // y = 0.5 * y + 2 * A * x -#ifdef MDSPAN_EXAMPLES_USE_EXECUTION_POLICIES +#ifdef LINALG_HAS_EXECUTION std::experimental::linalg::matrix_vector_product(std::execution::par, std::experimental::linalg::scaled(2.0, A), x, std::experimental::linalg::scaled(0.5, y), y); diff --git a/include/experimental/__p1673_bits/linalg_config.h.in b/include/experimental/__p1673_bits/linalg_config.h.in index 5703497d..21ab176d 100644 --- a/include/experimental/__p1673_bits/linalg_config.h.in +++ b/include/experimental/__p1673_bits/linalg_config.h.in @@ -5,3 +5,4 @@ #cmakedefine LINALG_ENABLE_CONCEPTS #cmakedefine LINALG_ENABLE_KOKKOS #cmakedefine LINALG_ENABLE_KOKKOS_DEFAULT +#cmakedefine LINALG_ENABLE_TBB diff --git a/include/experimental/__p1673_bits/linalg_execpolicy_mapper.hpp b/include/experimental/__p1673_bits/linalg_execpolicy_mapper.hpp index 0f96b5bb..6624cd2d 100644 --- a/include/experimental/__p1673_bits/linalg_execpolicy_mapper.hpp +++ b/include/experimental/__p1673_bits/linalg_execpolicy_mapper.hpp @@ -1,6 +1,6 @@ // For GCC 9 (< 10), unconditionally includes a TBB header file. // If GCC < 10 was not built with TBB support, this causes a build error. -#if (! defined(__GNUC__)) || (__GNUC__ > 9) +#ifdef LINALG_HAS_EXECUTION #include #endif @@ -39,7 +39,12 @@ namespace experimental { inline namespace __p1673_version_0 { namespace linalg { template -auto execpolicy_mapper(T) { return std::experimental::linalg::impl::inline_exec_t(); } +auto execpolicy_mapper(const T& t) { +#ifdef LINALG_HAS_EXECUTION + if(is_execution_policy()) return t; +#endif + return std::experimental::linalg::impl::inline_exec_t(); +} } } } diff --git a/include/experimental/__p1673_bits/macros.hpp b/include/experimental/__p1673_bits/macros.hpp index a9ad8d2a..02ad11ac 100644 --- a/include/experimental/__p1673_bits/macros.hpp +++ b/include/experimental/__p1673_bits/macros.hpp @@ -43,6 +43,30 @@ #ifndef LINALG_INCLUDE_EXPERIMENTAL___P1673_BITS_MACROS_HPP_ #define LINALG_INCLUDE_EXPERIMENTAL___P1673_BITS_MACROS_HPP_ +#ifdef _MSVC_LANG +#define _LINALG_CPLUSPLUS _MSVC_LANG +#else +#define _LINALG_CPLUSPLUS __cplusplus +#endif + +#define LINALG_CXX_STD_14 201402L +#define LINALG_CXX_STD_17 201703L +#define LINALG_CXX_STD_20 202002L + +#define LINALG_HAS_CXX_14 (_LINALG_CPLUSPLUS >= LINALG_CXX_STD_14) +#define LINALG_HAS_CXX_17 (_LINALG_CPLUSPLUS >= LINALG_CXX_STD_17) +#define LINALG_HAS_CXX_20 (_LINALG_CPLUSPLUS >= LINALG_CXX_STD_20) + +static_assert(_LINALG_CPLUSPLUS >= LINALG_CXX_STD_17, "stdBLAS requires C++17 or later."); + +#if ! defined(__clang__) && ! defined(_MSC_VER) && defined(__GNUC__) +# if defined(LINALG_HAS_TBB) +# define LINALG_HAS_EXECUTION 1 +# endif +#else +# define LINALG_HAS_EXECUTION 1 +#endif + #define P1673_MATRIX_EXTENTS_TEMPLATE_PARAMETERS( MATRIX_NAME ) \ class SizeType_ ## MATRIX_NAME , \ ::std::size_t numRows_ ## MATRIX_NAME , \ diff --git a/tests/native/gemv_no_ambig.cpp b/tests/native/gemv_no_ambig.cpp index f7083edc..798b759d 100644 --- a/tests/native/gemv_no_ambig.cpp +++ b/tests/native/gemv_no_ambig.cpp @@ -5,13 +5,6 @@ #include #include -#if (! defined(__GNUC__)) || (__GNUC__ > 9) -# define MDSPAN_EXAMPLES_USE_EXECUTION_POLICIES 1 -#endif -#ifdef MDSPAN_EXAMPLES_USE_EXECUTION_POLICIES -# include -#endif - namespace { using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent; @@ -49,7 +42,7 @@ TEST(gemv, no_ambiguity) scaled(2.0, A), x, scaled(0.5, y), y); -#ifdef MDSPAN_EXAMPLES_USE_EXECUTION_POLICIES +#ifdef LINALG_HAS_EXECUTION matrix_vector_product(std::execution::par, scaled(2.0, A), x, scaled(0.5, y), y); From 85a4b17f67a87a76a51182f87d283a4caa845ad0 Mon Sep 17 00:00:00 2001 From: Alicia Klinvex Date: Fri, 16 Jun 2023 16:06:17 -0400 Subject: [PATCH 4/4] Fix incorrect macro name LINALG_HAS_TBB should have been LINALG_ENABLE_TBB. This change causes the only test using executors to fail. --- .../__p1673_bits/linalg_execpolicy_mapper.hpp | 13 +++++++++---- include/experimental/__p1673_bits/macros.hpp | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/include/experimental/__p1673_bits/linalg_execpolicy_mapper.hpp b/include/experimental/__p1673_bits/linalg_execpolicy_mapper.hpp index 6624cd2d..2f01c4bf 100644 --- a/include/experimental/__p1673_bits/linalg_execpolicy_mapper.hpp +++ b/include/experimental/__p1673_bits/linalg_execpolicy_mapper.hpp @@ -39,12 +39,17 @@ namespace experimental { inline namespace __p1673_version_0 { namespace linalg { template -auto execpolicy_mapper(const T& t) { -#ifdef LINALG_HAS_EXECUTION - if(is_execution_policy()) return t; -#endif +auto execpolicy_mapper(const T) { return std::experimental::linalg::impl::inline_exec_t(); } + +#ifdef LINALG_HAS_EXECUTION +template<> +auto execpolicy_mapper(const std::execution::parallel_policy) { + return std::execution::par; +} +#endif + } } } diff --git a/include/experimental/__p1673_bits/macros.hpp b/include/experimental/__p1673_bits/macros.hpp index 02ad11ac..7380e25f 100644 --- a/include/experimental/__p1673_bits/macros.hpp +++ b/include/experimental/__p1673_bits/macros.hpp @@ -60,7 +60,7 @@ static_assert(_LINALG_CPLUSPLUS >= LINALG_CXX_STD_17, "stdBLAS requires C++17 or later."); #if ! defined(__clang__) && ! defined(_MSC_VER) && defined(__GNUC__) -# if defined(LINALG_HAS_TBB) +# if defined(LINALG_ENABLE_TBB) # define LINALG_HAS_EXECUTION 1 # endif #else