【问题标题】:matlab batch parallelization in bashbash中的matlab批处理并行化
【发布时间】:2010-11-19 23:51:29
【问题描述】:

我正在尝试在大型计算机集群上运行一段代码,以分析数据的不同部分。

我创建了 2 个循环来将作业分配给不同的节点以及节点包含的 CPU。 我写的分析函数 'chnJob()' 只需要带一个索引就可以知道它需要分析的数据的哪一部分(在这种情况下是称为 'chn' 的 shell 变量)。

循环是这样的:

for NODE in $NODES; do # Loop through nodes
   for job_idx in {1..$PROCS_PER_NODE}; do # Loop through jobs per node (8 per node)
      echo "this is the channel $chn"
      ssh $NODE "matlab -nodisplay -nodesktop -nojvm -nosplash -r 'cd $WORK_DIR; chnJob($chn); quit'" &
      let chn++
      sleep 2
  done
done

即使我看到 chn 变量正在正确递增,但传递给 matlab 函数的 chn 值始终是 chn 的最后一个值。

这可能是因为 matlab 在每个节点上打开需要很长时间,而 bash 到那时才完成循环。所以传递给每个 matlab 实例的值只是最后一个值。

有没有办法绕过它?我可以在调用函数时“烘焙”该变量的值吗?

或者问题完全不同?

【问题讨论】:

    标签: bash matlab batch-file pbs parallel-processing


    【解决方案1】:

    我不认为这是正在发生的事情。你能试试运行这个吗:

    cnt=0
    for a in 1 2; do 
      for b in 1 2; do 
        echo --- $cnt
        ssh somehost "echo result: '$cnt'" & 
        let cnt++
      done
    done
    

    将 somehost 替换为运行 sshd 的主机。这将打印从echo result: '$cnt' 远程执行的数字 0 - 3。因此,执行本身可以正常工作。

    我可以建议您将命令 (matlab ...) 移动到已知文件夹中的某个脚本中,然后通过提供该脚本的完整路径在上述循环中运行该脚本。比如:

    ssh $NOTE "/path/to/script.sh $cnt"
    

    在脚本中,$1 将为您提供所需的值(即循环中的 $cnt)。您可以在脚本开头使用echo $1 >> /tmp/values 来收集文件/tmp/values 中的所有值。当然,在你开始之前rm /tmp/values。这将确认您是否获得了所需的所有值。

    【讨论】:

      【解决方案2】:

      Bash 无法处理大括号范围表达式中的变量。它们必须是文字:{1..10}。由于您现在拥有它的方式,每次外部循环的迭代始终只执行一次内部循环,而不是八次(或任何PROCS_PER_NODE 的值)。结果,chn 从它的初始值变为加上NODES,而它应该从Original_chn 变为NODES * PROCS_PER_NODE

      改用 C 风格的 for 循环:

      for ((job_idx=1; job_idx<=$PROCS_PER_NODE; job_idx++))
      

      您可以在for 中同时增加job_idxchn(如果这不会给您带来一个问题):

      for ((job_idx=1; job_idx<=$PROCS_PER_NODE; job_idx++, chn++))
      

      【讨论】:

        【解决方案3】:

        如果 $PBS_NODEFILE 包含带有节点列表的文件名(每行一个),那么这应该有效:

          seq 1 100 | parallel --slf $PBS_NODEFILE "matlab -nodisplay -nodesktop -nojvm -nosplash -r 'cd $WORK_DIR; chnJob({}); quit'"
        

        了解更多:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-05
          • 2010-11-12
          • 2021-11-08
          • 2014-12-03
          • 2013-01-18
          • 2016-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多