-
Notifications
You must be signed in to change notification settings - Fork 206
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[REVIEW] Allow construction of cuda_async_memory_resource from existing pool #889
Merged
rapids-bot
merged 10 commits into
rapidsai:branch-22.04
from
fkallen:non-owning-cuda-async-mr
Mar 23, 2022
Merged
Changes from 2 commits
Commits
Show all changes
10 commits
Select commit
Hold shift + click to select a range
5aa77a7
Allow construction of cuda_async_memory_resource from existing memory…
fkallen d42e54f
cuda_pool_wrapper
fkallen 2a03700
Merge remote-tracking branch 'upstream/branch-22.02' into non-owning-…
fkallen 2b9e02f
Name cuda_async_view_memory_resource. Remove constructor which takes …
fkallen bb7135b
Formatting
fkallen b50b333
Avoid repeated nullptr check
fkallen 7c4e166
Merge branch 'rapidsai:branch-22.04' into non-owning-cuda-async-mr
fkallen 2df8cb8
Fix formatting
fkallen 959f155
Merge remote-tracking branch 'upstream/branch-22.04'
fkallen c1a9603
Add cudart api wrapper for cudaDeviceGetDefaultMemPool
fkallen File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,175 @@ | ||
/* | ||
* Copyright (c) 2021, NVIDIA CORPORATION. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
#pragma once | ||
|
||
#include <rmm/cuda_device.hpp> | ||
#include <rmm/cuda_stream_view.hpp> | ||
#include <rmm/detail/cuda_util.hpp> | ||
#include <rmm/detail/error.hpp> | ||
#include <rmm/mr/device/device_memory_resource.hpp> | ||
|
||
#include <thrust/optional.h> | ||
|
||
#include <cuda_runtime_api.h> | ||
|
||
#include <cstddef> | ||
#include <limits> | ||
|
||
#if CUDART_VERSION >= 11020 // 11.2 introduced cudaMallocAsync | ||
#define RMM_CUDA_MALLOC_ASYNC_SUPPORT | ||
#endif | ||
|
||
namespace rmm::mr { | ||
|
||
/** | ||
* @brief `device_memory_resource` derived class that uses `cudaMallocAsync`/`cudaFreeAsync` for | ||
* allocation/deallocation. | ||
*/ | ||
class cuda_pool_wrapper final : public device_memory_resource { | ||
public: | ||
|
||
#ifdef RMM_CUDA_MALLOC_ASYNC_SUPPORT | ||
/** | ||
* @brief Constructs a cuda_pool_wrapper which uses an existing CUDA memory pool. | ||
* The provided pool is not owned by cuda_pool_wrapper and must remain valid | ||
* during the lifetime of the memory resource. | ||
* | ||
* @throws rmm::runtime_error if the CUDA version does not support `cudaMallocAsync` | ||
* | ||
* @param valid_pool_handle Handle to a CUDA memory pool which will be used to | ||
* serve allocation requests. | ||
*/ | ||
cuda_pool_wrapper(cudaMemPool_t valid_pool_handle) | ||
: cuda_pool_handle_{[valid_pool_handle]() { | ||
RMM_EXPECTS(nullptr != valid_pool_handle, "Unexpected null pool handle."); | ||
return valid_pool_handle; | ||
}()} | ||
{ | ||
// Check if cudaMallocAsync Memory pool supported | ||
auto const device = rmm::detail::current_device(); | ||
int cuda_pool_supported{}; | ||
auto result = | ||
cudaDeviceGetAttribute(&cuda_pool_supported, cudaDevAttrMemoryPoolsSupported, device.value()); | ||
RMM_EXPECTS(result == cudaSuccess && cuda_pool_supported, | ||
"cudaMallocAsync not supported with this CUDA driver/runtime version"); | ||
} | ||
#endif | ||
|
||
#ifdef RMM_CUDA_MALLOC_ASYNC_SUPPORT | ||
/** | ||
* @brief Returns the underlying native handle to the CUDA pool | ||
* | ||
*/ | ||
[[nodiscard]] cudaMemPool_t pool_handle() const noexcept { return cuda_pool_handle_; } | ||
#endif | ||
|
||
cuda_pool_wrapper() = default; | ||
cuda_pool_wrapper(cuda_pool_wrapper const&) = default; | ||
cuda_pool_wrapper(cuda_pool_wrapper&&) = default; | ||
cuda_pool_wrapper& operator=(cuda_pool_wrapper const&) = default; | ||
cuda_pool_wrapper& operator=(cuda_pool_wrapper&&) = default; | ||
|
||
/** | ||
* @brief Query whether the resource supports use of non-null CUDA streams for | ||
* allocation/deallocation. `cuda_memory_resource` does not support streams. | ||
* | ||
* @returns bool true | ||
*/ | ||
[[nodiscard]] bool supports_streams() const noexcept override { return true; } | ||
|
||
/** | ||
* @brief Query whether the resource supports the get_mem_info API. | ||
* | ||
* @return true | ||
*/ | ||
[[nodiscard]] bool supports_get_mem_info() const noexcept override { return false; } | ||
|
||
private: | ||
#ifdef RMM_CUDA_MALLOC_ASYNC_SUPPORT | ||
cudaMemPool_t cuda_pool_handle_{}; | ||
#endif | ||
|
||
/** | ||
* @brief Allocates memory of size at least `bytes` using cudaMalloc. | ||
* | ||
* The returned pointer has at least 256B alignment. | ||
* | ||
* @throws `rmm::bad_alloc` if the requested allocation could not be fulfilled | ||
* | ||
* @param bytes The size, in bytes, of the allocation | ||
* @return void* Pointer to the newly allocated memory | ||
*/ | ||
void* do_allocate(std::size_t bytes, rmm::cuda_stream_view stream) override | ||
{ | ||
void* ptr{nullptr}; | ||
#ifdef RMM_CUDA_MALLOC_ASYNC_SUPPORT | ||
if (bytes > 0) { | ||
RMM_CUDA_TRY(cudaMallocFromPoolAsync(&ptr, bytes, pool_handle(), stream.value()), | ||
rmm::bad_alloc); | ||
} | ||
#else | ||
(void)bytes; | ||
(void)stream; | ||
#endif | ||
return ptr; | ||
} | ||
|
||
/** | ||
* @brief Deallocate memory pointed to by \p p. | ||
* | ||
* @throws Nothing. | ||
* | ||
* @param p Pointer to be deallocated | ||
*/ | ||
void do_deallocate(void* ptr, std::size_t, rmm::cuda_stream_view stream) override | ||
{ | ||
#ifdef RMM_CUDA_MALLOC_ASYNC_SUPPORT | ||
if (ptr != nullptr) { RMM_ASSERT_CUDA_SUCCESS(cudaFreeAsync(ptr, stream.value())); } | ||
#else | ||
(void)ptr; | ||
(void)stream; | ||
#endif | ||
} | ||
|
||
/** | ||
* @brief Compare this resource to another. | ||
* | ||
* @throws Nothing. | ||
* | ||
* @param other The other resource to compare to | ||
* @return true If the two resources are equivalent | ||
* @return false If the two resources are not equal | ||
*/ | ||
[[nodiscard]] bool do_is_equal(device_memory_resource const& other) const noexcept override | ||
{ | ||
return dynamic_cast<cuda_pool_wrapper const*>(&other) != nullptr; | ||
} | ||
|
||
/** | ||
* @brief Get free and available memory for memory resource | ||
* | ||
* @throws `rmm::cuda_error` if unable to retrieve memory info. | ||
* | ||
* @return std::pair contaiing free_size and total_size of memory | ||
*/ | ||
[[nodiscard]] std::pair<std::size_t, std::size_t> do_get_mem_info( | ||
rmm::cuda_stream_view) const override | ||
{ | ||
return std::make_pair(0, 0); | ||
} | ||
}; | ||
|
||
} // namespace rmm::mr |
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
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we still need this ctor with the
cuda_pool_wrapper
?