2

我目前正在尝试桥接Numo::NArrayand FFI,以便 FFIPointer可以访问 a 中的原始数据,Numo::NArray而不必像现在这样复制数据String(从而导致 GC 流失和浪费的额外副本)。

Numo::NArray有一个被调用的 C 函数nary_get_pointer_for_read_write,它已经被使用Numo::FFTW。但是,这个函数的参数是 CRuby 的内部VALUE类型,我还没有找到VALUE使用 FFI 传递它的方法。

这是我想尝试的非工作草稿。如果这不可能,我的下一步可能是编写另一个 C 扩展 gem 来进行桥接,然后可能会尝试 PR 一个函数来获取一个 FFI 指针到 numo-narray 项目中。

require 'numo/narray'
require 'ffi'

module NArrayFFI
  ffi_lib FFI::CURRENT_PROCESS
  attach_function :nary_get_pointer_for_read, [:RAW_RUBY_VALUE_IF_FFI_CAN_DO_THIS], :pointer
  attach_function :nary_get_pointer_for_write, [:RAW_RUBY_VALUE_IF_FFI_CAN_DO_THIS], :pointer
  attach_function :nary_get_pointer_for_read_write, [:RAW_RUBY_VALUE_IF_FFI_CAN_DO_THIS], :pointer
end

data = Numo::SFloat[1,2,3,4,5]
data_ptr = NArrayFFI.nary_get_pointer_for_read_write(data)
SomeOtherFFI.function_that_takes_pointer(data_ptr)

那么,是否可以将VALUERuby 值的原始值传递给使用 FFI 附加的函数?


以下是我到目前为止检查过的参考资料,没有答案,但可能对其他有类似问题的人有用:

4

0 回答 0