From 0a334965c93b7db3b24d97d21b22e23a58233eb0 Mon Sep 17 00:00:00 2001 From: fbusato Date: Tue, 26 Nov 2024 00:18:59 +0000 Subject: [PATCH] add scaled unit test --- libcudacxx/include/cuda/std/__linalg/scaled.h | 18 ++-- .../mdspan/linalg.accessor/access.pass.cpp | 29 ----- .../mdspan/linalg.accessor/copy.pass.cpp | 31 ------ .../mdspan/linalg.accessor/members.pass.cpp | 101 ++++++++++++++++++ 4 files changed, 110 insertions(+), 69 deletions(-) delete mode 100644 libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/access.pass.cpp delete mode 100644 libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/copy.pass.cpp create mode 100644 libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/members.pass.cpp diff --git a/libcudacxx/include/cuda/std/__linalg/scaled.h b/libcudacxx/include/cuda/std/__linalg/scaled.h index 90f8d8e3d3d..b3df1c03f2c 100644 --- a/libcudacxx/include/cuda/std/__linalg/scaled.h +++ b/libcudacxx/include/cuda/std/__linalg/scaled.h @@ -68,11 +68,11 @@ template class scaled_accessor { public: - using __element_type = _CUDA_VSTD::add_const_t< - decltype(_CUDA_VSTD::declval<_ScalingFactor>() * _CUDA_VSTD::declval())>; - using __reference = _CUDA_VSTD::remove_const_t<__element_type>; - using __data_handle_type = typename _NestedAccessor::__data_handle_type; - using __offset_policy = scaled_accessor<_ScalingFactor, typename _NestedAccessor::__offset_policy>; + using element_type = _CUDA_VSTD::add_const_t< + decltype(_CUDA_VSTD::declval<_ScalingFactor>() * _CUDA_VSTD::declval())>; + using reference = _CUDA_VSTD::remove_const_t; + using data_handle_type = typename _NestedAccessor::data_handle_type; + using offset_policy = scaled_accessor<_ScalingFactor, typename _NestedAccessor::offset_policy>; _CCCL_HIDE_FROM_ABI constexpr scaled_accessor() = default; @@ -90,13 +90,13 @@ class scaled_accessor , __nested_accessor_(__a) {} - _LIBCUDACXX_HIDE_FROM_ABI constexpr __reference access(__data_handle_type __p, size_t __i) const + _LIBCUDACXX_HIDE_FROM_ABI constexpr reference access(data_handle_type __p, size_t __i) const { - return __scaling_factor_ * typename _NestedAccessor::__element_type(__nested_accessor_.access(__p, __i)); + return __scaling_factor_ * typename _NestedAccessor::element_type(__nested_accessor_.access(__p, __i)); } _LIBCUDACXX_HIDE_FROM_ABI - typename __offset_policy::__data_handle_type constexpr offset(__data_handle_type __p, size_t __i) const + typename offset_policy::data_handle_type constexpr offset(data_handle_type __p, size_t __i) const { return __nested_accessor_.offset(__p, __i); } @@ -121,7 +121,7 @@ namespace __detail template using __scaled_element_type = - _CUDA_VSTD::add_const_t::__element_type>; + _CUDA_VSTD::add_const_t::element_type>; } // namespace __detail diff --git a/libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/access.pass.cpp b/libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/access.pass.cpp deleted file mode 100644 index 70b6080c115..00000000000 --- a/libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/access.pass.cpp +++ /dev/null @@ -1,29 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++11 -// UNSUPPORTED: msvc && c++14, msvc && c++17 - -#include -#include - -int main(int, char**) -{ - { - using element_t = int; - cuda::std::array d{42, 43}; - cuda::std::mdspan md(d.data(), 2); - auto scaled_md = cuda::std::linalg::scaled(2, md); // scaled - - assert(scaled_md(0) == 42 * 2); - assert(scaled_md(1) == 43 * 2); - } - - return 0; -} diff --git a/libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/copy.pass.cpp b/libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/copy.pass.cpp deleted file mode 100644 index 0f1c58a1b74..00000000000 --- a/libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/copy.pass.cpp +++ /dev/null @@ -1,31 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++11 -// UNSUPPORTED: msvc && c++14, msvc && c++17 - -#include -#include - -int main(int, char**) -{ - { - using element_t = int; - cuda::std::array d{42, 43}; - cuda::std::default_accessor a0; - cuda::std::default_accessor a(a0); - - assert(a.access(d.data(), 0) == 42); - assert(a.access(d.data(), 1) == 43); - assert(a.offset(d.data(), 0) == d.data()); - assert(a.offset(d.data(), 1) == d.data() + 1); - } - - return 0; -} diff --git a/libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/members.pass.cpp b/libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/members.pass.cpp new file mode 100644 index 00000000000..24e455ceee2 --- /dev/null +++ b/libcudacxx/test/libcudacxx/std/containers/views/mdspan/linalg.accessor/members.pass.cpp @@ -0,0 +1,101 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++11 +// UNSUPPORTED: msvc && c++14, msvc && c++17 + +#include +#include +#include + +int main(int, char**) +{ + // operator() value + { + using element_t = int; + cuda::std::array d{42, 43}; + cuda::std::mdspan md(d.data(), 2); + auto scaled_md = cuda::std::linalg::scaled(2, md); + + assert(scaled_md(0) == 42 * 2); + assert(scaled_md(1) == 43 * 2); + } + // operator() type + { + using element_t = int; + cuda::std::array d{42, 43}; + cuda::std::mdspan md(d.data(), 2); + auto scaled_md = cuda::std::linalg::scaled(2.0f, md); + + static_assert(cuda::std::is_same::value, "wrong type"); + static_cast(scaled_md); + } + // access() + { + using element_t = int; + cuda::std::array d{42, 43}; + cuda::std::mdspan md(d.data(), 2); + auto scaled_md = cuda::std::linalg::scaled(2, md); + + assert(scaled_md.accessor().access(d.data(), 1) == 43 * 2); + } + // offset() + { + using element_t = int; + cuda::std::array d{42, 43}; + cuda::std::mdspan md(d.data(), 2); + auto scaled_md = cuda::std::linalg::scaled(2, md); + + assert(scaled_md.accessor().offset(d.data(), 1) == d.data() + 1); + } + // scaling_factor() + { + using element_t = int; + cuda::std::array d{42, 43}; + cuda::std::mdspan md(d.data(), 2); + auto scaled_md = cuda::std::linalg::scaled(2, md); + + assert(scaled_md.accessor().scaling_factor() == 2); + } + // nested_accessor() + { + using element_t = int; + cuda::std::array d{42, 43}; + cuda::std::mdspan md(d.data(), 2); + auto scaled_md = cuda::std::linalg::scaled(2, md); + + static_assert(cuda::std::is_same>::value, + "wrong type"); + static_cast(scaled_md); + } + // composition + { + using element_t = int; + cuda::std::array d{42, 43}; + cuda::std::mdspan md(d.data(), 2); + auto scaled_md1 = cuda::std::linalg::scaled(2, md); + auto scaled_md2 = cuda::std::linalg::scaled(3, scaled_md1); + + assert(scaled_md2(0) == 42 * 2 * 3); + assert(scaled_md2(1) == 43 * 2 * 3); + } + // copy constructor + { + using element_t = int; + cuda::std::array d{42, 43}; + cuda::std::mdspan md(d.data(), 2); + auto scaled_md1 = cuda::std::linalg::scaled(2, md); + auto scaled_md2 = scaled_md1; + + assert(scaled_md2(0) == 42 * 2); + assert(scaled_md2(1) == 43 * 2); + } + return 0; +}