Parallel performance of a simple Python code#
Here is a summary of the results from running the mpi.py program.
import math
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [12,6]
Data from 2024#
# Dave
nprocDW = [64, 128, 400]
tsecDW = [1.8127, 1.8235, 1.7703]
# Taavi
nprocTH = [400, 250, 128, 256, 2]
tsecTH = [1.6464, 1.6550, 1.8639, 1.7926, 21.9166]
# Emilia
nprocET = [125, 5, 2, 400, 1]
tsecET = [1.8531, 8.0583, 18.8433, 1.74021, 62.12512]
# Jonna
nprocJH = [1, 100, 200, 2]
tsecJH = [61.7302, 1.6890, 1.6253, 19.4444]
# Lakshika
nprocLP = [2, 20, 50, 100, 200]
tsecLP = [20.521, 3.0581, 1.92967, 1.8597, 1.6422]
# Ana
nprocAH = [320, 256, 4]
tsecAH = [1.7391, 1.7510, 11.4626]
# Sanni
nprocSL = [10, 50, 100, 1]
tsecSL = [4.9980, 2.0352, 1.6758, 67.6969]
# Mehrnoosh
nprocMG = [400]
tsecMG = [1.6738]
# Ann-Kathrin
nprocAK = [100, 20, 250, 200, 5]
tsecAK = [1.8740, 3.3820, 1.5921, 1.6492, 8.6528]
# Elisa
nprocEM = [1, 20, 100, 250]
tsecEM = [64.0253, 3.2429, 1.9070, 1.6151]
# Convert to NumPy arrays
nprocDW = np.array(nprocDW)
tsecDW = np.array(tsecDW)
nprocTH = np.array(nprocTH)
tsecTH = np.array(tsecTH)
nprocET = np.array(nprocET)
tsecET = np.array(tsecET)
nprocJH = np.array(nprocJH)
tsecJH = np.array(tsecJH)
nprocLP = np.array(nprocLP)
tsecLP = np.array(tsecLP)
nprocAH = np.array(nprocAH)
tsecAH = np.array(tsecAH)
nprocSL = np.array(nprocSL)
tsecSL = np.array(tsecSL)
nprocMG = np.array(nprocMG)
tsecMG = np.array(tsecMG)
nprocAK = np.array(nprocAK)
tsecAK = np.array(tsecAK)
nprocEM = np.array(nprocEM)
tsecEM = np.array(tsecEM)
# Plot data
f, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(nprocDW, tsecDW, 'o', label='Dave')
ax1.plot(nprocTH, tsecTH, 'o', label='Taavi')
ax1.plot(nprocET, tsecET, 'o', label='Emilia')
ax1.plot(nprocJH, tsecJH, 'o', label='Jonna')
ax1.plot(nprocLP, tsecLP, 'o', label='Lakshika')
ax1.plot(nprocAH, tsecAH, 'o', label='Ana')
ax1.plot(nprocSL, tsecSL, 'o', label='Sanni')
ax1.plot(nprocMG, tsecMG, 'o', label='Mehrnoosh')
ax1.plot(nprocAK, tsecAK, 'o', label='Ann-Kathrin')
ax1.plot(nprocEM, tsecEM, 'o', label='Elisa')
ax1.set_xlabel('Number of cores')
ax1.set_ylabel('Calculation time [s]')
ax1.set_title('Raw parallel performance')
ax1.legend()
# Find bounds for reference parallel performance line
minx = min(nprocDW.min(), nprocTH.min(), nprocET.min(), nprocJH.min(), nprocLP.min(), nprocAH.min(), nprocSL.min(), nprocMG.min(), nprocAK.min(), nprocEM.min())
miny = min(tsecDW.min(), tsecTH.min(), tsecET.min(), tsecJH.min(), tsecLP.min(), tsecAH.min(), tsecSL.min(), tsecMG.min(), tsecAK.min(), tsecEM.min())
maxy = max(tsecDW.max(), tsecTH.max(), tsecET.max(), tsecJH.max(), tsecLP.max(), tsecAH.max(), tsecSL.max(), tsecMG.max(), tsecAK.max(), tsecEM.max())
maxx = minx + (maxy - miny)
ax2.plot([np.log2(minx), np.log2(maxx)], [np.log2(maxy), np.log2(miny)], 'k--', label='Perfect parallelization')
ax2.plot(np.log2(nprocDW), np.log2(tsecDW), 'o', label='Dave')
ax2.plot(np.log2(nprocTH), np.log2(tsecTH), 'o', label='Taavi')
ax2.plot(np.log2(nprocET), np.log2(tsecET), 'o', label='Emilia')
ax2.plot(np.log2(nprocJH), np.log2(tsecJH), 'o', label='Jonna')
ax2.plot(np.log2(nprocLP), np.log2(tsecLP), 'o', label='Lakshika')
ax2.plot(np.log2(nprocAH), np.log2(tsecAH), 'o', label='Ana')
ax2.plot(np.log2(nprocSL), np.log2(tsecSL), 'o', label='Sanni')
ax2.plot(np.log2(nprocMG), np.log2(tsecMG), 'o', label='Mehrnoosh')
ax2.plot(np.log2(nprocAK), np.log2(tsecAK), 'o', label='Ann-Kathrin')
ax2.plot(np.log2(nprocEM), np.log2(tsecEM), 'o', label='Elisa')
#ax2.plot(np.log2(nprocDW), np.log2(tsecDW), 'o', label='User 1')
#ax2.plot(np.log2(nprocLT), np.log2(tsecLT), 'o', label='User 2')
#ax2.plot(np.log2(nprocLC), np.log2(tsecLC), 'o', label='User 3')
#ax2.plot(np.log2(nprocTV), np.log2(tsecTV), 'o', label='User 4')
#ax2.plot(np.log2(nprocTL), np.log2(tsecTL), 'o', label='User 5')
#ax2.plot(np.log2(nprocYW), np.log2(tsecYW), 'o', label='User 6')
ax2.axis('equal')
ax2.set_xlabel('log$_{2}$(Number of cores)')
ax2.set_ylabel('log$_{2}$(Calculation time) [s]')
ax2.set_title('Log$_{2}$ parallel performance')
ax2.legend()
<matplotlib.legend.Legend at 0x7e0ef4759fd0>
Data from 2020#
# Dave
nprocDW = [64, 64, 320]
tsecDW = [2.2847, 1.5821, 1.0517]
# Leevi
nprocLT = [2, 8, 16, 64, 256]
tsecLT = [19.96, 6.23, 3.52, 2.26, 1.15]
# Letizia
nprocLC = [2, 8, 16, 32, 64, 256]
tsecLC = [22.8416, 6.2493, 3.3238, 4.0696, 2.3058, 1.1402]
# Tommi
nprocTV = [ 1, 2, 4, 16, 32, 64, 256 ]
tsecTV = [ 43.4103989601, 23.3102600574, 11.0595788956, 3.5252571106, 4.08421611786, 2.28794884682, 1.16591596603 ]
# Tuija
nprocTL = [2, 8, 16, 32, 128]
tsecTL = [19.8880, 6.5444, 3.4134, 4.2096, 1.3018]
# Yijun
nprocYW = [16,32,64,128,256]
tsecYW = [3.3989,4.2119,1.5718,1.3543,1.1443]
# Convert to NumPy arrays
nprocDW = np.array(nprocDW)
tsecDW = np.array(tsecDW)
nprocLT = np.array(nprocLT)
tsecLT = np.array(tsecLT)
nprocLC = np.array(nprocLC)
tsecLC = np.array(tsecLC)
nprocTV = np.array(nprocTV)
tsecTV = np.array(tsecTV)
nprocTL = np.array(nprocTL)
tsecTL = np.array(tsecTL)
nprocYW = np.array(nprocYW)
tsecYW = np.array(tsecYW)
# Plot data
f, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(nprocDW, tsecDW, 'o', label='User 1')
ax1.plot(nprocLT, tsecLT, 'o', label='User 2')
ax1.plot(nprocLC, tsecLC, 'o', label='User 3')
ax1.plot(nprocTV, tsecTV, 'o', label='User 4')
ax1.plot(nprocTL, tsecTL, 'o', label='User 5')
ax1.plot(nprocYW, tsecYW, 'o', label='User 6')
ax1.set_xlabel('Number of cores')
ax1.set_ylabel('Calculation time [s]')
ax1.set_title('Raw parallel performance')
ax1.legend()
# Find bounds for reference parallel performance line
minx = min(nprocDW.min(), nprocLT.min(), nprocLC.min(), nprocTV.min(), nprocTL.min(), nprocYW.min())
miny = min(tsecDW.min(), tsecLT.min(), tsecLC.min(), tsecTV.min(), tsecTL.min(), tsecYW.min())
maxy = max(tsecDW.max(), tsecLT.max(), tsecLC.max(), tsecTV.max(), tsecTL.max(), tsecYW.max())
maxx = minx + (maxy - miny)
ax2.plot([np.log2(minx), np.log2(maxx)], [np.log2(maxy), np.log2(miny)], 'k--', label='Perfect parallelization')
ax2.plot(np.log2(nprocDW), np.log2(tsecDW), 'o', label='User 1')
ax2.plot(np.log2(nprocLT), np.log2(tsecLT), 'o', label='User 2')
ax2.plot(np.log2(nprocLC), np.log2(tsecLC), 'o', label='User 3')
ax2.plot(np.log2(nprocTV), np.log2(tsecTV), 'o', label='User 4')
ax2.plot(np.log2(nprocTL), np.log2(tsecTL), 'o', label='User 5')
ax2.plot(np.log2(nprocYW), np.log2(tsecYW), 'o', label='User 6')
ax2.axis('equal')
ax2.set_xlabel('log$_{2}$(Number of cores)')
ax2.set_ylabel('log$_{2}$(Calculation time) [s]')
ax2.set_title('Log$_{2}$ parallel performance')
ax2.legend()
<matplotlib.legend.Legend at 0x7e0ef22c12b0>