Class: Ignis::Memory::PoolMemoryResource
- Inherits:
-
DeviceMemoryResource
- Object
- DeviceMemoryResource
- Ignis::Memory::PoolMemoryResource
- Defined in:
- lib/nvruby/memory/pool_memory_resource.rb
Overview
Coalescing best-fit pool memory resource Pre-allocates a large pool and sub-allocates from it Inspired by RMM’s pool_memory_resource
Defined Under Namespace
Classes: Block
Constant Summary collapse
- DEFAULT_INITIAL_SIZE =
Default initial pool size: 256MB
256 * 1024 * 1024
- DEFAULT_MAX_RATIO =
Default maximum pool size: 90% of device memory
0.9
Constants inherited from DeviceMemoryResource
DeviceMemoryResource::ALIGNMENT
Instance Attribute Summary collapse
-
#current_pool_size ⇒ Integer
readonly
Current pool size.
-
#maximum_pool_size ⇒ Integer
readonly
Maximum pool size.
Attributes inherited from DeviceMemoryResource
Instance Method Summary collapse
-
#destroy! ⇒ void
Release all pool memory back to upstream.
-
#initialize(upstream: nil, initial_pool_size: DEFAULT_INITIAL_SIZE, maximum_pool_size: nil, device_index: nil) ⇒ PoolMemoryResource
constructor
A new instance of PoolMemoryResource.
-
#pool_stats ⇒ Hash
Pool statistics.
-
#supports_streams? ⇒ Boolean
False - synchronous pool allocation.
Methods inherited from DeviceMemoryResource
#allocate, #deallocate, #inspect, #is_equal?, #to_s
Constructor Details
#initialize(upstream: nil, initial_pool_size: DEFAULT_INITIAL_SIZE, maximum_pool_size: nil, device_index: nil) ⇒ PoolMemoryResource
Returns a new instance of PoolMemoryResource.
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/nvruby/memory/pool_memory_resource.rb', line 30 def initialize( upstream: nil, initial_pool_size: DEFAULT_INITIAL_SIZE, maximum_pool_size: nil, device_index: nil ) super(device_index: device_index) @upstream = upstream || CudaMemoryResource.new(device_index: @device_index) @initial_pool_size = align_up(initial_pool_size) @maximum_pool_size = maximum_pool_size || calculate_max_pool_size @maximum_pool_size = align_up(@maximum_pool_size) @current_pool_size = 0 @blocks = [] @free_list = [] allocate_initial_pool! end |
Instance Attribute Details
#current_pool_size ⇒ Integer (readonly)
Returns Current pool size.
21 22 23 |
# File 'lib/nvruby/memory/pool_memory_resource.rb', line 21 def current_pool_size @current_pool_size end |
#maximum_pool_size ⇒ Integer (readonly)
Returns Maximum pool size.
24 25 26 |
# File 'lib/nvruby/memory/pool_memory_resource.rb', line 24 def maximum_pool_size @maximum_pool_size end |
Instance Method Details
#destroy! ⇒ void
This method returns an undefined value.
Release all pool memory back to upstream
57 58 59 60 61 62 63 64 65 66 |
# File 'lib/nvruby/memory/pool_memory_resource.rb', line 57 def destroy! @mutex.synchronize do @blocks.each do |block| @upstream.deallocate(block.ptr, block.size, stream: nil) end @blocks.clear @free_list.clear @current_pool_size = 0 end end |
#pool_stats ⇒ Hash
Returns Pool statistics.
69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/nvruby/memory/pool_memory_resource.rb', line 69 def pool_stats @mutex.synchronize do total_free = @free_list.sum(&:size) { current_pool_size: @current_pool_size, maximum_pool_size: @maximum_pool_size, free_bytes: total_free, used_bytes: @current_pool_size - total_free, block_count: @blocks.size, free_block_count: @free_list.size } end end |
#supports_streams? ⇒ Boolean
Returns false - synchronous pool allocation.
51 52 53 |
# File 'lib/nvruby/memory/pool_memory_resource.rb', line 51 def supports_streams? false end |