【问题标题】:Ruby Fiddle and Global Interpreter Lock (GIL)Ruby Fiddle 和全局解释器锁 (GIL)
【发布时间】:2016-05-04 06:00:36
【问题描述】:

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

有没有办法在外部函数执行过程中释放锁?

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

【问题讨论】:

  • 我刚刚注意到 Fiddle 在 ruby​​ 2.3 中发布了 gil - 如果您可以更新 ruby​​,这可能是最简单的解决方案

标签: ruby macos gil fiddle


【解决方案1】:

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

在此之前,它看起来不像是在 Fiddle api 中公开的。 ruby c API 中有一个名为rb_thread_call_without_gvl 的函数,它的作用与它在 tin 上所说的几乎完全一样:它释放 gvl,调用传递的函数,重新获取 gvl 并返回。使用起来有点棘手 - 请务必阅读 thread.c 中的 cmets。

如果您无法升级,我怀疑您最好的选择是编写一个非常薄的 C 层,用 rb_thread_call_without_gvl 包装调用,然后使用 fiddle 调用该包装库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多