我开发了一种工具,要求用户提供可运行它的CPU数量。
作为程序的一部分,该工具调用HMMER(hmmer-http://eddylab.org/software/hmmer3/3.1b2/Userguide.pdf),它本身非常慢,并且需要多个CPU才能运行。
考虑到用户指定了多少个CPU,我对最有效的CPU分配方法感到困惑。
例如,假设用户提供了N
cpus,我可以运行
N
HMMER作业,每个作业有1个CPU
N/2
个作业,每个作业有2个CPU
等等。
我当前的解决方案是任意打开N / 5的池大小并打开一个池,然后在池中的每个进程中调用具有5个CPU的HMMER。
pool = multiprocessing.Pool(processes = N/5)
pool.map_async(run_scan,tuple(jobs))
pool.close()
pool.join()
其中run_scan
调用HMMER,而jobs
将每个HMMER作业的所有命令行参数都保存为字典。
该程序非常慢,我想知道是否有更好的方法可以做到这一点。
谢谢
答案 0 :(得分:1)
几乎总是并行化在效率上付出一些代价,但是代价很大程度上取决于计算的细节,因此我认为回答这个问题的唯一方法是一系列实验。
(我假设这里的内存或磁盘I / O并不是问题;对HMMER不太了解,但用户指南在“需求”部分根本没有提及内存。)
--cpu 1
)上运行相同的工作,然后在四个,四个,...,两个核心上运行,并查看需要花费多长时间。这将使您了解作业的并行程度。已用CPU时间=运行时间*内核数应保持不变。