Module: Ignis::Memory

Defined in:
lib/nvruby/memory.rb,
lib/nvruby/memory/stats.rb,
lib/nvruby/memory/cuda_memory_resource.rb,
lib/nvruby/memory/pool_memory_resource.rb,
lib/nvruby/memory/device_memory_resource.rb,
lib/nvruby/memory/cuda_async_memory_resource.rb,
lib/nvruby/memory/pinned_host_memory_resource.rb

Overview

Memory management module providing RMM-inspired GPU memory pools

This module provides efficient memory allocation for GPU workloads through:

  • DeviceMemoryResource: Base class for all device memory allocators

  • CudaMemoryResource: Simple cudaMalloc/cudaFree (baseline)

  • CudaAsyncMemoryResource: Stream-ordered cudaMallocAsync/cudaFreeAsync

  • PoolMemoryResource: Coalescing best-fit pool for high-frequency allocations

  • PinnedHostMemoryResource: Page-locked host memory for fast transfers

Examples:

Using a memory pool

# Set global pool for all allocations
pool = Ignis::Memory::PoolMemoryResource.new(initial_pool_size: 512.megabytes)
Ignis::Memory.set_current_device_resource(pool)

# All NvArray allocations now use the pool
arr = Ignis::NvArray.new(shape: [1024, 1024], dtype: :float32)

Stream-ordered allocation

async_mr = Ignis::Memory::CudaAsyncMemoryResource.new
ptr = async_mr.allocate(1024 * 1024, stream: my_stream)
# ...use ptr...
async_mr.deallocate(ptr, 1024 * 1024, stream: my_stream)

Defined Under Namespace

Classes: CudaAsyncMemoryResource, CudaMemoryResource, DeviceMemoryResource, HostMemoryResource, PinnedHostMemoryResource, PoolMemoryResource, Stats

Class Method Summary collapse

Class Method Details

.allocate(bytes, stream: nil) ⇒ FFI::Pointer

Allocate device memory using current resource

Parameters:

Returns:

  • (FFI::Pointer)


97
98
99
# File 'lib/nvruby/memory.rb', line 97

def allocate(bytes, stream: nil)
  get_current_device_resource.allocate(bytes, stream: stream)
end

.deallocate(ptr, bytes, stream: nil) ⇒ void

This method returns an undefined value.

Deallocate device memory using current resource

Parameters:



106
107
108
# File 'lib/nvruby/memory.rb', line 106

def deallocate(ptr, bytes, stream: nil)
  get_current_device_resource.deallocate(ptr, bytes, stream: stream)
end

.get_current_device_resourceDeviceMemoryResource

Get the current device memory resource Creates a default PoolMemoryResource if none is set



39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/nvruby/memory.rb', line 39

def get_current_device_resource
  device_id = current_device_index
  resource = per_device_resources[device_id]
  return resource if resource

  if Ignis.configuration.use_memory_pool
    resource = PoolMemoryResource.new(device_index: device_id)
  else
    resource = CudaMemoryResource.new(device_index: device_id)
  end

  per_device_resources[device_id] = resource
  resource
end

.get_per_device_resource(device_id) ⇒ DeviceMemoryResource?

Get memory resource for a specific device

Parameters:

  • device_id (Integer)

Returns:



67
68
69
# File 'lib/nvruby/memory.rb', line 67

def get_per_device_resource(device_id)
  per_device_resources[device_id]
end

.reset_stats!void

This method returns an undefined value.

Reset memory statistics



89
90
91
# File 'lib/nvruby/memory.rb', line 89

def reset_stats!
  Stats.reset!
end

.set_current_device_resource(resource) ⇒ DeviceMemoryResource

Set the current device memory resource

Parameters:

Returns:



57
58
59
60
61
62
# File 'lib/nvruby/memory.rb', line 57

def set_current_device_resource(resource)
  device_id = current_device_index
  old = per_device_resources[device_id]
  per_device_resources[device_id] = resource
  old
end

.set_per_device_resource(device_id, resource) ⇒ DeviceMemoryResource

Set memory resource for a specific device

Parameters:

Returns:



75
76
77
78
79
# File 'lib/nvruby/memory.rb', line 75

def set_per_device_resource(device_id, resource)
  old = per_device_resources[device_id]
  per_device_resources[device_id] = resource
  old
end

.statsHash

Get memory statistics

Returns:

  • (Hash)


83
84
85
# File 'lib/nvruby/memory.rb', line 83

def stats
  Stats.snapshot
end