问题描述
我目前正在尝试桥接 Numo::NArray
和 FFI
,以便 FFI Pointer
可以访问 Numo::NArray
中的原始数据而无需 {{3} } (因此会导致 GC 流失和浪费额外的副本)。
有一个由 Numo::NArray
公开的 C 函数,名为 nary_get_pointer_for_read_write
,这是 Numo::FFTW
的 copy data through String
like I do now。但是,此函数的参数是 CRuby 的内部 VALUE
类型,我还没有找到使用 FFI 传递 VALUE
的方法。
这是我想尝试的非工作草稿。如果这不可能,我的下一步可能是编写另一个 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,:pointer
attach_function :nary_get_pointer_for_read_write,: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)
那么,是否可以将 Ruby 值的原始 VALUE
传递给使用 FFI 附加的函数?
以下是我迄今为止检查过的参考资料,没有答案,但可能对其他有类似问题的人有用:
- used already
- Ruby's C extension docs
- An open issue on Numo::NArray asking the same question
- The header definitions from Numo::NArray
- The source code of Numo::FFTW
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)