Class: TensorStream::OpenCLBuffer

Inherits:
Buffer
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

Methods included from CLEventHelpers

#build_event_wait_list

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

#bufferObject

Returns the value of attribute buffer.



47
48
49
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 47

def buffer
  @buffer
end

#cl_bufferObject

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

#opObject

Returns the value of attribute op.



47
48
49
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 47

def op
  @op
end

#ownerObject

Returns the value of attribute owner.



47
48
49
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 47

def owner
  @owner
end

#shapeObject

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_queueObject



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

Returns:

  • (Boolean)


63
64
65
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 63

def empty_value?
  @shape == [0]
end

#inspectObject



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_rubyObject



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_elementsObject



59
60
61
# File 'lib/tensor_stream/opencl/opencl_buffer.rb', line 59

def total_elements
  shape.reduce(:*) || 1
end