计算化学公社

 找回密码 Forget password
 注册 Register
Views: 1444|回复 Reply: 3
打印 Print 上一主题 Last thread 下一主题 Next thread

[综合交流] 巧妙利用make命令批量并行运行任务的小脚本

[复制链接 Copy URL]

1102

帖子

18

威望

6643

eV
积分
8105

Level 6 (一方通行)

計算化学の社畜

本帖最后由 冰释之川 于 2023-3-2 18:42 编辑

相信对于经常编写shell脚本的人来说,利用for语句对一批任务进行批量、串行处理是小菜一碟,不过有时候我们希望能够对一批任务进行批量、并行地运行任务,从而最大程度发挥多核CPU的优势,这时候如何优雅地、不借助额外工具来达成这一“并行”效果呢?

其实可以巧妙地套用make命令制作makefile来实现“并行、批量”执行的操作, 在此感谢邹神(zjxitcc)提供的批量并行的解决思路

批量并行运行脚本:
parallel_run.7z (1.65 KB, 下载次数 Times of downloads: 26)


这里举个使用该脚本的范例:
在文件夹中有多个*.a文件,想利用bash批量、并行运行*.a文件。

*.a文件内容如下:
  1. echo "hello~"
  2. sleep 5
复制代码

那么,我们可以先收集多个*.a文件所在位置信息,生成makefile文件,最后利用诸如make -f parallel_run.make -j 8 命令,来借用makefile容器进行并行处理。

parallel_run.make内容如下:
  1. all: w1 w2 w3 w4 w5 w6 w7 w8 w9

  2. w1:
  3.         bash /mnt/e/parallel_run/1/1.a > /mnt/e/parallel_run/1/1.log 2>&1

  4. w2:
  5.         bash /mnt/e/parallel_run/1/4/4.a > /mnt/e/parallel_run/1/4/4.log 2>&1

  6. w3:
  7.         bash /mnt/e/parallel_run/2/2.a > /mnt/e/parallel_run/2/2.log 2>&1

  8. w4:
  9.         bash /mnt/e/parallel_run/2/5/5.a > /mnt/e/parallel_run/2/5/5.log 2>&1

  10. w5:
  11.         bash /mnt/e/parallel_run/3/3.a > /mnt/e/parallel_run/3/3.log 2>&1

  12. w6:
  13.         bash /mnt/e/parallel_run/3/5/5.a > /mnt/e/parallel_run/3/5/5.log 2>&1

  14. w7:
  15.         bash /mnt/e/parallel_run/3/5/4/4.a > /mnt/e/parallel_run/3/5/4/4.log 2>&1

  16. w8:
  17.         bash /mnt/e/parallel_run/4/4.a > /mnt/e/parallel_run/4/4.log 2>&1

  18. w9:
  19.         bash /mnt/e/parallel_run/5/5.a > /mnt/e/parallel_run/5/5.log 2>&1
复制代码
在脚本里可以修改下面参数来适应不同的脚本任务:
  1. file_extension="a"     # the *.$file_extension file to be executed
  2. num_cpu=6     # number of CPU to be used
  3. command='bash'       # input command here
复制代码


下面是脚本运行过程中的输出信息:













评分 Rate

参与人数
Participants 7
威望 +1 eV +27 收起 理由
Reason
咚咚咚咚锵 + 2 赞!
djjj148 + 5 赞!
sobereva + 1
LittlePupil + 5 GJ!
exity + 5 GJ!
含光君 + 5 谢谢
ggdh + 5 666666

查看全部评分 View all ratings

Stand on the shoulders of giants

2301

帖子

1

威望

5473

eV
积分
7794

Level 6 (一方通行)

2#
发表于 Post on 2023-2-25 20:39:34 | 只看该作者 Only view this author
补充一下,还有其他可以参考的解决方案。

https://unix.stackexchange.com/q ... ize-a-bash-for-loop
High-Performance Computing for You
为您专属定制的高性能计算解决方案

更多讯息,请访问:
https://labitc.top
http://tophpc.top:8080
电邮: ask@hpc4you.top

362

帖子

1

威望

4368

eV
积分
4750

Level 6 (一方通行)

3#
发表于 Post on 2023-2-25 21:58:22 | 只看该作者 Only view this author
目睹了一起抢发事件的完整过程。

417

帖子

1

威望

2196

eV
积分
2633

Level 5 (御坂)

4#
发表于 Post on 2023-2-26 10:06:21 | 只看该作者 Only view this author
我正常是用GNU parallel( https://www.gnu.org/software/parallel/ )来进行类似操作的。但我早已忘记最初是从什么地方知道这个工具的了。

刚刚搜索了一下,从Hacker News上找到了这个链接 https://docs.alliancecan.ca/medi ... ?title=GNU_Parallel ,里面较为详细地写了GNU Parallel的用法。里面的“Running on Multiple Nodes”,我也是头一次知道。我曾经遇上过超算没有装GNU parallel的情况,那个超算是CentOS,我当时直接下载了Fedora EPEL 7的GNU parallel的包,然后“rpm2cpio parallel-20160222-1.el7.noarch.rpm | cpio -i -d”,再把parallel所在路径加到PATH里就行了。

需要注意的是moreutils( https://joeyh.name/code/moreutils/ )里面也有个程序叫parallel,但那个parallel现在很少有人用了。

评分 Rate

参与人数
Participants 1
eV +5 收起 理由
Reason
ChrisZheng + 5 我很赞同

查看全部评分 View all ratings

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-24 01:23 , Processed in 0.189525 second(s), 25 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list