diff --git a/tests/population/scaling/argparseo.py b/tests/population/scaling/argparse_setup.py similarity index 100% rename from tests/population/scaling/argparseo.py rename to tests/population/scaling/argparse_setup.py diff --git a/tests/population/scaling/plot_amdahl.py b/tests/population/scaling/plot_amdahl.py deleted file mode 100644 index 53cd235acbb8a39500f19705e6f18626b68d9468..0000000000000000000000000000000000000000 --- a/tests/population/scaling/plot_amdahl.py +++ /dev/null @@ -1,21 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np - - -def amdahl(f, n): - return 1.0 / ((1 - f) + (f / n)) - - -cores = np.arange(1, 10, 0.1) -values_list = [] -par_vals = np.arange(0, 1.1, 0.1) - - -for par_val in par_vals: - values = amdahl(par_val, cores) - values_list.append(values) - - -for values in values_list: - plt.plot(cores, values, "b-") -plt.show() diff --git a/tests/population/scaling/plot_scaling.py b/tests/population/scaling/plot_scaling.py index a5e1e45c1006d911a3d8983cb1d8e9dcc26f17fe..0afa06c399086b29dc332b9ed487c0a6d89cb3e7 100644 --- a/tests/population/scaling/plot_scaling.py +++ b/tests/population/scaling/plot_scaling.py @@ -1,139 +1,13 @@ import os +import json +import math import matplotlib.pyplot as plt import pandas as pd import numpy as np -def calc_mean_and_std(arr): - return np.mean(arr), np.std(arr) - - -def calculate_results(results, unique_amt_cores, unique_amt_systems): - """ - Function to calculate the numbers - """ - - calculated_results = [] - for i in unique_amt_cores: - for j in unique_amt_systems: - ( - total_time_sequential_list, - total_time_multiprocessing_list, - total_ratio_list, - ) = ([], [], []) - - for res in results: - if (res[0] == i) & (res[1] == j): - total_time_sequential_list.append(res[2]) - total_time_multiprocessing_list.append(res[3]) - total_ratio_list.append(res[4]) - - if ( - (total_time_sequential_list) - and (total_time_multiprocessing_list) - and (total_ratio_list) - ): - # calculate stuff - mean_time_sequential, std_sequential = calc_mean_and_std( - np.array(total_time_sequential_list) - ) - mean_time_multiprocessing, std_multiprocessing = calc_mean_and_std( - np.array(total_time_multiprocessing_list) - ) - mean_ratio, std_ratio = calc_mean_and_std(np.array(total_ratio_list)) - - # make dict - res_dict = { - "cores": i, - "systems": j, - "mean_time_sequential": mean_time_sequential, - "mean_time_multiprocessing": mean_time_multiprocessing, - "mean_ratio": mean_ratio, - "std_sequential": std_sequential, - "std_multiprocessing": std_multiprocessing, - "std_ratio": std_ratio, - "total_runs": len(total_time_sequential_list), - } - - calculated_results.append(res_dict) - - return calculated_results - - -def plot_speedup_and_efficiency( - calculated_results, unique_amt_cores, unique_amt_systems -): - x_position_shift = 0 - y_position_shift = -0.05 - max_speedup = 0 - - # https://stackoverflow.com/questions/46323530/matplotlib-plot-two-x-axes-one-linear-and-one-with-logarithmic-ticks - fig, ax1 = plt.subplots() - ax2 = ax1.twinx() - for amt_systems in unique_amt_systems: - - cores = [] - speedup = [] - std = [] - efficiency = [] - - for el in calculated_results: - if el["systems"] == amt_systems: - - cores.append(el["cores"] + x_position_shift) - speedup.append(el["mean_ratio"]) - std.append(el["std_ratio"]) - efficiency.append(el["mean_ratio"] / el["cores"]) - - if el["mean_ratio"] > max_speedup: - max_speedup = el["mean_ratio"] - - # add number of runs its based on - ax1.text( - el["cores"] + x_position_shift + 0.01, - el["mean_ratio"] + y_position_shift, - el["total_runs"], - ) - - ax1.errorbar( - cores, - speedup, - std, - linestyle="None", - marker="^", - label="Speed up & efficiency of {} systems".format(amt_systems), - ) - - ax2.plot(cores, efficiency, alpha=0.5) - x_position_shift += 0.1 - - ax1.set_title( - "Speed up ratio vs amount of cores for different amounts of systems on {}".format( - name_testcase - ) - ) - ax1.set_xlabel("Amount of cores used") - ax1.set_ylabel("Speed up ratio (time_linear/time_parallel)") - - ax1.set_xlim(0, max(unique_amt_cores) + 4) - ax1.set_ylim(0, max_speedup + 2) - ax2.set_ylim(0, 1) - - ax1.grid() - ax1.legend(loc=4) - fig.savefig( - os.path.join(img_dir, "speedup_scaling_{}.{}".format(name_testcase, "png")) - ) - fig.savefig( - os.path.join(img_dir, "speedup_scaling_{}.{}".format(name_testcase, "pdf")) - ) - fig.savefig( - os.path.join(img_dir, "speedup_scaling_{}.{}".format(name_testcase, "eps")) - ) - plt.show() - - +# Old plotting routine, needs updating def plot_runtime(calculated_results, unique_amt_cores, unique_amt_systems): fig = plt.figure() ax = fig.add_subplot(111) @@ -211,47 +85,131 @@ def plot_runtime(calculated_results, unique_amt_cores, unique_amt_systems): plt.show() +def amdahl(f, n): + return 1.0 / ((1 - f) + (f / n)) -##################### - -# Configure -result_file = "comparison_result_laptop.dat" -# result_file = "comparison_result_astro1.dat" -name_testcase = "laptop" -img_dir = "scaling_plots" - -# Readout file -results = [] -with open(result_file, "r") as f: - for line in f: - res = list(eval(line.strip())) - if len(res) == 6: - res.append(res[-2] / res[-1]) - results.append(res) - -# make dataframe and set correct headers. -headers = [ - "cores", - "total_systems", - "total_time_sequentially", - "total_time_multiprocessing", - "ratio", -] +def plot_speedup_and_efficiency(result_json_filenames, plot_output_dir, name_testcase, machine): + """ + Plotting routine to plot the speedup and efficiency of scaling + + Takes the name_testcase and hostname values of + the first json file to add some info to the plots. + """ + + # Setup figure + fig, ax1 = plt.subplots() + ax2 = ax1.twinx() + + # Go over all result jsons + for i, jsonfile in enumerate(result_json_filenames): + print("Processing {}".format(jsonfile)) + with open(jsonfile, "r") as f: + result_data = json.loads(f.read()) + + # if i==0: + # name_testcase = result_data['name_testcase'] + # hostname = result_data['hostname'] + + # Get linear data + linear_data = result_data["linear"] + linear_mean = np.mean(linear_data) + linear_stdev = np.std(linear_data) + + # Get multiprocessing data + cpus, speedups, efficiencies, stddev_speedups = [], [], [], [] + for amt_cpus in result_data["mp"]: + + # Get mp data + mp_data = result_data["mp"][amt_cpus] + mp_mean = np.mean(mp_data) + mp_stdev = np.std(mp_data) + + # Calc + amt_cpus = int(amt_cpus) + speedup = linear_mean / mp_mean + stddev_speedup = ( + math.sqrt((linear_stdev / linear_mean) ** 2 + (mp_stdev / mp_mean) ** 2) + * speedup + ) + efficiency = speedup / int(amt_cpus) + + # Add to lists + cpus.append(amt_cpus) + efficiencies.append(efficiency) + speedups.append(speedup) + stddev_speedups.append(stddev_speedup) + + # Plot + ax1.errorbar( + cpus, + speedups, + stddev_speedups, + linestyle="None", + marker="^", + label="Speed up & efficiency of {} systems".format( + result_data["amt_systems"] + ), + ) + + # Plot the efficiencies + ax2.plot(cpus, efficiencies, alpha=0.5) -df = pd.DataFrame(results) -df.columns = headers + # x_position_shift += 0.1 -# Select unique amounts -unique_amt_cores = df["cores"].unique() -unique_amt_systems = df["total_systems"].unique() + ##################### + # Extra plots -# Create dictionary with calculated means and stdevs etc -calculated_results = calculate_results(results, unique_amt_cores, unique_amt_systems) + # 100 % scaling line + ax1.plot([1, max(cpus)], [1, max(cpus)], '--', alpha=0.25, label='100% scaling') -######################################################################################## -# Plot speed up and efficiency. -plot_speedup_and_efficiency(calculated_results, unique_amt_cores, unique_amt_systems) + # Amdahls law fitting + + + + # Old stuff + # Do Amdahls law fitting + # cores = np.arange(1, 48, 0.1) + # values_list = [] + # par_step = 0.005 + # par_vals = np.arange(.95, 1, par_step) + + # for par_val in par_vals: + # values = amdahl(par_val, cores) + # values_list.append(values) + + # for i, values in enumerate(values_list): + # ax1.plot(cores, values, label="par_val={}".format(par_vals[i])) + + ################################# + # Adding plot make up + ax1.set_title( + "Speed up ratio vs amount of cores for different amounts of systems on {}".format( + machine + ) + ) + + ax1.set_xlabel("Amount of cores used") + ax1.set_ylabel("Speed up ratio (time_linear/time_parallel)") + + ax1.grid() + ax1.legend(loc=4) + ax1.set_xscale("log") + ax2.set_xscale("log") + + fig.savefig(os.path.join(plot_output_dir, "speedup_scaling_{}.{}".format(name_testcase, "png"))) + fig.savefig(os.path.join(plot_output_dir, "speedup_scaling_{}.{}".format(name_testcase, "pdf"))) + plt.show() + +################################# +# Files +SCALING_RESULT_DIR = "scaling_results" +FILENAMES = [ + "david-Lenovo-IdeaPad-S340-14IWL_100_systems.json" + # "astro2_2500_systems.json", + # "astro2_3000_systems.json", +] +RESULT_JSONS = [] +for filename in FILENAMES: + RESULT_JSONS.append(os.path.join(os.path.abspath(SCALING_RESULT_DIR), filename)) -######################################################################################## -# Plot run time -plot_runtime(calculated_results, unique_amt_cores, unique_amt_systems) +plot_speedup_and_efficiency(RESULT_JSONS, SCALING_RESULT_DIR, "Example", "laptop_david") \ No newline at end of file diff --git a/tests/population/scaling/plot_scaling_new.py b/tests/population/scaling/plot_scaling_new.py deleted file mode 100644 index 9125e2409b5ad52f395da48c8b20659b49b4dc0c..0000000000000000000000000000000000000000 --- a/tests/population/scaling/plot_scaling_new.py +++ /dev/null @@ -1,119 +0,0 @@ -import matplotlib -import os -import matplotlib.pyplot as plt -import pandas as pd -import numpy as np -import json -import math - - -def amdahl(f, n): - return 1.0 / ((1 - f) + (f / n)) - - -################################# -# Files -scaling_result_dir = "scaling_results" -filenames = [ - "astro2_2500_systems.json", - "astro2_3000_systems.json", -] -result_jsons = [] -for filename in filenames: - result_jsons.append(os.path.join(os.path.abspath(scaling_result_dir), filename)) - -################################# -# Plotting of the scaling results -fig, ax1 = plt.subplots() -ax2 = ax1.twinx() -for jsonfile in result_jsons: - print(jsonfile) - - with open(jsonfile, "r") as f: - result_data = json.loads(f.read()) - - # Get linear data - linear_data = result_data["linear"] - linear_mean = np.mean(linear_data) - linear_stdev = np.std(linear_data) - - cpus, speedups, efficiencies, stddev_speedups = [], [], [], [] - for amt_cpus in result_data["mp"]: - # Get mp data - mp_data = result_data["mp"][amt_cpus] - mp_mean = np.mean(mp_data) - mp_stdev = np.std(mp_data) - - # Calc - amt_cpus = int(amt_cpus) - speedup = linear_mean / mp_mean - stddev_speedup = ( - math.sqrt((linear_stdev / linear_mean) ** 2 + (mp_stdev / mp_mean) ** 2) - * speedup - ) - efficiency = speedup / int(amt_cpus) - - # Add to lists - cpus.append(amt_cpus) - efficiencies.append(efficiency) - speedups.append(speedup) - stddev_speedups.append(stddev_speedup) - - # Plot - ax1.errorbar( - cpus, - speedups, - stddev_speedups, - linestyle="None", - marker="^", - label="Speed up & efficiency of {} systems".format( - result_data["amt_systems"] - ), - ) - - ax2.plot(cpus, efficiencies, alpha=0.5) - - # x_position_shift += 0.1 - - -# Do Amdahls law fitting -# cores = np.arange(1, 48, 0.1) -# values_list = [] -# par_step = 0.005 -# par_vals = np.arange(.95, 1, par_step) - - -# for par_val in par_vals: -# values = amdahl(par_val, cores) -# values_list.append(values) - -# for i, values in enumerate(values_list): -# ax1.plot(cores, values, label="par_val={}".format(par_vals[i])) - - -################################# -# Adding plot make up -ax1.set_title( - "Speed up ratio vs amount of cores for different amounts of systems on {}".format( - "name_testcase" - ) -) - -# ax1.plot([1, max(cpus)], [1, max(cpus)], label='100% scaling') - -ax1.set_xlabel("Amount of cores used") -ax1.set_ylabel("Speed up ratio (time_linear/time_parallel)") - -# ax1.set_xlim(0, max(cpus) + 4) -# ax2.set_ylim(0, 1) - - -ax1.grid() -ax1.legend(loc=4) -ax1.set_xscale("log") -ax2.set_xscale("log") - -# fig.savefig(os.path.join(img_dir, "speedup_scaling_{}.{}".format(name_testcase, "png"))) -# fig.savefig(os.path.join(img_dir, "speedup_scaling_{}.{}".format(name_testcase, "pdf"))) -# fig.savefig(os.path.join(img_dir, "speedup_scaling_{}.{}".format(name_testcase, "eps"))) -plt.show()