能否通过Ruby FFI传递Ruby(C API) VALUE至函数?Numo::NArray场景
如何通过FFI传递Ruby对象的原始VALUE给Numo::NArray的C函数?
我最近在尝试做Numo::NArray和FFI的桥接,核心目标是让FFI的Pointer不用通过String复制数据就能直接访问Numo::NArray的原始内存——这样能避免GC波动和不必要的数据拷贝,性能会好很多。
我了解到Numo::NArray暴露了一个名为nary_get_pointer_for_read_write的C函数,而且Numo::FFTW已经在使用它了,但问题在于这个函数的参数是CRuby内部的VALUE类型,我至今没找到通过FFI传递这个VALUE的正确方式。
下面是我写的一段没法正常工作的代码草稿:
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)
如果这种直接用FFI的方式走不通,我的下一步计划是自己写一个C扩展gem来做这个桥接,之后还打算考虑给numo-narray项目提交PR,直接添加一个能获取FFI指针的函数。
现在我想请教的是:是否可以通过FFI将Ruby对象的原始VALUE传递给绑定的C函数? 我已经查阅过这些资料但没找到答案:Ruby C扩展文档、Numo::NArray的相关公开issue、Numo::NArray的头文件定义、Numo::FFTW的源代码,还有Ruby FFI的类型文档。
内容的提问来源于stack exchange,提问作者nitrogen
相关产品推荐
相关产品推荐

