Class: TensorStream::OpenCLBuffer
- Inherits:
-
Buffer
- Object
- Buffer
- TensorStream::OpenCLBuffer
- Includes:
- ArrayOpsHelper, CLEventHelpers
- Defined in:
- lib/tensor_stream/opencl/opencl_buffer.rb
Overview
Buffer used by the OpenCL evaluator
Defined Under Namespace
Classes: LazyBuffer
Instance Attribute Summary collapse
-
#buffer ⇒ Object
Returns the value of attribute buffer.
-
#cl_buffer ⇒ Object
Returns the value of attribute cl_buffer.
-
#op ⇒ Object
Returns the value of attribute op.
-
#owner ⇒ Object
Returns the value of attribute owner.
-
#shape ⇒ Object
Returns the value of attribute shape.
Class Method Summary collapse
- .allocate_narray_for_type(data_type, narray_size) ⇒ Object
- .nil_buffer(owner, name, data_type) ⇒ Object
Instance Method Summary collapse
- #buffer! ⇒ Object
- #command_queue ⇒ Object
- #empty_value? ⇒ Boolean
-
#initialize(owner, data_type:, shape:, buffer:, cl_buffer:, op: nil, name: nil) ⇒ OpenCLBuffer
constructor
A new instance of OpenCLBuffer.
- #inspect ⇒ Object
- #to_ruby ⇒ Object
- #total_elements ⇒ Object
Methods included from CLEventHelpers
Constructor Details
#initialize(owner, data_type:, shape:, buffer:, cl_buffer:, op: nil, name: nil) ⇒ OpenCLBuffer
Returns a new instance of OpenCLBuffer.
49 50 51 52 53 54 55 56 57 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 49 def initialize(owner, data_type:, shape:, buffer:, cl_buffer:, op: nil, name: nil) @data_type = data_type @shape = shape @buffer = buffer @cl_buffer = cl_buffer @name = name @op = op @owner = owner end |
Instance Attribute Details
#buffer ⇒ Object
Returns the value of attribute buffer.
47 48 49 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 47 def buffer @buffer end |
#cl_buffer ⇒ Object
Returns the value of attribute cl_buffer.
47 48 49 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 47 def cl_buffer @cl_buffer end |
#op ⇒ Object
Returns the value of attribute op.
47 48 49 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 47 def op @op end |
#owner ⇒ Object
Returns the value of attribute owner.
47 48 49 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 47 def owner @owner end |
#shape ⇒ Object
Returns the value of attribute shape.
47 48 49 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 47 def shape @shape end |
Class Method Details
.allocate_narray_for_type(data_type, narray_size) ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 117 def self.allocate_narray_for_type(data_type, narray_size) case data_type when :float, :float32, :float16 NArray.sfloat(narray_size) when :float64 NArray.float(narray_size) when :int, :int32, :int64, :uint64, :uint32 # NArray does not have 64 bit int types NArray.int(narray_size) when :int16, :uint16 NArray.sint(narray_size) when :uint8, :int8 NArray.byte(narray_size) when :boolean NArray.byte(narray_size) when :string NArray.byte(narray_size) when :unknown nil else raise "unsupported type #{data_type}" end end |
.nil_buffer(owner, name, data_type) ⇒ Object
113 114 115 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 113 def self.nil_buffer(owner, name, data_type) OpenCLBuffer.new(owner, name: name, data_type: data_type, shape: [0], buffer: nil, cl_buffer: nil) end |
Instance Method Details
#buffer! ⇒ Object
71 72 73 74 75 76 77 78 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 71 def buffer! return buffer if buffer.is_a?(NArray) @buffer = OpenCLBuffer.allocate_narray_for_type(buffer.data_type, buffer.size) if buffer.is_a?(LazyBuffer) command_queue.enqueue_read_buffer(cl_buffer, @buffer, blocking: true, event_wait_list: build_event_wait_list([self])) @buffer end |
#command_queue ⇒ Object
80 81 82 83 84 85 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 80 def command_queue @command_queue ||= begin first_op = op.is_a?(Array) ? op.first : op first_op.command_queue end end |
#empty_value? ⇒ Boolean
63 64 65 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 63 def empty_value? @shape == [0] end |
#inspect ⇒ Object
67 68 69 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 67 def inspect "CLBuffer(name: #{name} shape: #{shape || "?"} data_type: #{data_type}, cl_allocated: #{cl_buffer ? cl_buffer.size : 'unallocated'}) -> raw: #{buffer.to_a}" end |
#to_ruby ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 87 def to_ruby buffer! if buffer.is_a?(LazyBuffer) return [] if buffer.empty? if dirty command_queue.enqueue_read_buffer(cl_buffer, buffer, event_wait_list: [op].compact) command_queue.finish self.dirty = false end if shape.empty? return case data_type when :string buffer.to_s when :boolean buffer[0] != 0 else buffer[0] end end result = buffer.reshape(*shape.map(&:to_i).reverse).to_a data_type == :boolean ? process_function_op(result) { |a, _b| a != 0 } : result end |
#total_elements ⇒ Object
59 60 61 |
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 59 def total_elements shape.reduce(:*) || 1 end |