Class: Ignis::CUDA::PinnedMemory

Inherits:
Object
  • Object
show all
Defined in:
lib/nvruby/cuda/memory.rb

Overview

Pinned (page-locked) host memory for faster transfers.

Uses RuntimeAPI.host_alloc (Fiddle) instead of FFI::MemoryPointer.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(size) ⇒ PinnedMemory

Returns a new instance of PinnedMemory.

Parameters:

  • size (Integer)

    Size in bytes to allocate



330
331
332
333
334
335
336
337
# File 'lib/nvruby/cuda/memory.rb', line 330

def initialize(size)
  @size = size
  @host_ptr = allocate_pinned_memory
  @freed = false

  captured_ptr = @host_ptr
  ObjectSpace.define_finalizer(self, self.class.release_finalizer(captured_ptr))
end

Instance Attribute Details

#host_ptrFiddle::Pointer (readonly)

Returns Host pointer.

Returns:

  • (Fiddle::Pointer)

    Host pointer



324
325
326
# File 'lib/nvruby/cuda/memory.rb', line 324

def host_ptr
  @host_ptr
end

#sizeInteger (readonly)

Returns Size in bytes.

Returns:

  • (Integer)

    Size in bytes



327
328
329
# File 'lib/nvruby/cuda/memory.rb', line 327

def size
  @size
end

Class Method Details

.release_finalizer(ptr) ⇒ Proc

Create a finalizer for releasing pinned memory.

Parameters:

  • ptr (Fiddle::Pointer)

Returns:

  • (Proc)


387
388
389
390
391
392
393
394
395
396
397
# File 'lib/nvruby/cuda/memory.rb', line 387

def release_finalizer(ptr)
  ptr_addr = ptr.to_i
  proc do
    begin
      RuntimeAPI.ensure_loaded!
      RuntimeAPI.free_host(Fiddle::Pointer.new(ptr_addr))
    rescue StandardError
      # Silently ignore errors during finalization
    end
  end
end

Instance Method Details

#free!void

This method returns an undefined value.

Free the pinned memory.



346
347
348
349
350
351
352
353
354
# File 'lib/nvruby/cuda/memory.rb', line 346

def free!
  return if @freed

  RuntimeAPI.ensure_loaded!
  RuntimeAPI.free_host(@host_ptr)

  @freed = true
  ObjectSpace.undefine_finalizer(self)
end

#freed?Boolean

Returns:

  • (Boolean)


340
341
342
# File 'lib/nvruby/cuda/memory.rb', line 340

def freed?
  @freed
end

#read(count, offset: 0) ⇒ String

Read data from the pinned memory.

Parameters:

  • count (Integer)

    Number of bytes to read

  • offset (Integer) (defaults to: 0)

    Offset in bytes

Returns:

  • (String)

Raises:



371
372
373
374
375
376
# File 'lib/nvruby/cuda/memory.rb', line 371

def read(count, offset: 0)
  raise MemoryError, 'Memory has been freed' if @freed
  raise MemoryError, 'Read exceeds buffer size' if offset + count > @size

  @host_ptr[offset, count]
end

#to_ptrFiddle::Pointer

Returns:

  • (Fiddle::Pointer)


379
380
381
# File 'lib/nvruby/cuda/memory.rb', line 379

def to_ptr
  @host_ptr
end

#write(data, offset: 0) ⇒ void

This method returns an undefined value.

Write data to the pinned memory.

Parameters:

  • data (String)

    Data to write

  • offset (Integer) (defaults to: 0)

    Offset in bytes

Raises:



360
361
362
363
364
365
# File 'lib/nvruby/cuda/memory.rb', line 360

def write(data, offset: 0)
  raise MemoryError, 'Memory has been freed' if @freed
  raise MemoryError, 'Write exceeds buffer size' if offset + data.bytesize > @size

  @host_ptr[offset, data.bytesize] = data
end