在小型超算、服务器上用Python-multiprocessing并行计算与在个人电脑上有何异同及其它问题如文所述

define__init__ 2019-05-17 04:56:12
需要处理Gaia卫星data,数据量大程序从优,不得不学习并行处理,遇到一些问题
其中一部分,思路如下(讨论在代码后给出):
#设置输入数据data1,data2,方便以后大量不同的data2的数据做相同的运算;而data1的数据是固定的,在这个code中切成n份供n个进程并行:
class Data1+2():

def __init__(self,data1,data2):

from multiprocessing import cpu_count
self.ncpu=cpu_count()/2 #'/2' means double thresds, no '-1' caus only 2 cpu in this thinkpad

self.data1=data1
self.data2=data2

# 定义处理过程(就在这个过程中包含了并行计算):
def def0(self):

#将data1的数据切成n份供n个进程并行计算用:
for i in range(self.ncpu):
vars()['data1'+str(i)]={} #define dict 'data1i={}'
data1size = len(self.data1data)/self.ncpu +1
idata = 0
for key,xydata1 in self.data1.items():
if len(vars()['data1'+str(idata)]) < data1size-1:
vars()['data1'+str(idata)][key] = xydata1
elif len(vars()['data1'+str(idata)]) == data1size-1:
vars()['data1'+str(idata)][key] = xydata1
idata+=1

# 为了尽量减少重复运算,将公用的数据尽可能存到高阶数组中:
d0 = arange(600,800,2)
A0 = arange(10,80,2)
d,A = ix_(d0,A0)
num_d = d.size
num_a = A.size
MAx = reshape(A+ d - d,(num_d,num_a,1,1) )
MAy = reshape(A + d,(num_a,num_d,1,1) )

from multiprocessing import Process,Queue
#定义每个进程中的函数:
def run_process(que,xydata1,xydata2,MAx,MAy):
match = {} #定义一个字典(放结果)
#......计算过程不赘述......得到结果:
match[key, Mwhere, Gwhere] = mind

#return 当前进程下产生的结果:
que.put(match)
que = Queue()
#start 每一个进程:
for idata in range(self.ncpu):
pro = Process(target=run_process, args=(que,self.gaiadata,vars()['data'+str(idata)],MAx,MAy))
pro.start()

pro.join()
#合并每一个进程的结果:
match={}
for idata in range(self.ncpu):
match=dict(match, **que.get(True))

#return 所有结果:
return match


在不同平台测试速度:
有台mac是OS系统 i7的2.8G 4核8线程16G,thinkpad是Linux CENTOS7系统 i5的2.5G 2核4线程6G,另有台Dell台式机是Linux Ubuntu系统 i7的3.9G 4核8线程16G;
有一台服务器是5节点100核,频率2.5G左右,内存未获知(未规定使用优先级,几乎没人用);
另有一台小超算25节点500核,频率2.5G左右,内存未获知(规定只能提交十个任务,平时也没什么用户,有关服务器和超算的硬件知识,我所知甚少,只知道管这个的老师这么讲了一下)

(一)当总的输入 data1 是72个时:

不做并行运算,居然是thinkpad最快(42s),Dell次之(70s),mac最慢(170s)#问题,为什么会是核少频低的最快呢?(mac开了别的程序,thinkpad与Dell皆未开别的程序,thinkpad也装了桌面系统,ubuntu自带桌面系统)
做并行计算:
2个进程下,主机最快(37s),thinkpad居中(39s),mac最慢(90s)
3个进程下,主机最快(40s),mac居中(55s),thinkpad最慢(70s)
4个进程下,都很慢,mac最慢
更多进程下,都很慢,徘徊在180s左右

然后用上服务器与小超算(服务器直接提交run.py运行,小超算要写成pbs文件用qsub提交后台运行,否则就在管理节点上运行了,不知道有没有什么影响):
2个进程下,小超算100s
4个进程下,小超算48s,服务器57s
6个进程下,小超算23s,服务器23s
7个进程下,小超算97s
8个进程下, ,服务器34s
10个进程下,小超算104s
24个进程下, ,服务器56s
36个进程下, ,服务器35s
72个进程下, ,服务器无反应,一直运行状态

超过一定进程,小超算就报错,任务被cancel

(二)当总的输入 data1 是380个时,用服务器测试了下(小超算做更多进程就报错了,原因是我不会用):

5进程 :195s
10进程:127s
16进程:140s
19进程:153s
20进程:145s
25进程:144s
30进程: 73s (最快)
40进程: 77s
50进程:140s

以上。
-------------------------------------

问题就是:

1- 在小型超算、服务器上用Python-multiprocessing并行计算与在个人电脑上有何异同?
2-Python的multiprocessing有哪些耗时项目呢,读写数据?计算?进程间通信?
3- 服务器为什么可以跑数十个进程,而小超算反而不让呢?
4- 怎么用小超算跑python的并行程序呢?
5- 服务器的节点、cpu、核是个什么概念呢,对我们做并行计算有什么影响呢,它们之间都可以用Queue或manager进行通信吗?
6-并行的效率怎么提高呢,怎么降低呢?
7-高阶数组运算一定比for循环更省时间么?


最近一个半月里初学Python,CSDN给了我很多帮助,以上问题是实在是搜索不到后才提出来的。问题很多,还望前辈和同仁不吝赐教,有什么说什么

...全文
410 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,092

社区成员

发帖
与我相关
我的任务
社区描述
云计算服务器、网络、虚拟化相关讨论
社区管理员
  • 服务器
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧