【问题标题】:parallel computing in multiple cores for data which is indepedently run with the program多核并行计算,用于与程序独立运行的数据
【发布时间】:2020-02-05 08:49:06
【问题描述】:

我有一个 fortran 模拟程序,它从 .dat 获取输入。这个文件有 100.000 行,需要很长时间才能运行。该程序采用第一行,运行所有模拟并将结果写入 .out 并传递到下一行。我有一台 16 个 cpu 的计算机,那么我该如何将我的数据分成 16 个部分并在每个 cpu 中分别运行呢?我正在使用 ubuntu 的机器上运行。每一行都完全独立于另一行。 例如我的数据是 HeadData10000.dat,那么我有一个文件 Simulation.ini,在这种情况下输入数据的名称为:HeadData10000.dat,输出数据的名称。所以文件 Simulation.ini 会是这样的

HeadData10000.dat
outputdata.out

然后现在我有两台计算机,所以我将 HeadData10000.dat 分成两个文件,然后为每个输入数据执行两个 Simulation.ini,然后在每台计算机上像这样运行它:./simulation.exe<.>

【问题讨论】:

  • 每一行的处理是否完全独立于前几行的处理?我的意思是,如果数据文件中的行以相反的顺序输入,它仍然有效吗?
  • 我不知道如何在 Fortran 中完成,但通常可以通过使用 threads 和 thread pools 来解决(如果每个输入行的数据是独立的)。
  • 如果每一行的处理独立于前面的行,你可以很方便地使用GNU Parallel,这里是优秀的PDF...zenodo.org/record/1146014/files/…你需要--pipe-part参数.请提供几行数据文件以及如何为其中一行运行 fortran 代码。编辑您的问题,不要将代码放入 cmets。谢谢。

标签: parallel-processing


【解决方案1】:

假设您的 100,000 个工作列表名为 "jobs.txt",如下所示:

JobA
JobB
JobC
JobD

你可以运行这个:

parallel 'printf "{}\n{.}.out" | ./simulation.exe' < jobs.txt 

如果您想进行试运行,看看不做任何事情会做什么:

parallel --dry-run 'printf "{}\n{.}.out" | ./simulation.exe' < jobs.txt 

样本输出

printf "JobA\nJobA.out" | ./simulation.exe
printf "JobB\nJobB.out" | ./simulation.exe
printf "JobC\nJobC.out" | ./simulation.exe
printf "JobD\nJobD.out" | ./simulation.exe

如果您有多个服务器可用,请考虑使用 GNU Parallel 的 -S 参数将作业分散到机器上。另外,查看--eta 和--bar 参数以获取进度报告。

我使用printf "line1 \n line2" 生成两行输入,以避免创建和删除 100,000 个文件。

默认情况下,GNU Parallel 将保持每个 CPU 内核运行 1 个作业,因此在您的 16 核计算机上将始终运行 16 个作业,但您可以将其更改为 8 个,例如你想用parallel -j 8。您还可以指定在您的第二台(及后续)机器上运行的作业数量。

【讨论】:

  • 服务器没有安装 GNU,所以我不能使用这个命令。不过,我在自己的机器上试过了,非常好用,谢谢!
  • 查看 GNU Parallel 的作者 Ole Tange 在此处无需 root 访问即可轻松安装 GNU Parallel...stackoverflow.com/a/42396008/2836621
  • 谢谢,但问题是我没有权限在服务器上安装任何东西。
  • 阅读oletange.wordpress.com/2018/03/28/…——尤其是关于--embed的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2017-02-13
  • 2014-03-15
相关资源
最近更新 更多