Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Fiddle和全局解释器锁(GIL)_Ruby_Macos_Gil_Fiddle - Fatal编程技术网

Ruby Fiddle和全局解释器锁(GIL)

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

我使用调用外部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(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,这可能是最简单的解决方案