-
Notifications
You must be signed in to change notification settings - Fork 166
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Expose
<cuda/std/numeric>
to be publicly available (#1671)
* 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
Showing
62 changed files
with
4,762 additions
and
645 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]]` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
68
libcudacxx/include/cuda/std/__numeric/adjacent_difference.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.