鉴于:2台具有多个CPU核心的Ubuntu 16.04计算机。
我想在计算机上执行program fixed_arg arg2
的多个实例,将每个调用的一个文件名作为arg2
传递给程序。
到目前为止,使用xargs,这适用于一台机器:
find . -iname "*.ext" -print | xargs -n1 -P12 program fixed_arg
(这将在当前目录(。)中找到扩展名为“ext”的所有文件,每行打印一个文件(-print),并调用xargs并行调用程序12次(-P12),只有一个参数每次调用arg2
(-n1)。注意整个命令末尾的空格。)
我想使用多台机器,我在其上安装了官方Ubuntu 16.04存储库中的“mpich”软件包。
我只是不知道如何让mpiexec在多台机器上只运行一个参数来运行我的程序。 我知道mpiexec会接受一个参数列表,但是我的列表将在800到2000个文件的范围内,到目前为止,这些文件对任何程序来说都很长。
感谢任何帮助。
答案 0 :(得分:0)
您刚刚选择了错误的工具(或者向我们提供有关您的目标计划的更多详细信息)。 MPI (mpich implementation,mpiexec和mpirun命令)不适用于在多个主机上启动不相关的程序,它用于启动一个具有完全相同源代码的程序,当时程序知道现在有许多副本(最多100个和更多)可以在副本之间进行明确定义的点对点和集体消息传递。它是并行一些科学代码的工具,例如大型阵列上的计算,这些代码无法在单机上计算甚至无法融入其内存。
更好的工具可以 GNU并行(https://www.gnu.org/software/parallel/);如果您有一台或两台机器,或者它只是几次运行,则可以更轻松地将文件列表分为两部分,并在每台机器上运行两个parallel
或xargs
(手动或与ssh
使用authorized_keys)。我假设所有文件都可以从同一路径的两台机器上访问(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 parallel
的多主机使用情况:https://www.gnu.org/software/parallel/man.html
-S @hostgroup
将作业分配给远程计算机。作业将在远程计算机列表上运行。 GNU parallel将确定远程计算机上的CPU核心数,并运行-j指定的作业数。示例:使用远程计算机
如果两个ubuntus之间没有共享FS,它还可以通过--transferfile filename
选项将文件发送到远程计算机。