Ruby小提琴和全球翻译锁(GIL)

时间:2016-05-04 06:00:36

标签: ruby macos gil fiddle

我正在使用Fiddle调用外部C函数进行一些繁重的linear algebra计算(Mac OSX)。

模块定义类似于

  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进行了优化,可以使用所有可用的核心。不幸的是,当我从Ruby with Fiddle调用这些函数时,只使用了一个核心,而我的理解是因为GIL而发生这种情况。

有没有办法在外部函数执行期间释放锁?

我正在使用ruby 2.0.0-p247(不是系统Ruby)。

1 个答案:

答案 0 :(得分:1)

在ruby 2.3中,这是默认设置(请参阅ruby bug跟踪器上的the issue)。

在此之前,它看起来并不像是在Fiddle api中暴露出来的。 ruby c API中有一个名为rb_thread_call_without_gvl的函数,它完全按照它在tin上的内容执行:它释放gvl,调用传递的函数,重新获取gvl并返回。使用起来有点棘手 - 请务必阅读thread.c中的评论。

如果你无法升级,我怀疑你最好的办法是编写一个非常薄的C层,用rb_thread_call_without_gvl包裹调用,然后使用小提琴调用该包装库。