背景
serial_procedure.py
在 python 中,我最近学习了如何通过使用我的笔记本电脑的 4 个内核使用multiprocessing
产生模块的包来加速带有模块名称的串行过程multicore_procedure.py
。
问题
现在,我将使用一个有 3 个节点且每个节点有 4 个核心的计算机集群。multicore_procedure.py
我将如何通过在集群的 3*4 核心上并行化来加快速度?
更具体的要求
鉴于我在编程和软件工程方面的知识非常少,我希望有一些明确的 Python 示例脚本可用于 slurm 和 condor 资源管理软件系统。目标是自动检测可用的 3*4=12 内核并编写统一代码。
更多信息
示例模块serial_procdure.py
并multicore_procedure.py
在下面提供。请注意,在每次迭代ell中,都会进行密集计算,从而产生一个标记为total的值。随机段落被写入标签total下的给定文件名。并行进程不应将段落混合在一起,但所有进程应写入同一文件。
我尝试使用 mpi4py 包来实现 mpi,但我似乎没有正确理解它,因为结果性能类似于 serial_procedure.py。
串行程序
import numpy as np
import csv
import lorem
import time
# data
high=2**10;
nsamples=2**18;
labels=np.random.randint(0,high,nsamples)
# Serial version
serial_start_time=time.time()
filename='serial.txt'
total=0
with open(filename,'w') as file:
for ell in labels:
# supposedly intensive computation:
for k in range(ell):
total=total+k;
w = csv.writer(file) ;
w.writerow([total])
w.writerow(['****'])
w.writerow(lorem.paragraph())
total=0;
serial_time=time.time()-serial_start_time;
print('Serial write takes '+ str(serial_time)+' seconds')
# Serial write takes 43.09408092498779 second
多核程序
import numpy as np
import csv
import lorem
import time
from multiprocessing import Pool, Value
# data
high=2**10;
nsamples=2**18;
labels=np.random.randint(0,high,nsamples)
filename='four_cores_parallel.txt'
# supposedly intensive computation
def worker(ell):
total=0
for k in range(ell):
total=total+k;
return(total)
multicore_start_time=time.time()
pool=Pool(4);
with open(filename,'w') as file:
for total in pool.map(worker, labels):
w = csv.writer(file) ;
w.writerow([total])
w.writerow(['****'])
w.writerow(lorem.paragraph())
multicore_time=time.time()-multicore_start_time;
print('Multicore write takes '+ str(multicore_time)+' seconds')
# Multicore write takes 20.171985149383545 seconds