2016-05-04 12 views
0

linear algebraの計算(Mac OSX)で外部C関数を呼び出すためにFiddleを使用しています。モジュール定義はRuby Fiddle and Global Interpreter Lock(GIL)

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からこれらの関数をFiddleと呼ぶとき、1つのコアだけが使用され、私の理解はGILのために起こります。

外部機能の実行中にロックを解除する方法はありますか?

ruby 2.0.0-p247(システムRubyではありません)を使用しています。

+0

私はFiddleがruby 2.3でgilをリリースしたことに気付きました。もしおそらく最も簡単な解決策であるrubyを更新できたら –

答えて

1

これはデフォルトです(ルビーバグトラッカーのthe issueを参照してください)。

以前は、Fiddle APIで公開されているようには見えません。 RubyのAPIには、rb_thread_call_without_gvlという関数があります。これは、実際にスズに書かれているとおりです。つまり、gvlを解放し、渡された関数を呼び出し、gvlと戻り値を再取得します。使用するのはちょっと難しいです - thread.cのコメントを必ず読んでください。

アップグレードできない場合は、rb_thread_call_without_gvlで呼び出しをラップする非常に薄いCレイヤーを作成し、fiddleを使用してそのラッパーライブラリを呼び出すことをお勧めします。

関連する問題