【问题标题】:Parallel simulations writing on the same file并行模拟写入同一文件
【发布时间】:2015-01-12 19:51:29
【问题描述】:

我的目标是在一个集群上并行运行 10,000 个左右的 Julia 编码模拟(每个模拟独立于所有其他模拟)。每个模拟都有一个要输出的数字(以及关于哪个模拟产生了这个数字的 3 列信息)。因此,强制每个模拟打印在单独的文件上对我来说听起来有点愚蠢。

我是否可以安全地要求所有这些模拟写入同一个文件,或者如果两个模拟恰好同时写入文件,这可能会导致错误?什么是最好的解决方案?

【问题讨论】:

  • 如果所有这些模拟在一个程序中一起运行,只要您处理代码中的任何争用,您就可以写入文件。如果您有单独的实例运行相同的代码,我建议创建一个中间层来执行实际的编写并处理那里的任何资源争用。
  • 所有模拟都相互独立运行。 10000个模拟中,有4组2500个模拟。在每个集合中,参数完全相同(只有种子不同),而参数在集合之间不同。我不知道什么是中间层,而且我认为我并不真正理解资源争用的概念。谢谢!
  • 对于这种情况,可以在函数内执行模拟,并且可以并行生成 10,000 个函数实例。然后主程序将负责收集函数每个实例的输出并将结果写入文件。 parallel computing 上的 Julia 文档详细介绍了如何并行生成任务并收集结果。

标签: file parallel-processing julia


【解决方案1】:

下面是一个简短的示例,说明可以使用pmap() 设置一组 10000 个独立模拟以在 Julia 中并行运行:

@everywhere function simulate(i)
    # we compute the simulation results here. In this case we just return
    # the simulation number and a random value
    x = rand()
    return (i,x)
end

x = pmap(simulate,1:10000)
# x is the array of tuples returned from all the simulations

showall(x)
# ... or we could write x to a file or do something else with it

需要@everywhere 以确保simulate() 函数可用于所有进程,而不仅仅是一个进程。 pmap() 为第二个参数中的每个值并行调用一次simulate(),并返回由simulate() 生成的所有结果的数组。

【讨论】:

  • 谢谢。我没有意识到答案对朱莉娅来说是如此具体。鉴于我通常使用qsub 一个.pbs 文件并在#PBS -t 下指定模拟次数,我仍然不太确定如何在我使用的集群上运行它。我应该写#PBS -t 1(而不是#PBS -t 1-10000)并使用pmap 并行处理.jl 文件吗?你认为系统会让我以这种方式访问​​多个 CPU 吗?我最好向管理集群的人问这个问题。
  • 我自己只在多核工作站上运行并行任务。然而,根据 Julia 并行 programming documentation,使用“--machinefile 选项...使用无密码 ssh 登录在指定机器上启动 julia 工作进程(从与当前主机相同的路径)启动 Julia”。 --machinefile 选项描述为 here
  • 当然,还有其他不是 Julia 特有的方法,但是,由于您的模拟是在 Julia 中进行的,因此在 Julia 中完成这一切似乎比跨多个部分更容易的软件。我不熟悉qsub,所以我无能为力。您的集群管理员最能帮助您了解集群的具体细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多