Module: GRX::CAPI

Extended by:
Fiddle::Importer
Defined in:
lib/grx/c_api.rb

Constant Summary collapse

CANDIDATE_NAMES =
case RUBY_PLATFORM
when /mingw|mswin|windows/i
  ["grx_core.dll", "libgrx_core.dll", "grx_core.so", "libgrx_core.so"]
when /darwin/i
  ["libgrx_core.dylib", "grx_core.bundle", "libgrx_core.so", "grx_core.so"]
else
  ["libgrx_core.so", "grx_core.so", "libgrx_core.dylib", "grx_core.dll"]
end
SEARCH_DIRS =

Search directories including standard Gem extension build paths

begin
  dirs = [
    File.expand_path(__dir__),                     # lib/grx/
    File.expand_path("..", __dir__),              # lib/
    File.expand_path("../../ext/grx", __dir__),    # ext/grx/
    File.expand_path("../../ext/unix", __dir__),   # ext/unix/
    File.expand_path("../../ext/windows", __dir__) # ext/windows/
  ]

  # Gem extensions build directory (RubyGems standard)
  if defined?(Gem) && Gem.loaded_specs["grx-tensor"]
    ext_dir = Gem.loaded_specs["grx-tensor"].extension_dir
    dirs << ext_dir if ext_dir && File.directory?(ext_dir)
    dirs << File.join(ext_dir, "grx") if ext_dir && File.directory?(File.join(ext_dir, "grx"))
  end

  # Ruby sitearch / vendorarch directories
  sitearch = RbConfig::CONFIG["sitearchdir"]
  dirs << sitearch if sitearch && File.directory?(sitearch)

  dirs.uniq.freeze
end
LIB_PATHS =
SEARCH_DIRS.flat_map do |dir|
  CANDIDATE_NAMES.flat_map do |name|
    [
      File.join(dir, name),
      File.join(dir, name).tr("/", "\\")
    ]
  end
end.uniq.freeze
LOADED_PATH =
LIB_PATHS.find { |p| File.file?(p) && File.exist?(p) }
LOADED =
begin
  if LOADED_PATH
    dlload LOADED_PATH
    true
  else
    false
  end
rescue Fiddle::DLError => e
  warn "[GRX] C extension load error: #{e.message}\n" \
       "      -> Running in pure Ruby fallback mode."
  false
end

Class Method Summary collapse

Class Method Details

.simd_modeObject



120
121
122
123
124
125
126
127
128
129
130
# File 'lib/grx/c_api.rb', line 120

def self.simd_mode
  return :ruby unless LOADED

  case grx_simd_level
  when 2 then :avx2
  when 1 then :sse
  else :scalar
  end
rescue StandardError
  :scalar
end