Class: Ignis::CUDA::PinnedMemory
- Inherits:
-
Object
- Object
- Ignis::CUDA::PinnedMemory
- 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
-
#host_ptr ⇒ Fiddle::Pointer
readonly
Host pointer.
-
#size ⇒ Integer
readonly
Size in bytes.
Class Method Summary collapse
-
.release_finalizer(ptr) ⇒ Proc
Create a finalizer for releasing pinned memory.
Instance Method Summary collapse
-
#free! ⇒ void
Free the pinned memory.
- #freed? ⇒ Boolean
-
#initialize(size) ⇒ PinnedMemory
constructor
A new instance of PinnedMemory.
-
#read(count, offset: 0) ⇒ String
Read data from the pinned memory.
- #to_ptr ⇒ Fiddle::Pointer
-
#write(data, offset: 0) ⇒ void
Write data to the pinned memory.
Constructor Details
#initialize(size) ⇒ PinnedMemory
Returns a new instance of PinnedMemory.
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_ptr ⇒ Fiddle::Pointer (readonly)
Returns Host pointer.
324 325 326 |
# File 'lib/nvruby/cuda/memory.rb', line 324 def host_ptr @host_ptr end |
#size ⇒ Integer (readonly)
Returns 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.
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
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.
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_ptr ⇒ 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.
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 |