近期因为要在 Linux 集群上运行一个计算量很大的 Mathematica 程序,所以我把核心的函数写为一个程序包,然后使用 Wolfram Mathematica 脚本来调用这个程序包。写完程序包之后发现在程序包的 Begin["Private`"]...End[]
内定义的函数不能直接使用并行化的函数,如 ParallelSum
、ParallelMap
等等。
1. 症结所在
这是因为程序包里的迭代变量在命名空间 MyPackage`Private`
之内,而并行化的函数默认使用的符号定义在 Context
之内。也就是说默认情况下,并行化的函数会去 Global`
寻找变量或函数等的定义,这便出错了 [1]。
2. 解决之道
很简单,我们只需要为并行化的函数指定并行计算中函数的定义。具体方法如下 [1][2]:
Begin[`Private`"]
ParallelTable[m^2, {m, 10}, DistributedContexts -> {"MyPackage`Private`"}]
End[]
网友评论