bash - bash 中的 matlab 批处理并行化

标签 bash matlab batch-file pbs parallel-processing

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

我创建了 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 实例的值只是最后一个值。

有什么办法可以避免吗?我可以在调用函数时“烘焙”该变量的值吗?

还是问题完全不同?

最佳答案

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

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 的主机。这将打印数字 0 - 3 从 echo result: '$cnt' getting getting getting remotely executed 返回。因此,执行本身工作正常。

我可以建议的一件事是将命令 (matlab ...) 移动到已知文件夹中的某个脚本中,然后通过提供完整路径在上述循环中运行该脚本到那个脚本。像这样的东西:

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

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

关于bash - bash 中的 matlab 批处理并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4230401/

相关文章:

matlab - 在将数据分配给结构数组时避免 eval

windows - NodeJS子进程PID与真实进程不符

mysql - 日志轮换 MySQL Windows 批处理

string - bash 函数不会解析最后两个参数

linux - 监视文件上的 grep 无法正常工作

r - 如何在 R 中创建二维列表

python - 如何以与 MATLAB 相同的方式构造 Python 库和路径

batch-file - 如何监视特定命令行错误 (Windows)?

bash - 使用 BASH 命令更改语言

linux - 我怎样才能让 bash 阻止从我产生的工作中获取一行标准输出