Skip to content

Commit 7fe11f9

Browse files
committed
Pushing section 5
1 parent 7db920d commit 7fe11f9

13 files changed

Lines changed: 531 additions & 0 deletions
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#!/usr/bin/env python
2+
from mpi4py import MPI
3+
import numpy as np
4+
5+
comm = MPI.COMM_WORLD
6+
rank = comm.Get_rank()
7+
mpisize = comm.Get_size()
8+
9+
def output(var,nomen,rank,method=None,operation=None):
10+
if method==None and operation==None:
11+
print "Rank %d sees %s as %s" %(rank,nomen,var)
12+
else:
13+
print "Rank %d sees %s as %s after %s using %s" %(rank,nomen,var,method,operation)
14+
15+
16+
if rank == 0:
17+
local_dict={'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':'gee whiz', 'h':('hi', 'there') }
18+
local_list_max=[rank+i for i in range(mpisize/2)]
19+
local_list_sum=[rank+i for i in range(mpisize/2)]
20+
local_string="""This is a string."""
21+
local_tuple=(rank,)*mpisize
22+
local_np_array=np.array(range(10))
23+
else:
24+
local_dict=None
25+
local_list_max=[rank*i for i in range(mpisize/2)]
26+
local_list_sum=[rank*i for i in range(mpisize/2)]
27+
local_string="""This should be fun!"""
28+
local_tuple=(rank,)*mpisize
29+
local_np_array=np.array(range(10))
30+
31+
comm.Barrier()
32+
33+
if rank == 0:
34+
print "#"*78
35+
output(local_dict,'local_dict',rank)
36+
output(local_list_max,'local_list_max',rank)
37+
output(local_list_sum,'local_list_sum',rank)
38+
output(local_string,'local_string',rank)
39+
output(local_tuple,'local_tuple',rank)
40+
output(local_np_array,'local_np_array',rank)
41+
42+
comm.Barrier()
43+
44+
if rank == 6:
45+
print "#"*78
46+
output(local_dict,'local_dict',rank)
47+
output(local_list_max,'local_list_max',rank)
48+
output(local_list_sum,'local_list_sum',rank)
49+
output(local_string,'local_string',rank)
50+
output(local_tuple,'local_tuple',rank)
51+
output(local_np_array,'local_np_array',rank)
52+
53+
comm.Barrier()
54+
55+
if rank == 0:
56+
print "#"*78
57+
print ""
58+
print "Running collective operations"
59+
print ""
60+
61+
comm.Barrier()
62+
63+
local_dict = comm.scatter(local_dict)
64+
local_list_max = comm.allreduce(local_list_max,op=MPI.MAX)
65+
local_list_sum = comm.allreduce(local_list_sum,op=MPI.SUM)
66+
local_string = comm.bcast(local_string)
67+
local_tuple = comm.alltoall(local_tuple)
68+
local_np_array = comm.allreduce(local_np_array,op=MPI.SUM)
69+
70+
comm.Barrier()
71+
if rank == 0:
72+
print "#"*78
73+
output(local_dict,'local_dict',rank)
74+
output(local_list_max,'local_list_max',rank,'allreduce','max')
75+
output(local_list_sum,'local_list_sum',rank,'allreduce','sum')
76+
output(local_string,'local_string',rank,'bcast')
77+
output(local_tuple,'local_tuple',rank,'alltoall')
78+
output(local_np_array,'local_np_array',rank,'allreduce')
79+
80+
comm.Barrier()
81+
if rank == 6:
82+
print "#"*78
83+
output(local_dict,'local_dict',rank)
84+
output(local_list_max,'local_list_max',rank,'allreduce','max')
85+
output(local_list_sum,'local_list_sum',rank,'allreduce','sum')
86+
output(local_string,'local_string',rank,'bcast')
87+
output(local_tuple,'local_tuple',rank,'alltoall')
88+
output(local_np_array,'local_np_array',rank,'allreduce')
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#!/usr/bin/env python2.7
2+
3+
# File: builtins_mpi_pi.py
4+
# Author: William Scullin
5+
# Date: 2015-11-28
6+
#
7+
# Sample program that does a parallel monte carlo calculation of pi using MPI
8+
# and standard library functions. NumPy is only invoked to create mutable
9+
# buffers for mpi4py to read and write to/from.
10+
11+
from mpi4py import MPI
12+
import numpy as np
13+
import random
14+
import util
15+
16+
17+
def calcpi(samples):
18+
"""calculate Pi in parallel using standard library functions"""
19+
comm = MPI.COMM_WORLD
20+
rank = comm.Get_rank()
21+
mpisize = comm.Get_size()
22+
23+
# we need this to have a muteable buffer for mpi4py
24+
# to write into so we don't need to serialize data
25+
pi = np.zeros(1)
26+
27+
28+
nsamples = int(samples/mpisize)
29+
inside = 0
30+
random.seed(rank)
31+
for i in range(nsamples):
32+
x = random.random()
33+
y = random.random()
34+
if (x*x)+(y*y) < 1:
35+
inside += 1
36+
mypi = (4.0*inside)/nsamples
37+
38+
# capital Reduce works with C/NumPy compatible data
39+
# -types and avoids the need to serialize data at
40+
# transmission and receipt. Lowercase reduce would
41+
# work on Python objects.
42+
#
43+
# The value of mypi will be summed into pi on rank 0
44+
comm.Reduce(np.array(mypi), pi, op=MPI.SUM, root=0)
45+
return pi/mpisize
46+
47+
if __name__ == '__main__':
48+
samples = util.get_sample_count()
49+
50+
comm = MPI.COMM_WORLD
51+
rank = comm.Get_rank()
52+
53+
start_time = MPI.Wtime()
54+
55+
pi = calcpi(samples)
56+
57+
end_time = MPI.Wtime()
58+
59+
if rank == 0:
60+
util.output(samples, pi, start_time, end_time)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/usr/bin/env python2.7
2+
3+
# File: builtins_pi.py
4+
# Author: William Scullin
5+
# Date: 2015-11-28
6+
#
7+
# Sample program that does a serial monte carlo calculation of pi using only
8+
# functions from the standard library.
9+
10+
import random
11+
import time
12+
import util
13+
14+
15+
def calcpi(nsamples):
16+
"""serially calculate Pi using only standard library functions"""
17+
inside = 0
18+
random.seed(0)
19+
for i in range(int(samples)):
20+
x = random.random()
21+
y = random.random()
22+
if (x*x)+(y*y) < 1:
23+
inside += 1
24+
return (4.0 * inside)/samples
25+
26+
if __name__ == '__main__':
27+
samples = util.get_sample_count()
28+
29+
start_time = time.time()
30+
31+
pi = calcpi(samples)
32+
33+
end_time = time.time()
34+
35+
util.output(samples, pi, start_time, end_time)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env python2.7
2+
3+
# File: builtins_mpi_pi.py
4+
# Author: William Scullin
5+
# Date: 2015-11-28
6+
#
7+
# Sample program that does a parallel monte carlo calculation of pi using MPI
8+
# and standard library functions. NumPy is only invoked to create mutable
9+
# buffers for mpi4py to read and write to/from.
10+
11+
from mpi4py import MPI
12+
import numpy as np
13+
import random
14+
import util
15+
16+
17+
def calcpi(samples):
18+
"""calculate Pi in parallel using standard library functions"""
19+
comm = MPI.COMM_WORLD
20+
rank = comm.Get_rank()
21+
mpisize = comm.Get_size()
22+
23+
nsamples = int(samples/mpisize)
24+
inside = 0
25+
random.seed(rank)
26+
for i in range(nsamples):
27+
x = random.random()
28+
y = random.random()
29+
if (x*x)+(y*y) < 1:
30+
inside += 1
31+
pi = (4.0*inside)/nsamples
32+
33+
# capital Reduce works with C/NumPy compatible data
34+
# -types and avoids the need to serialize data at
35+
# transmission and receipt. Lowercase reduce would
36+
# work on Python objects.
37+
#
38+
# The value of mypi will be summed into pi on rank 0
39+
pi=comm.reduce(pi, op=MPI.SUM, root=0)
40+
if rank==0:
41+
pi=pi/mpisize
42+
return pi
43+
44+
if __name__ == '__main__':
45+
samples = util.get_sample_count()
46+
47+
comm = MPI.COMM_WORLD
48+
rank = comm.Get_rank()
49+
50+
start_time = MPI.Wtime()
51+
52+
pi = calcpi(samples)
53+
54+
end_time = MPI.Wtime()
55+
56+
if rank == 0:
57+
util.output(samples, pi, start_time, end_time)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#!/usr/bin/env python2.7
2+
3+
# File: numba_mpi_pi.py
4+
# Author: William Scullin
5+
# Date: 2015-11-28
6+
#
7+
# Sample program that does a parallel monte carlo calculation of pi using MPI
8+
# and standard library functions, but invokes the Numba JIT to speed
9+
# calculation. NumPy is only invoked to create mutable buffers for mpi4py to
10+
# read and write into.
11+
12+
from mpi4py import MPI
13+
import numpy as np
14+
import random
15+
from numba import jit
16+
import util
17+
18+
19+
@jit
20+
def calcpi(nsamples):
21+
"""calculate Pi using Numba jit"""
22+
inside = 0
23+
for i in range(nsamples):
24+
x = random.random()
25+
y = random.random()
26+
27+
if (x*x)+(y*y) < 1:
28+
inside += 1
29+
30+
return (4.0 * inside)/nsamples
31+
32+
33+
@jit
34+
def calcpi_mpi(samples):
35+
"""carry out Pi calculations in parallel using MPI"""
36+
37+
# Needed to provide mpi4py a writable buffer
38+
pi = np.zeros(1)
39+
40+
comm = MPI.COMM_WORLD
41+
rank = comm.Get_rank()
42+
mpisize = comm.Get_size()
43+
44+
nsamples = int(samples/mpisize)
45+
random.seed(rank)
46+
mypi = np.array(calcpi(nsamples))
47+
48+
comm.Reduce(mypi, pi, op=MPI.SUM, root=0)
49+
return pi/mpisize
50+
51+
52+
if __name__ == '__main__':
53+
samples = util.get_sample_count()
54+
55+
comm = MPI.COMM_WORLD
56+
rank = comm.Get_rank()
57+
58+
start_time = MPI.Wtime()
59+
60+
pi = calcpi_mpi(samples)
61+
62+
end_time = MPI.Wtime()
63+
64+
if rank == 0:
65+
util.output(samples, pi, start_time, end_time)

5-AdvancedScaling/pi/numba_pi.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env python2.7
2+
3+
# File: numba_pi.py
4+
# Author: William Scullin
5+
# Date: 2015-11-28
6+
#
7+
# Sample program that does a serial monte carlo calculation of pi using
8+
# standard library functions, but invokes the Numba JIT to speed calculation.
9+
10+
11+
import random
12+
import time
13+
from numba import jit
14+
import util
15+
16+
17+
@jit
18+
def calcpi(nsamples):
19+
"""carry out Pi calculations in serial using Numba jit"""
20+
random.seed(0)
21+
inside = 0
22+
for i in range(nsamples):
23+
x = random.random()
24+
y = random.random()
25+
26+
if (x*x)+(y*y) < 1:
27+
inside += 1
28+
return (4.0 * inside)/nsamples
29+
30+
if __name__ == '__main__':
31+
samples = util.get_sample_count()
32+
start_time = time.time()
33+
34+
pi = calcpi(samples)
35+
36+
end_time = time.time()
37+
38+
util.output(samples, pi, start_time, end_time)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/env python2.7
2+
3+
# File: numpy_mpi_pi.py
4+
# Author: William Scullin
5+
# Date: 2015-11-28
6+
#
7+
# Sample program that does a parallel monte carlo calculation of pi using MPI
8+
# and NumPy functions for speed. Note that performance my strongly depend on
9+
# your NumPy build and MPI implementation.
10+
11+
from mpi4py import MPI
12+
import numpy as np
13+
import util
14+
15+
16+
def calcpi(samples):
17+
"""calculate Pi using numpy and mpi"""
18+
comm = MPI.COMM_WORLD
19+
rank = comm.Get_rank()
20+
mpisize = comm.Get_size()
21+
nsamples = int(samples/mpisize)
22+
pi = np.zeros(1)
23+
24+
np.random.seed(rank)
25+
xy = np.random.random((nsamples, 2))
26+
mypi = np.array(4.0*np.sum(np.sum(xy**2, 1) < 1)/nsamples)
27+
28+
comm.Reduce(mypi, pi, op=MPI.SUM, root=0)
29+
return pi/mpisize
30+
31+
if __name__ == '__main__':
32+
samples = util.get_sample_count()
33+
34+
comm = MPI.COMM_WORLD
35+
rank = comm.Get_rank()
36+
37+
start_time = MPI.Wtime()
38+
39+
pi = calcpi(samples)
40+
41+
end_time = MPI.Wtime()
42+
43+
if rank == 0:
44+
util.output(samples, pi, start_time, end_time)

0 commit comments

Comments
 (0)