CCCL (CUDA C++ Core Libraries) provides: - CUB: device/block/warp-level GPU primitives (reduce, scan, sort, topk) - Thrust: high-level parallel algorithms (transform_reduce, sort, scan) - libcudacxx: CUDA C++ standard library (atomics, barriers, memory) - cudax: experimental features (memory resources, allocators) - Tuning policies: per-SM hardware-specific algorithm parameters Competition optimization vectors mapped to CCCL: - Output TPS (83% weight): warp_reduce, block_reduce, device_topk - Input TPS (14% weight): device_scan, block_load, prefetch - Cache TPS (3% weight): prefix caching strategy patterns - Memory (0.9 util): pooled/cached/buddy allocators Source: https://github.com/NVIDIA/cccl (shallow clone, HEAD only) License: Apache-2.0
103 lines
3.2 KiB
C++
103 lines
3.2 KiB
C++
// SPDX-FileCopyrightText: Copyright (c) 2018, NVIDIA Corporation. All rights reserved.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
/*! \file
|
|
* \brief A mutex-synchronized version of \p disjoint_unsynchronized_pool_resource.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <thrust/detail/config.h>
|
|
|
|
#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 <thrust/mr/disjoint_pool.h>
|
|
|
|
#include <mutex>
|
|
|
|
THRUST_NAMESPACE_BEGIN
|
|
namespace mr
|
|
{
|
|
/*! \addtogroup memory_resources Memory Resources
|
|
* \ingroup memory_management
|
|
* \{
|
|
*/
|
|
|
|
/*! A mutex-synchronized version of \p disjoint_unsynchronized_pool_resource. Uses \p std::mutex, and therefore requires
|
|
* C++11.
|
|
*
|
|
* \tparam Upstream the type of memory resources that will be used for allocating memory blocks to be handed off to the
|
|
* user \tparam Bookkeeper the type of memory resources that will be used for allocating bookkeeping memory
|
|
*/
|
|
template <typename Upstream, typename Bookkeeper>
|
|
struct disjoint_synchronized_pool_resource : public memory_resource<typename Upstream::pointer>
|
|
{
|
|
using unsync_pool = disjoint_unsynchronized_pool_resource<Upstream, Bookkeeper>;
|
|
using lock_t = std::scoped_lock<std::mutex>;
|
|
|
|
using void_ptr = typename Upstream::pointer;
|
|
|
|
public:
|
|
/*! Get the default options for a disjoint pool. These are meant to be a sensible set of values for many use cases,
|
|
* and as such, may be tuned in the future. This function is exposed so that creating a set of options that are
|
|
* just a slight departure from the defaults is easy.
|
|
*/
|
|
static pool_options get_default_options()
|
|
{
|
|
return unsync_pool::get_default_options();
|
|
}
|
|
|
|
/*! Constructor.
|
|
*
|
|
* \param upstream the upstream memory resource for allocations
|
|
* \param bookkeeper the upstream memory resource for bookkeeping
|
|
* \param options pool options to use
|
|
*/
|
|
disjoint_synchronized_pool_resource(
|
|
Upstream* upstream, Bookkeeper* bookkeeper, pool_options options = get_default_options())
|
|
: upstream_pool(upstream, bookkeeper, options)
|
|
{}
|
|
|
|
/*! Constructor. Upstream and bookkeeping resources are obtained by calling \p get_global_resource for their types.
|
|
*
|
|
* \param options pool options to use
|
|
*/
|
|
disjoint_synchronized_pool_resource(pool_options options = get_default_options())
|
|
: upstream_pool(get_global_resource<Upstream>(), get_global_resource<Bookkeeper>(), options)
|
|
{}
|
|
|
|
/*! Releases all held memory to upstream.
|
|
*/
|
|
void release()
|
|
{
|
|
lock_t lock(mtx);
|
|
upstream_pool.release();
|
|
}
|
|
|
|
[[nodiscard]] void_ptr do_allocate(std::size_t bytes, std::size_t alignment = THRUST_MR_DEFAULT_ALIGNMENT) override
|
|
{
|
|
lock_t lock(mtx);
|
|
return upstream_pool.do_allocate(bytes, alignment);
|
|
}
|
|
|
|
void do_deallocate(void_ptr p, std::size_t n, std::size_t alignment = THRUST_MR_DEFAULT_ALIGNMENT) override
|
|
{
|
|
lock_t lock(mtx);
|
|
upstream_pool.do_deallocate(p, n, alignment);
|
|
}
|
|
|
|
private:
|
|
std::mutex mtx;
|
|
unsync_pool upstream_pool;
|
|
};
|
|
|
|
/*! \} // memory_resources
|
|
*/
|
|
} // namespace mr
|
|
THRUST_NAMESPACE_END
|