【问题标题】:how to use mpiexec in linux shell如何在 linux shell 中使用 mpiexec
【发布时间】:2013-11-12 08:00:26
【问题描述】:

我有一个文件 a.txt,每一行都包含一个参数。现在我想使用 mpiexec 来调用我的程序,例如 a.out 来计算每个参数。所以我使用 linux shell 脚本来处理这个问题。代码是示例

    cat a.txt | while read line
    do
        mpiexec -v -hostfile hosts -np 16 ./a.out ${line} 
    done 

没想到,脚本只处理了一行文件a.txt就结束了。那么,是因为管道使用不当造成的吗?我该如何解决这个问题?

【问题讨论】:

    标签: shell pipe mpiexec


    【解决方案1】:
    #!/bin/bash
    for LINE in `cat a.txt | xargs -r`; do
        mpiexec -v -hostfile hosts -np 16 ./a.out $LINE 
    done 
    

    【讨论】:

      【解决方案2】:

      我也有这个问题。 Claudio 的解决方案帮助我走上了正确的道路,以理解为什么循环在第一次迭代后退出。首先,这是一个与您写的非常接近的解决方案:

      cat a.txt | while read line; do
          </dev/null mpiexec -np 16 ./a.out ${line}
      done
      

      请注意,我只是在本地计算机上使用mpiexec,(python 的线程情况非常糟糕,需要这个)所以我无法测试这是否适用于单独的主机。您可以尝试自己重新添加。

      您的脚本不起作用的原因是mpiexec 似乎吞噬了附加到标准输入的任何内容。我假设它这样做是为了如果a.out 需要该输入,它会吞噬所有输入并将其与运行a.out 的命令一起发送到其他服务器。结果是在第一次迭代中,read 从您的文件中读取第一行。然后mpiexec 读取其余行,即使a.out 在您的情况下可能不会使用它们。然后在第二次迭代中,read 尝试读取更多行,但由于 mpiexec 已经读取了其余行,read 被告知已到达文件末尾,因此循环退出。

      由于我们想阻止mpiexec 读取标准,我们将mpiexec 的标准重定向到来自/dev/null。由于 /dev/null 始终不包含任何内容,mpiexec 将不读取任何内容并保留标准输入。

      【讨论】:

      • 一些额外的shell需要注意:如果文件包含制表符或两个相邻的空格,那么为了使line保留制表符和空格,while read line应该变成@ 987654337@。此外,如果文件包含带有任何空格的行,并且您希望将整行作为参数传递,那么${line} 应该变为"$line"。事情是这样的,如果 line 包含空格, line 将被拆分为单独的参数。这可能是你想要的,我不知道你的用例。
      猜你喜欢
      • 2014-05-25
      • 2019-06-02
      • 2020-09-02
      • 2013-07-04
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      相关资源
      最近更新 更多