## 5 Experiments
### Analysis of the Results
Results of function \(p\) for various compilation optimization options are presented in Table 5.  
Figure 12: Execution times for SPMD, for better of Docker and host versions; boxplot notation: medians, Q1 and Q3, max(Q1\(-\)1.5 IQR, minimum) and min(Q3+1.5 IQR, maximum) as well as potential outliers (+ for O2, x for O3, * for O3_native). \[p(param_{A},param_{B},prog)=\frac{\sum\limits_{proc=1,2,4,8,16,32,64,128,256} median_{dh}(param_{A},prog,proc)}{\sum\limits_{proc=1,2,4,8,16,32,64,128,256} median_{dh}(param_{B},prog,proc)}[\text{s}] \tag{5}\]  
Table 5 makes it easier to infer which parameter should be used in subsequent parts of the experiment:  
* O2 is faster than O3,
- O2 is faster than O3_native,
* O2 is faster than O3,
- O3_native is faster than O2,
* O3 is faster than O2,
- O3_native is faster than O2,
- O3_native is faster than O3. Equation (6) is very similar to function \(p\), but due to the different order of operation (function \(p\) represents dividing of sums, but function \(p^{\prime}\) represents average of sum of division), the results of the two equations may be slightly different. In our case, both functions allow us to deduce the same best compilation parameter. \[p^{\prime}(param_{A},param_{B},prog)=\frac{\sum\limits_{proc=1,2,4,8,16,32,64,128,256}\left(\frac{min_{dh}(param_{A},prog,proc)}{min_{dh}(param_{B},prog,proc)} \right)}{9}[\text{s}] \tag{6}\]  
For further research, the compilation optimization options were selected as shown in Table 6. We shall also note that the best selected flags are also best when considered individually for either Docker or Host values. In Figure 13 and Table 7 we compare speed-ups of all programs for Docker and Host with the selected compilation options. Scaling the application for Docker and Host is very similar. We can note that, the best speed-up for DAC and Host is reached using \begin{table}
\begin{tabular}{c c} \hline \hline
**Program** & **The Best Compilation Flag** \\ \hline DAC & O2 \\ \hline MasterSlave & O3\_native \\ \hline SPMD & O3\_native \\ \hline \hline \end{tabular}
\end{table} 
Table 6: The best compilation flag for each program. \begin{table}
\begin{tabular}{c c c c} \hline \hline
**Program** & \(\frac{param_{a}=O2}{param_{a}=O3}\) & \(\frac{param_{a}=O2}{param_{a}=O3\_native}\) & \(\frac{param_{a}=O3\_native}{param_{a}=O3\_native}\) \\ \hline DAC & 0.9985 & 0.8756 & 0.8769 \\ \hline MasterSlave & 0.9998 & 1.0304 & 1.0306 \\ \hline SPMD & 1.0012 & 1.0020 & 1.0008 \\ \hline \hline \end{tabular}
\end{table} 
Table 5: Execution time factor for parameters (results of \(p\) function). 256 processes (oversubscription) although it is very close to 64 and 128 process configurations, for DAC and Docker it is best for 64 processes; for MasterSlave, using 64 processes; and SPMD--128 processes and falling afterwards. Speed-up was calculated using function (7). \[speedup(mach,param,prog,proc)=\frac{medianExecutionTime(mach,param,prog,1)}{medianExecutionTime(mach,param,prog,proc)} \tag{7}\]  
We shall note that we generally expect a decrease in execution time with an increasing number of processes assuming these run on separate physical or logical cores in the system, in our case 64 and 128 respectively, because such a scenario allows shortening the computational phase. This is possible, provided that the communication and synchronization