module CooCoo::CUDA::DeviceBuffer::FFI

Public Class Methods

buffer_function(*args) click to toggle source
# File lib/coo-coo/cuda/device_buffer/ffi.rb, line 11
        def self.buffer_function(*args)
          if args.size == 3
            func, args, return_type = args
            meth = func
          elsif args.size == 4
            meth, func, args, return_type = args
          else
            raise ArgumentError.new("Wrong number of arguments: (given #{args.size}, expected 3 or 4")
          end

          attach_function("buffer_#{func}", args, return_type)

          caller = if return_type.kind_of?(Symbol)
                     :call_func
                   else
                     :call_buffer
                   end
          
          class_eval <<-EOT
            def self.#{meth}(*call_args)
              #{caller}(:#{func}, *call_args)
            end
          EOT
        end
call_buffer(func, *args) click to toggle source
# File lib/coo-coo/cuda/device_buffer/ffi.rb, line 95
def self.call_buffer(func, *args)
  retries = 0
  r = send("buffer_#{func}", *args)
  raise NullResultError.new if r.null?
  r
rescue NullResultError
  raise if retries > 1
  retries += 1
  CUDA.collect_garbage
  retry
end
call_func(func, *args) click to toggle source
# File lib/coo-coo/cuda/device_buffer/ffi.rb, line 89
def self.call_func(func, *args)
  r = send("buffer_#{func}", *args)
  raise APIError.new(r) if r != 0
  r
end