Ruby Fiddle和全局解释器锁(GIL)
我使用调用外部C函数进行一些繁重的计算(MacOSX) 模块定义如下所示Ruby Fiddle和全局解释器锁(GIL),ruby,macos,gil,fiddle,Ruby,Macos,Gil,Fiddle,我使用调用外部C函数进行一些繁重的计算(MacOSX) 模块定义如下所示 module BLAS extend Fiddle::Importer dlload $BLAS_PATH extern 'void cblas_dgemm(int, int, int, int, int, int, double, double*, int, double*, int, double, double*, int)' extern 'void cblas_dgemv(in
module BLAS
extend Fiddle::Importer
dlload $BLAS_PATH
extern 'void cblas_dgemm(int, int, int, int, int, int, double, double*, int, double*, int, double, double*, int)'
extern 'void cblas_dgemv(int, int, int, int, double, double*, int, double*, int, double, double*, int)'
.......
这些库针对mac osx进行了优化,可以使用所有可用的内核。不幸的是,当我用Fiddle从Ruby调用这些函数时,只使用了一个内核,我的理解是,这是因为GIL
在执行外部功能期间,是否有方法释放锁
我使用的是ruby 2.0.0-p247(不是系统ruby)。在ruby 2.3中,这是默认设置(请参见ruby bug跟踪器上的) 在此之前,它看起来不像是在Fiddle api中公开的。ruby c API中有一个函数名为
rb\u thread\u call\u而不带\u gvl
,它几乎完全按照tin上的说明执行:它释放gvl,调用传递的函数,重新获取gvl并返回。使用起来有点棘手-请务必阅读中的注释
如果你不能升级,我想你最好的办法是写一个非常薄的C层,用
rb\u thread\u call\u包装调用,而不用
,然后用fiddle调用包装库 我刚刚注意到Fiddle在ruby 2.3中发布了gil——如果您可以更新ruby,这可能是最简单的解决方案