-
Notifications
You must be signed in to change notification settings - Fork 135
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Enable internal use of
std::allocator
related functionality (#1583)
* Move `algin` into its own file * Move `uses_allocator` to their own file * Move `allocator_traits` into their own file * Add `__allocation_guard` helper * Move `allocator_arg_t` into tis own file * Move `__allocator_destructor` into its own file * Implement `allocate_at_least` * Move `allocator` to its own file
- Loading branch information
Showing
58 changed files
with
4,829 additions
and
1,430 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
55 changes: 55 additions & 0 deletions
55
libcudacxx/include/cuda/std/detail/libcxx/include/__memory/align.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,55 @@ | ||
// -*- 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___MEMORY_ALIGN_H | ||
#define _LIBCUDACXX___MEMORY_ALIGN_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/cstddef> | ||
#include <cuda/std/cstdint> | ||
|
||
_CCCL_DIAG_PUSH | ||
_CCCL_DIAG_SUPPRESS_MSVC(4146) // unary minus operator applied to unsigned type, result still unsigned | ||
|
||
_LIBCUDACXX_BEGIN_NAMESPACE_STD | ||
|
||
inline _LIBCUDACXX_INLINE_VISIBILITY void* align(size_t __alignment, size_t __size, void*& __ptr, size_t& __space) | ||
{ | ||
if (__space < __size) | ||
{ | ||
return nullptr; | ||
} | ||
|
||
const auto __intptr = reinterpret_cast<uintptr_t>(__ptr); | ||
const auto __aligned = (__intptr - 1u + __alignment) & -__alignment; | ||
const auto __diff = __aligned - __intptr; | ||
if (__diff > (__space - __size)) | ||
{ | ||
return nullptr; | ||
} | ||
__space -= __diff; | ||
return __ptr = reinterpret_cast<void*>(__aligned); | ||
} | ||
|
||
_LIBCUDACXX_END_NAMESPACE_STD | ||
|
||
_CCCL_DIAG_POP | ||
|
||
#endif // _LIBCUDACXX___MEMORY_ALIGN_H |
80 changes: 80 additions & 0 deletions
80
libcudacxx/include/cuda/std/detail/libcxx/include/__memory/allocate_at_least.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,80 @@ | ||
// -*- 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___MEMORY_ALLOCATE_AT_LEAST_H | ||
#define _LIBCUDACXX___MEMORY_ALLOCATE_AT_LEAST_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/cstddef> | ||
#include <cuda/std/detail/libcxx/include/__memory/allocator_traits.h> | ||
|
||
_LIBCUDACXX_BEGIN_NAMESPACE_STD | ||
|
||
#if _CCCL_STD_VER >= 2023 | ||
template <class _Pointer> | ||
struct allocation_result | ||
{ | ||
_Pointer ptr; | ||
size_t count; | ||
}; | ||
_LIBCUDACXX_CTAD_SUPPORTED_FOR_TYPE(allocation_result); | ||
|
||
template <class _Alloc> | ||
_LIBCUDACXX_NODISCARD_ATTRIBUTE _LIBCUDACXX_HIDE_FROM_ABI _LIBCUDACXX_INLINE_VISIBILITY constexpr allocation_result< | ||
typename allocator_traits<_Alloc>::pointer> | ||
allocate_at_least(_Alloc& __alloc, size_t __n) | ||
{ | ||
if constexpr (requires { __alloc.allocate_at_least(__n); }) | ||
{ | ||
return __alloc.allocate_at_least(__n); | ||
} | ||
else | ||
{ | ||
return {__alloc.allocate(__n), __n}; | ||
} | ||
} | ||
|
||
template <class _Alloc> | ||
_LIBCUDACXX_NODISCARD_ATTRIBUTE _LIBCUDACXX_HIDE_FROM_ABI _LIBCUDACXX_INLINE_VISIBILITY constexpr auto | ||
__allocate_at_least(_Alloc& __alloc, size_t __n) | ||
{ | ||
return _CUDA_VSTD::allocate_at_least(__alloc, __n); | ||
} | ||
#else // ^^^ _CCCL_STD_VER >= 2023 ^^^ / vvv _CCCL_STD_VER < 2023 vvv | ||
template <class _Pointer> | ||
struct __allocation_result | ||
{ | ||
_Pointer ptr; | ||
size_t count; | ||
}; | ||
|
||
template <class _Alloc> | ||
_LIBCUDACXX_NODISCARD_ATTRIBUTE _LIBCUDACXX_HIDE_FROM_ABI _LIBCUDACXX_INLINE_VISIBILITY constexpr __allocation_result< | ||
typename allocator_traits<_Alloc>::pointer> | ||
__allocate_at_least(_Alloc& __alloc, size_t __n) | ||
{ | ||
return {__alloc.allocate(__n), __n}; | ||
} | ||
|
||
#endif // _CCCL_STD_VER >= 2023 | ||
|
||
_LIBCUDACXX_END_NAMESPACE_STD | ||
|
||
#endif // _LIBCUDACXX___MEMORY_ALLOCATE_AT_LEAST_H |
97 changes: 97 additions & 0 deletions
97
libcudacxx/include/cuda/std/detail/libcxx/include/__memory/allocation_guard.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,97 @@ | ||
// -*- 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) 2023 NVIDIA CORPORATION & AFFILIATES. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef _LIBCUDACXX___MEMORY_ALLOCATION_GUARD_H | ||
#define _LIBCUDACXX___MEMORY_ALLOCATION_GUARD_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/cstddef> | ||
#include <cuda/std/detail/libcxx/include/__memory/allocator_traits.h> | ||
#include <cuda/std/detail/libcxx/include/__utility/move.h> | ||
|
||
_LIBCUDACXX_BEGIN_NAMESPACE_STD | ||
|
||
// Helper class to allocate memory using an Allocator in an exception safe | ||
// manner. | ||
// | ||
// The intended usage of this class is as follows: | ||
// | ||
// 0 | ||
// 1 __allocation_guard<SomeAllocator> guard(alloc, 10); | ||
// 2 do_some_initialization_that_may_throw(guard.__get()); | ||
// 3 save_allocated_pointer_in_a_noexcept_operation(guard.__release_ptr()); | ||
// 4 | ||
// | ||
// If line (2) throws an exception during initialization of the memory, the | ||
// guard's destructor will be called, and the memory will be released using | ||
// Allocator deallocation. Otherwise, we release the memory from the guard on | ||
// line (3) in an operation that can't throw -- after that, the guard is not | ||
// responsible for the memory anymore. | ||
// | ||
// This is similar to a unique_ptr, except it's easier to use with a | ||
// custom allocator. | ||
|
||
_CCCL_NV_DIAG_SUPPRESS(2659) // constexpr non-static member function will not be implicitly 'const' in C++14 | ||
|
||
template <class _Alloc> | ||
struct __allocation_guard | ||
{ | ||
using _Pointer = typename allocator_traits<_Alloc>::pointer; | ||
using _Size = typename allocator_traits<_Alloc>::size_type; | ||
|
||
template <class _AllocT> // we perform the allocator conversion inside the constructor | ||
_LIBCUDACXX_HIDE_FROM_ABI _LIBCUDACXX_INLINE_VISIBILITY _CCCL_CONSTEXPR_CXX20 explicit __allocation_guard( | ||
_AllocT __alloc, _Size __n) | ||
: __alloc_(_CUDA_VSTD::move(__alloc)) | ||
, __n_(__n) | ||
, __ptr_(allocator_traits<_Alloc>::allocate(__alloc_, __n_)) // initialization order is important | ||
{} | ||
|
||
_LIBCUDACXX_HIDE_FROM_ABI _LIBCUDACXX_INLINE_VISIBILITY _CCCL_CONSTEXPR_CXX20 ~__allocation_guard() noexcept | ||
{ | ||
if (__ptr_ != nullptr) | ||
{ | ||
allocator_traits<_Alloc>::deallocate(__alloc_, __ptr_, __n_); | ||
} | ||
} | ||
|
||
_LIBCUDACXX_HIDE_FROM_ABI _LIBCUDACXX_INLINE_VISIBILITY _CCCL_CONSTEXPR_CXX14 _Pointer __release_ptr() noexcept | ||
{ // not called __release() because it's a keyword in objective-c++ | ||
_Pointer __tmp = __ptr_; | ||
__ptr_ = nullptr; | ||
return __tmp; | ||
} | ||
|
||
_LIBCUDACXX_HIDE_FROM_ABI _LIBCUDACXX_INLINE_VISIBILITY constexpr _Pointer __get() const noexcept | ||
{ | ||
return __ptr_; | ||
} | ||
|
||
private: | ||
_Alloc __alloc_; | ||
_Size __n_; | ||
_Pointer __ptr_; | ||
}; | ||
|
||
_CCCL_NV_DIAG_DEFAULT(2659) | ||
|
||
_LIBCUDACXX_END_NAMESPACE_STD | ||
|
||
#endif // _LIBCUDACXX___MEMORY_ALLOCATION_GUARD_H |
Oops, something went wrong.