Files
project_6/cccl_upstream/thrust/thrust/mr/disjoint_sync_pool.h
EngineX CI 56fd68e7dd [INFRA] Import NVIDIA/CCCL upstream as optimization reference library
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
2026-07-30 09:35:51 +00:00

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