Class: Ignis::Memory::PoolMemoryResource

Inherits:
DeviceMemoryResource show all
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

Attributes inherited from DeviceMemoryResource

#device_index

Instance Method Summary collapse

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.

Parameters:

  • upstream (DeviceMemoryResource) (defaults to: nil)

    Upstream resource for pool allocations

  • initial_pool_size (Integer) (defaults to: DEFAULT_INITIAL_SIZE)

    Initial pool size in bytes

  • maximum_pool_size (Integer, nil) (defaults to: nil)

    Maximum pool size (nil = 90% of device memory)

  • device_index (Integer, nil) (defaults to: nil)

    GPU device index



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_sizeInteger (readonly)

Returns Current pool size.

Returns:

  • (Integer)

    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_sizeInteger (readonly)

Returns Maximum pool size.

Returns:

  • (Integer)

    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_statsHash

Returns Pool statistics.

Returns:

  • (Hash)

    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.

Returns:

  • (Boolean)

    false - synchronous pool allocation



51
52
53
# File 'lib/nvruby/memory/pool_memory_resource.rb', line 51

def supports_streams?
  false
end