Mathematica の C 拡張機能 (LibraryLink または MathLink -- 現在は LibraryLink を使用しています) をリモートの並列カーネルで使用した経験のある人はいますか?
要するに、サブカーネルがリモート マシンで実行されている場合、並列評価と非並列評価の両方で、LibraryLink で定義された関数 ( CreateLibraryおよびLibraryFunctionLoadを参照) を透過的に使用するにはどうすればよいでしょうか?
サブカーネルがリモートマシンで実行されているときに、通常は として、または並行して ( と同じ)呼び出すことができるlibraryFun
関数 (C で記述) を使用できるようにするセットアップ手順を探しています。libraryFun[args]
Parallelize@Table[libraryFun[arg], {arg, 0, 100}]
ParallelTable[]
メインカーネルをリモートで実行することも、問題がなければもっと良いかもしれません。
アップデート
その間、私はいくつかの進歩を遂げました。ここで説明します。
まず、ParallelEvaluate
すべての並列カーネルで式を評価します。C 拡張機能のソース ファイルがリモート マシンにコピーされている場合は、次のようにコンパイルできます。
ParallelNeeds["CCompilerDriver`"]
k1 = First@Kernels[]
ParallelEvaluate[SetDirectory["/path/to/source/files"]]
ParallelEvaluate[CreateLibrary["sourefile", "myLibrary"]]
これは一度だけ行う必要があります。ライブラリはメイン カーネル マシン上で既にコンパイルされていると仮定します。
この後、後続のすべてのセッションでFindLibrary
、メイン マシンとリモート マシンの両方で使用してライブラリをロードできます。
LibraryFunctionLoad[myFun = FindLibrary["myLibrary"], "fun", ...]
ParallelEvaluate[myFun = LibraryFunctionLoad[FindLibrary["myLibrary"], "fun", ...]]
そして、ここで問題が発生します。 パスが異なるためmyFun
、メイン カーネルと並列カーネルで値が異なります。
問題は、 の値がメイン カーネルと並列カーネルの間で誤って同期されないようにするにはどうすればよいかということです。myFun
これが偶発的にどのように発生する可能性があるかを、孤立した例で示します。
In[1]:= LaunchKernels[2]
Out[1]= {KernelObject[1, "local"], KernelObject[2, "local"]}
x
メインカーネルの設定値:
In[2]:= x = 1
Out[2]= 1
リモートカーネルでも同じ値を取得することに注意してください。
In[3]:= ParallelEvaluate[x]
Out[3]= {1, 1}
x
並列カーネルで別の値を設定し、それが保持されていることを確認します。
In[4]:= ParallelEvaluate[x = 2]
Out[4]= {2, 2}
In[5]:= {x, ParallelEvaluate[x]}
Out[5]= {1, {2, 2}}
Parallelize
を含むものに「無邪気に」使用するようになりましたx
:
In[6]:= Parallelize[Table[x, {10}]]
Out[6]= {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
そして、メインカーネルとサブカーネルの間で の値がどのようx
に再同期されるかを確認してください。
In[7]:= {x, ParallelEvaluate[x]}
Out[7]= {1, {1, 1}}
新しい質問は、特定のシンボルがメインカーネルとサブカーネルの間で自動同期されないようにするにはどうすればよいですか?