跳转至

B. 实验室的新机器

题面

小北实验室最近新购置了几台服务器,供日常实验数据分析使用。为了让大家都能合理且方便地运用这些机器,你在它们上面安装了 slurm 和 SCOW,大家都使用得很开心。

李华今年刚加入小北实验室。他的日常工作需要分析大量数据。李华撰写了一个程序,专门用于分析他的这些数据。他使用他的笔记本运行这个程序。但是,李华发现,随着研究的不断深入,他需要分析的数据也越来越复杂;终于有一天,李华的笔记本“罢工”了——它所使用的“火龙一号”处理器在持续不断的满负荷工作过程中产生了过量的热,导致自己处于被烧毁的边缘,触发了“罢工”的保护机制。

于是,李华申请了实验室服务器账号,接下来他便可以把他的程序运行在实验室服务器上,他的笔记本也可以得到良好的休息。这将为他省下一大笔修理费用。

但是李华发现,每次在集群上运行自己的程序都需要先输入一堆与 slurm 有关的命令,他觉得这有些繁琐,希望你能帮他编写一个脚本,运行这个脚本以后,就会自动地创建 Job 、分配资源并运行李华的程序,在程序运行完成之后还会留存该程序运行的资源消耗情况。

你看在李华这次承诺不再需要你为他撰写一封收件人是你自己的感谢信的份上,决定帮他这个忙。

提交要求

请你提交一个脚本文件(允许的格式:Shell 脚本或 Python 脚本),它需要满足如下要求:

  1. 在文件头部具有一个 Shebang,用于表明如何运行该脚本(例子:对于一个 Bash 脚本来说,通常为 #!/bin/bash
  2. 该脚本需要完成如下工作:
  3. 在计算节点上运行李华的程序(./program),这个程序接收一个命令行参数,在调用你撰写的脚本时,也会传入这个参数,如果你编写 Shell 脚本,可以使用 $1 来访问;计算节点应位于 compute 分区,配置为一个机器、一个核心(-N1 -n1 -c1
  4. 将程序的输出重定向到 output.dat
  5. 使用 seff 命令查看运行这个 Job 的资源使用情况,并将输出重定向到 seff.dat

注:李华不会使用 sbatch,所以你的程序是直接在登录节点上被执行的!

提示

  • 为了降低你的工作量,李华的程序会获取 Slurm Job ID 并输出至 job_id.dat 文件。
  • 李华的程序不会输出至 stderr,只会输出至 stdout
  • 在 Shell 脚本中,将一个文件的内容作为命令参数的部分方式:
  • 使用类似 command_name "$(cat filename.dat)" 的方式
  • 使用类似 cat filename.dat | xargs command_name 的方式