我目前正在尝试桥接Numo::NArray
and 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)
那么,是否可以将VALUE
Ruby 值的原始值传递给使用 FFI 附加的函数?
以下是我到目前为止检查过的参考资料,没有答案,但可能对其他有类似问题的人有用: