必须在远程计算机上使用哪些防火墙设置才能使远程内核连接正常工作?
特别是我对从Windows(前端)到Linux机器(内核)的连接感兴趣.
有没有人在远程并行内核中使用 Mathematica 的 C 扩展(LibraryLink 或 MathLink——目前我正在使用 LibraryLink)?
简而言之:当子内核在远程机器上运行时,如何在并行和非并行评估中透明地使用 LibraryLink 定义的函数(请参阅CreateLibrary和LibraryFunctionLoad)?
我找了一些设置步骤,这将让我有一个libraryFun函数(用C语言编写),可无论是通常称为libraryFun[args],或并行(两者的Parallelize@Table[libraryFun[arg], {arg, 0, 100}]和相同的ParallelTable[]时候subkernels在远程机器上运行)。
如果我也没有遇到问题,远程运行主内核也可能会更好。
与此同时,我取得了一些进展。我会在这里描述它。
首先,ParallelEvaluate将对所有并行内核中的表达式求值。如果 C 扩展的源文件被复制到远程机器,我们可以像这样在那里编译它们:
ParallelNeeds["CCompilerDriver`"]
k1 = First@Kernels[]
ParallelEvaluate[SetDirectory["/path/to/source/files"]]
ParallelEvaluate[CreateLibrary["sourefile", "myLibrary"]]
Run Code Online (Sandbox Code Playgroud)
此操作只需执行一次。我假设该库已经在主内核机器上编译。
在此之后,在所有后续会话中,我们可以FindLibrary在主计算机和远程计算机上使用来加载库。
LibraryFunctionLoad[myFun = FindLibrary["myLibrary"], "fun", ...]
ParallelEvaluate[myFun = LibraryFunctionLoad[FindLibrary["myLibrary"], "fun", ...]]
Run Code Online (Sandbox Code Playgroud)
麻烦来了。 由于路径myFun不同,在主内核和并行内核中会有不同的值。
所以问题是:如何确保myFun主内核和并行内核之间的值不会意外同步?
我将在一个孤立的例子中展示这可能是如何意外发生的:
In[1]:= LaunchKernels[2]
Out[1]= {KernelObject[1, "local"], KernelObject[2, "local"]}
Run Code Online (Sandbox Code Playgroud)
x在主内核中设置值: …