ExASIC
分享让工作更轻松

multiprocessing在并行仿真中的应用

很多中小公司的服务器,没有组建集群,不能利用bsub、qsub来提交作业。但很多时候,我们还是有并行仿真的需求,充分利用多CPU来跑同时多个Testcase。在python里,有一个多进程管理的包,正好符合我们的需求。

一个实例

假设,我们有一个测试图片集,有100幅图片。现在需要把所有的图片都测试一遍。

跑单个Testcase

先看单个Testcase的测试过程:

  1. 新建测试文件夹
  2. 进入测试文件夹
  3. 调用仿真脚本
  4. 分析仿真结果
  5. 退出测试文件夹

脚本如下:

pic = '1.bmp'
newdir = 'tc_mcuI_8bit_666'

os.mkdir(newdir)
os.chdir(newdir)
os.system("python3 prj/sim/script/run_sim.py -tc=tc_mcuI_8bit_666 -pic={}".format(pic))
os.system("python3 prj/sim/script/check_sim.py")
os.chdir('..')

串行跑仿真

串行就是等一个跑完,再开始下一个。注意,每次跑仿真建的文件夹名字要不相同,不然就冲突了。可以简单的用随机数来取名字,random.randint(10000, 99999),5位随机数,重复的概率应该很小了。

import os
import random

pics = os.listdir('prj/sim/tc/pics')

def run_single(pic):
    newdir = 'tc_mcuI_8bit_666_{:05d}'.format(random.randint(10000, 99999))

    os.mkdir(newdir)
    os.chdir(newdir)
    os.system("python3 prj/sim/script/run_sim.py -tc=tc_mcuI_8bit_666 -pic={}".format(pic))
    os.system("python3 prj/sim/script/check_sim.py")
    os.chdir('..')

for pic in pics:
    run_single(pic)

并行跑仿真

multiprocessing.Pool(processes=4)来限制进程的个数,默认是CPU全用满,可能对同事不太友好。然后用pool.apply_async()来启动仿真。最后用pool.join()来等待所有Testcase执行完毕。

import os
import random
import multiprocessing

pics = os.listdir('prj/sim/tc/pics')

def run_single(pic):
    newdir = 'tc_mcuI_8bit_666_{:05d}'.format(random.randint(10000, 99999))

    os.mkdir(newdir)
    os.chdir(newdir)
    os.system("python3 prj/sim/script/run_sim.py -tc=tc_mcuI_8bit_666 -pic={}".format(pic))
    os.system("python3 prj/sim/script/check_sim.py")
    os.chdir('..')

pool = multiprocessing.Pool(processes=4)
res = []
for pic in pics:
    res.append( pool.apply_async(run_single, (pic, )) )

pool.close()
pool.join()

print("all pic are processed!")

总结

这种并行方法只是相当于手动敲了很多次。多个仿真分在不同的目录下进行。使用起来没有任何限制,通用性比较强。

上面的方法还只是在本地并行仿真,如果要利用多台服务器,可以把项目工作文件夹放在NFS共享目录,在multiprocessing时,先ssh或者rlogin登录到其它服务器,再跑仿真脚本。

阅读数:
更多文章:文章目录
解惑专区
(支持markdown插入源代码)
欢迎使用ExASIC订阅服务
仅用于ExASIC最新文章通知,方便及时阅读。
友情链接: IC技术圈问答ReCclayCrazyFPGA