1

我正在使用Fiddle为一些繁重的线性代数计算(Mac OSX)调用外部 C 函数。

模块定义看起来像

  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)。

4

1 回答 1

2

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

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

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

于 2016-05-04T07:22:03.447 回答