Skip to content

Commit 14a7a00

Browse files
committed
optimized sharing among processors
1 parent 82f8bcf commit 14a7a00

File tree

4 files changed

+60
-13
lines changed

4 files changed

+60
-13
lines changed

004_estimated_scaling.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import pylab as pl
2+
import numpy as np
3+
4+
N_segments = 35
5+
i_end_parallel = N_segments
6+
7+
N_per_worker_list = []
8+
N_master_list = []
9+
N_nodes_list = range(2,N_segments+1)
10+
for N_nodes in N_nodes_list:
11+
N_per_worker = N_segments/(N_nodes-1)
12+
N_master = N_segments-(N_nodes-1)*N_per_worker
13+
14+
N_per_worker_list.append(N_per_worker)
15+
N_master_list.append(N_master)
16+
17+
pl.figure(1)
18+
pl.plot(N_per_worker_list, 'b.-')
19+
pl.plot(N_master_list, 'r.-')
20+
21+
N_per_worker_list = []
22+
N_master_list = []
23+
N_nodes_list = range(2,N_segments+1)
24+
for N_nodes in N_nodes_list:
25+
N_wkrs = N_nodes-1
26+
N_per_worker = int(np.ceil(float(i_end_parallel)/N_nodes))
27+
28+
N_master = N_segments-(N_nodes-1)*N_per_worker
29+
30+
N_per_worker_list.append(N_per_worker)
31+
N_master_list.append(N_master)
32+
33+
pl.figure(2)
34+
pl.plot(N_per_worker_list, 'b.-')
35+
pl.plot(N_master_list, 'r.-')
36+
37+
pl.show()

share_segments.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import numpy as np
2+
3+
class ShareSegments(object):
4+
def __init__(self, N_segments, N_nodes):
5+
self.N_segments_per_node = np.array(N_nodes*[N_segments//N_nodes])
6+
rem = N_segments-N_segments//N_nodes*N_nodes
7+
self.N_segments_per_node[:rem]+=1
8+
self.start_parts = np.array([0]+list(np.cumsum(self.N_segments_per_node)))
9+
10+
def my_part(self, myid):
11+
return self.start_parts[myid], self.start_parts[myid+1]
12+

test_ring_with_objects/Simulation.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import communication_helpers as ch
22
import numpy as np
33
from scipy.constants import c
4+
import share_segments as shs
45

56

67
class Simulation(object):
@@ -22,15 +23,13 @@ def init_all(self):
2223
i_end_parallel = len(self.machine.one_turn_map)-1 #only RF is not parallelizable
2324

2425
# split the machine
25-
N_wkrs = self.ring_of_CPUs.N_wkrs
26-
N_elements_per_worker = int(np.floor(float(i_end_parallel)/N_wkrs))
26+
sharing = shs.ShareSegments(i_end_parallel, self.ring_of_CPUs.N_nodes)
2727
myid = self.ring_of_CPUs.myid
28-
print 'N_elements_per_worker', N_elements_per_worker
28+
i_start_part, i_end_part = sharing.my_part(myid)
29+
self.mypart = self.machine.one_turn_map[i_start_part:i_end_part]
2930
if self.ring_of_CPUs.I_am_a_worker:
30-
self.mypart = self.machine.one_turn_map[N_elements_per_worker*myid:N_elements_per_worker*(myid+1)]
31-
print 'I am id=%d and my part is %d long'%(myid, len(self.mypart))
31+
print 'I am id=%d (worker) and my part is %d long'%(myid, len(self.mypart))
3232
elif self.ring_of_CPUs.I_am_the_master:
33-
self.mypart = self.machine.one_turn_map[N_elements_per_worker*(N_wkrs):i_end_parallel]
3433
self.non_parallel_part = self.machine.one_turn_map[i_end_parallel:]
3534
print 'I am id=%d (master) and my part is %d long'%(myid, len(self.mypart))
3635

@@ -80,7 +79,7 @@ def finalize_turn_on_master(self, pieces_treated):
8079
for ele in self.non_parallel_part:
8180
ele.track(bunch)
8281

83-
#csave results
82+
#save results
8483
self.beam_x.append(bunch.mean_x())
8584
self.beam_y.append(bunch.mean_y())
8685
self.beam_z.append(bunch.mean_z())

test_ring_with_objects/Simulation_with_eclouds.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import communication_helpers as ch
22
import numpy as np
33
from scipy.constants import c, e
4+
import share_segments as shs
45

56

67
class Simulation(object):
@@ -24,15 +25,13 @@ def init_all(self):
2425
i_end_parallel = len(self.machine.one_turn_map)-1 #only RF is not parallelizable
2526

2627
# split the machine
27-
N_wkrs = self.ring_of_CPUs.N_wkrs
28-
N_elements_per_worker = int(np.floor(float(i_end_parallel)/N_wkrs))
28+
sharing = shs.ShareSegments(i_end_parallel, self.ring_of_CPUs.N_nodes)
2929
myid = self.ring_of_CPUs.myid
30-
print 'N_elements_per_worker', N_elements_per_worker
30+
i_start_part, i_end_part = sharing.my_part(myid)
31+
self.mypart = self.machine.one_turn_map[i_start_part:i_end_part]
3132
if self.ring_of_CPUs.I_am_a_worker:
32-
self.mypart = self.machine.one_turn_map[N_elements_per_worker*myid:N_elements_per_worker*(myid+1)]
33-
print 'I am id=%d and my part is %d long'%(myid, len(self.mypart))
33+
print 'I am id=%d (worker) and my part is %d long'%(myid, len(self.mypart))
3434
elif self.ring_of_CPUs.I_am_the_master:
35-
self.mypart = self.machine.one_turn_map[N_elements_per_worker*(N_wkrs):i_end_parallel]
3635
self.non_parallel_part = self.machine.one_turn_map[i_end_parallel:]
3736
print 'I am id=%d (master) and my part is %d long'%(myid, len(self.mypart))
3837

0 commit comments

Comments
 (0)