每个 CPU 使用的 mpich 传递参数

mpich pass argument per CPU used

给定:2 Ubuntu 16.04 台具有多个 CPU 核心的机器。

我想在机器上执行 program fixed_arg arg2 的多个实例,每次调用将一个文件名作为 arg2 传递给程序。 到目前为止,使用 xargs,这适用于一台机器:

find . -iname "*.ext" -print | xargs -n1 -P12 program fixed_arg 

(这会在当前目录(.)中找到扩展名为"ext"的所有文件,每行打印一个文件(-print),并调用xargs并行调用程序12次(-P12)每次调用 (-n1) 只有一个参数 arg2。请注意整个命令末尾的白色 space。)

我想使用多台机器,我在这些机器上安装了官方 Ubuntu 16.04 存储库中的 "mpich" 软件包。

我只是不知道如何使 mpiexec 成为 运行 我的程序,在多台机器上只有一个参数。 我知道 mpiexec 将接受一个参数列表,但我的列表将在 800 到 2000 个文件的范围内,到目前为止对于任何程序来说都太长了。

感谢任何帮助。

您刚刚选择了错误的仪器(或向我们提供有关您的目标程序的更多详细信息)。 MPI (mpich implementation, mpiexec and mpi运行 commands) 不是为了在多个主机上启动不相关的程序,它是为了启动一个程序具有完全相同的源代码,当程序知道现在有许多副本(多达 100 甚至更多)以在副本之间进行定义明确的点对点和集体消息传递时。它是并行一些科学代码的工具,比如在单机上无法计算甚至无法放入其内存的巨大数组上的计算。

更好的工具可以是 GNU parallel (https://www.gnu.org/software/parallel/);如果你有一台或两台机器或者只有几台运行s,那么手动将你的文件列表分成两部分会更容易,并且运行两个parallelxargs 在每台机器上(手动或使用 authorized_keys 使用 ssh)。我假设所有文件都可以从同一路径的两台机器访问(NFS 共享或类似的东西;没有像 mpi 或 gnu parallel 这样的神奇工具会为你转发文件,但是一些现代批处理系统可能会批处理):

find . -iname "*.ext" -print > list
l=$(wc -l < list) 
sp=$((l/2))
split -l $sp list 
cat xaa | xargs -n1 -P12 program fixed_arg &
cat xab | ssh SECOND_HOST xargs -n1 -P12 program fixed_arg & 
wait

或者了解 GNU 的多主机用法 parallelhttps://www.gnu.org/software/parallel/man.html

-S @hostgroup Distribute jobs to remote computers. The jobs will be run on a list of remote computers. GNU parallel will determine the number of CPU cores on the remote computers and run the number of jobs as specified by -j.

EXAMPLE: Using remote computers

如果两个 ubuntus 之间没有共享 FS,它也有一个神奇的功能,可以使用 --transferfile filename 选项将文件发送到远程机器。