Module: FFTW3::Threads

Defined in:
lib/fftw3/threads.rb

Class Method Summary collapse

Class Method Details

.cleanup(precision: :double) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/fftw3/threads.rb', line 25

def self.cleanup(precision: :double)
  return unless @initialized[precision]

  pfx = FFTW3::FFI.prefix_for(precision)
  thread_module_for(precision).send(:"#{pfx}cleanup_threads")
  @initialized[precision] = false
end

.init(precision: :double) ⇒ Object



9
10
11
12
13
14
15
16
17
# File 'lib/fftw3/threads.rb', line 9

def self.init(precision: :double)
  return if @initialized[precision]

  pfx = FFTW3::FFI.prefix_for(precision)
  result = thread_module_for(precision).send(:"#{pfx}init_threads")
  raise FFTW3::Error::PlanError, "Failed to init FFTW threads" if result == 0

  @initialized[precision] = true
end

.make_planner_thread_safe(precision: :double) ⇒ Object



41
42
43
44
45
46
47
# File 'lib/fftw3/threads.rb', line 41

def self.make_planner_thread_safe(precision: :double)
  init(precision: precision) unless @initialized[precision]
  return nil unless thread_module_for(precision).make_planner_thread_safe_supported?

  pfx = FFTW3::FFI.prefix_for(precision)
  thread_module_for(precision).send(:"#{pfx}make_planner_thread_safe")
end

.plan_with_nthreads(nthreads, precision: :double) ⇒ Object



19
20
21
22
23
# File 'lib/fftw3/threads.rb', line 19

def self.plan_with_nthreads(nthreads, precision: :double)
  init(precision: precision) unless @initialized[precision]
  pfx = FFTW3::FFI.prefix_for(precision)
  thread_module_for(precision).send(:"#{pfx}plan_with_nthreads", nthreads)
end

.planner_nthreads(precision: :double) ⇒ Object



33
34
35
36
37
38
39
# File 'lib/fftw3/threads.rb', line 33

def self.planner_nthreads(precision: :double)
  init(precision: precision) unless @initialized[precision]
  return nil unless thread_module_for(precision).planner_nthreads_supported?

  pfx = FFTW3::FFI.prefix_for(precision)
  thread_module_for(precision).send(:"#{pfx}planner_nthreads")
end

.set_callback(callback = nil, data: nil, precision: :double, &block) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/fftw3/threads.rb', line 53

def self.set_callback(callback = nil, data: nil, precision: :double, &block)
  callback ||= block
  validate_callback!(callback)

  thread_mod = thread_module_for(precision)
  return nil unless thread_mod.threads_set_callback_supported?

  pfx = FFTW3::FFI.prefix_for(precision)
  function = build_parallel_loop_function(callback)
  data_ptr = normalize_data_pointer(data)

  thread_mod.send(:"#{pfx}threads_set_callback", function, data_ptr)
  @callback_state[precision] = { callback: callback, function: function, data: data }
  true
end

.set_callback_supported?(precision: :double) ⇒ Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/fftw3/threads.rb', line 49

def self.set_callback_supported?(precision: :double)
  thread_module_for(precision).threads_set_callback_supported?
end