Skip to content

Commit

Permalink
Expose <cuda/std/numeric> to be publicly available (#1671)
Browse files Browse the repository at this point in the history
* Adopt `cuda::std::plus` to also work in C++11

* Move `std::accumulate` to its own file

* Move `std::reduce` to its own file

* Move `std::inner_product` to its own file

* Move `std::transform_reduce` to its own file

* Move `std::partial_sum` to its own file

* Move `std::exclusive_scan` into its own file

* Move `std::inclusive_scan` into its own file

* Move `std::transform_exclusive_scan` into its own file

* Move `std::transform_inclusive_scan` to its own file

* Move `std::adjacent_difference` to its own file

* Move `std::iota` to its own file

* Move `std::gcm` and `std::lcm` into their own file

* Move `std::midpoint` to its own file

* Publicly expose `<cuda/std/numeric>`

* Add documentation for `<cuda/std/numeric>`
  • Loading branch information
miscco authored Apr 30, 2024
1 parent 41301ce commit d1e5229
Show file tree
Hide file tree
Showing 62 changed files with 4,762 additions and 645 deletions.
9 changes: 1 addition & 8 deletions libcudacxx/docs/standard_api/numerics_library.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,4 @@ Any Standard C++ header not listed below is omitted.
| [`<cuda/std/cfloat>`](https://en.cppreference.com/w/cpp/header/cfloat) | Limits of floating point types. <br/><br/> 1.0.0 / CUDA 10.2 |
| [`<cuda/std/climits>`](https://en.cppreference.com/w/cpp/header/climits) | Limits of integral types. <br/><br/> 1.0.0 / CUDA 10.2 |
| [`<cuda/std/cstdint>`](https://en.cppreference.com/w/cpp/header/cstdint) | Fixed-width integer types. <br/><br/> 1.0.0 / CUDA 10.2 |


[`<cuda/std/complex>`]: https://en.cppreference.com/w/cpp/header/complex
[`<cuda/std/ccomplex>`]: https://en.cppreference.com/w/cpp/header/ccomplex
[`<cuda/std/ratio>`]: https://en.cppreference.com/w/cpp/header/ratio
[`<cuda/std/cfloat>`]: https://en.cppreference.com/w/cpp/header/cfloat
[`<cuda/std/climits>`]: https://en.cppreference.com/w/cpp/header/climits
[`<cuda/std/cstdint>`]: https://en.cppreference.com/w/cpp/header/cstdint
| [`<cuda/std/numeric>`](https://en.cppreference.com/w/cpp/header/numeric) | Numeric algorithms (see also: [libcu++ Specifics]({{ "standard_api/numerics_library/numeric.html" | relative_url }})). <br/><br/> 2.5.0 |
18 changes: 18 additions & 0 deletions libcudacxx/docs/standard_api/numerics_library/numeric.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
grand_parent: Standard API
parent: Numerics Library
nav_order: 3
---

# `<cuda/std/numeric>`

## Omissions

* Currently we do not expose any parallel algorithms.
* Saturation arithmetics have not been implemented yet

## Extensions

* All features of `<numeric>` are made available in C++11 onwards
* All features of `<numeric>` are made constexpr in C++14 onwards
* Algorithms that return a value have been marked `[[nodiscard]]`
18 changes: 0 additions & 18 deletions libcudacxx/include/cuda/std/__functional/operations.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,7 @@ _LIBCUDACXX_BEGIN_NAMESPACE_STD

// Arithmetic operations

#if _CCCL_STD_VER > 2011
template <class _Tp = void>
#else
template <class _Tp>
#endif
struct _LIBCUDACXX_TEMPLATE_VIS plus : __binary_function<_Tp, _Tp, _Tp>
{
typedef _Tp __result_type; // used by valarray
Expand All @@ -45,7 +41,6 @@ struct _LIBCUDACXX_TEMPLATE_VIS plus : __binary_function<_Tp, _Tp, _Tp>
};
_LIBCUDACXX_CTAD_SUPPORTED_FOR_TYPE(plus);

#if _CCCL_STD_VER > 2011
template <>
struct _LIBCUDACXX_TEMPLATE_VIS plus<void>
{
Expand All @@ -59,7 +54,6 @@ struct _LIBCUDACXX_TEMPLATE_VIS plus<void>
}
typedef void is_transparent;
};
#endif

#if _CCCL_STD_VER > 2011
template <class _Tp = void>
Expand Down Expand Up @@ -93,11 +87,7 @@ struct _LIBCUDACXX_TEMPLATE_VIS minus<void>
};
#endif

#if _CCCL_STD_VER > 2011
template <class _Tp = void>
#else
template <class _Tp>
#endif
struct _LIBCUDACXX_TEMPLATE_VIS multiplies : __binary_function<_Tp, _Tp, _Tp>
{
typedef _Tp __result_type; // used by valarray
Expand All @@ -109,7 +99,6 @@ struct _LIBCUDACXX_TEMPLATE_VIS multiplies : __binary_function<_Tp, _Tp, _Tp>
};
_LIBCUDACXX_CTAD_SUPPORTED_FOR_TYPE(multiplies);

#if _CCCL_STD_VER > 2011
template <>
struct _LIBCUDACXX_TEMPLATE_VIS multiplies<void>
{
Expand All @@ -123,7 +112,6 @@ struct _LIBCUDACXX_TEMPLATE_VIS multiplies<void>
}
typedef void is_transparent;
};
#endif

#if _CCCL_STD_VER > 2011
template <class _Tp = void>
Expand Down Expand Up @@ -189,11 +177,7 @@ struct _LIBCUDACXX_TEMPLATE_VIS modulus<void>
};
#endif

#if _CCCL_STD_VER > 2011
template <class _Tp = void>
#else
template <class _Tp>
#endif
struct _LIBCUDACXX_TEMPLATE_VIS negate : __unary_function<_Tp, _Tp>
{
typedef _Tp __result_type; // used by valarray
Expand All @@ -205,7 +189,6 @@ struct _LIBCUDACXX_TEMPLATE_VIS negate : __unary_function<_Tp, _Tp>
};
_LIBCUDACXX_CTAD_SUPPORTED_FOR_TYPE(negate);

#if _CCCL_STD_VER > 2011
template <>
struct _LIBCUDACXX_TEMPLATE_VIS negate<void>
{
Expand All @@ -218,7 +201,6 @@ struct _LIBCUDACXX_TEMPLATE_VIS negate<void>
}
typedef void is_transparent;
};
#endif

// Bitwise operations

Expand Down
2 changes: 1 addition & 1 deletion libcudacxx/include/cuda/std/__mdspan/layout_stride.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
#include <cuda/std/__utility/integer_sequence.h>
#include <cuda/std/__utility/move.h>
#include <cuda/std/array>
#include <cuda/std/detail/libcxx/include/numeric>
#include <cuda/std/numeric>
#if __MDSPAN_USE_CONCEPTS && __MDSPAN_HAS_CXX_20
# include <cuda/std/concepts>
#endif // __MDSPAN_USE_CONCEPTS && __MDSPAN_HAS_CXX_20
Expand Down
53 changes: 53 additions & 0 deletions libcudacxx/include/cuda/std/__numeric/accumulate.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of libcu++, the C++ Standard Library for your entire system,
// 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) 2024 NVIDIA CORPORATION & AFFILIATES.
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCUDACXX___NUMERIC_ACCUMULATE_H
#define _LIBCUDACXX___NUMERIC_ACCUMULATE_H

#include <cuda/std/detail/__config>

#if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC)
# pragma GCC system_header
#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG)
# pragma clang system_header
#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC)
# pragma system_header
#endif // no system header

#include <cuda/std/__utility/move.h>

_LIBCUDACXX_BEGIN_NAMESPACE_STD

template <class _InputIterator, class _Tp>
_CCCL_NODISCARD _LIBCUDACXX_INLINE_VISIBILITY _CCCL_CONSTEXPR_CXX14 _Tp
accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
{
for (; __first != __last; ++__first)
{
__init = _CUDA_VSTD::move(__init) + *__first;
}
return __init;
}

template <class _InputIterator, class _Tp, class _BinaryOperation>
_CCCL_NODISCARD _LIBCUDACXX_INLINE_VISIBILITY _CCCL_CONSTEXPR_CXX14 _Tp
accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op)
{
for (; __first != __last; ++__first)
{
__init = __binary_op(_CUDA_VSTD::move(__init), *__first);
}
return __init;
}

_LIBCUDACXX_END_NAMESPACE_STD

#endif // _LIBCUDACXX___NUMERIC_ACCUMULATE_H
68 changes: 68 additions & 0 deletions libcudacxx/include/cuda/std/__numeric/adjacent_difference.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of libcu++, the C++ Standard Library for your entire system,
// 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) 2024 NVIDIA CORPORATION & AFFILIATES.
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCUDACXX___NUMERIC_ADJACENT_DIFFERENCE_H
#define _LIBCUDACXX___NUMERIC_ADJACENT_DIFFERENCE_H

#include <cuda/std/detail/__config>

#if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC)
# pragma GCC system_header
#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG)
# pragma clang system_header
#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC)
# pragma system_header
#endif // no system header

#include <cuda/std/__iterator/iterator_traits.h>
#include <cuda/std/__utility/move.h>

_LIBCUDACXX_BEGIN_NAMESPACE_STD

template <class _InputIterator, class _OutputIterator>
_LIBCUDACXX_INLINE_VISIBILITY _CCCL_CONSTEXPR_CXX14 _OutputIterator
adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
{
if (__first != __last)
{
typename iterator_traits<_InputIterator>::value_type __acc(*__first);
*__result = __acc;
for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
{
typename iterator_traits<_InputIterator>::value_type __val(*__first);
*__result = __val - _CUDA_VSTD::move(__acc);
__acc = _CUDA_VSTD::move(__val);
}
}
return __result;
}

template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
_LIBCUDACXX_INLINE_VISIBILITY _CCCL_CONSTEXPR_CXX14 _OutputIterator adjacent_difference(
_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryOperation __binary_op)
{
if (__first != __last)
{
typename iterator_traits<_InputIterator>::value_type __acc(*__first);
*__result = __acc;
for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
{
typename iterator_traits<_InputIterator>::value_type __val(*__first);
*__result = __binary_op(__val, _CUDA_VSTD::move(__acc));
__acc = _CUDA_VSTD::move(__val);
}
}
return __result;
}

_LIBCUDACXX_END_NAMESPACE_STD

#endif // _LIBCUDACXX___NUMERIC_ADJACENT_DIFFERENCE_H
62 changes: 62 additions & 0 deletions libcudacxx/include/cuda/std/__numeric/exclusive_scan.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of libcu++, the C++ Standard Library for your entire system,
// 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) 2024 NVIDIA CORPORATION & AFFILIATES.
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCUDACXX___NUMERIC_EXCLUSIVE_SCAN_H
#define _LIBCUDACXX___NUMERIC_EXCLUSIVE_SCAN_H

#include <cuda/std/detail/__config>

#if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC)
# pragma GCC system_header
#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG)
# pragma clang system_header
#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC)
# pragma system_header
#endif // no system header

#include <cuda/std/__functional/operations.h>
#include <cuda/std/__utility/move.h>

_LIBCUDACXX_BEGIN_NAMESPACE_STD

template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp>
_LIBCUDACXX_INLINE_VISIBILITY _CCCL_CONSTEXPR_CXX14 _OutputIterator
exclusive_scan(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp __init, _BinaryOp __b)
{
if (__first != __last)
{
_Tp __tmp(__b(__init, *__first));
while (true)
{
*__result = _CUDA_VSTD::move(__init);
++__result;
++__first;
if (__first == __last)
{
break;
}
__init = _CUDA_VSTD::move(__tmp);
__tmp = __b(__init, *__first);
}
}
return __result;
}

template <class _InputIterator, class _OutputIterator, class _Tp>
_LIBCUDACXX_INLINE_VISIBILITY _CCCL_CONSTEXPR_CXX14 _OutputIterator
exclusive_scan(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp __init)
{
return _CUDA_VSTD::exclusive_scan(__first, __last, __result, __init, _CUDA_VSTD::plus<>());
}

_LIBCUDACXX_END_NAMESPACE_STD

#endif // _LIBCUDACXX___NUMERIC_EXCLUSIVE_SCAN_H
Loading

0 comments on commit d1e5229

Please sign in to comment.