Blame test/draw_plots.py

Packit Service 724aca
#
Packit Service 724aca
#  Copyright (C) 2016 - 2018 Intel Corporation.
Packit Service 724aca
#  All rights reserved.
Packit Service 724aca
#
Packit Service 724aca
#  Redistribution and use in source and binary forms, with or without
Packit Service 724aca
#  modification, are permitted provided that the following conditions are met:
Packit Service 724aca
#  1. Redistributions of source code must retain the above copyright notice(s),
Packit Service 724aca
#     this list of conditions and the following disclaimer.
Packit Service 724aca
#  2. Redistributions in binary form must reproduce the above copyright notice(s),
Packit Service 724aca
#     this list of conditions and the following disclaimer in the documentation
Packit Service 724aca
#     and/or other materials provided with the distribution.
Packit Service 724aca
#
Packit Service 724aca
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
Packit Service 724aca
#  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Packit Service 724aca
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
Packit Service 724aca
#  EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit Service 724aca
#  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 724aca
#  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
Packit Service 724aca
#  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Packit Service 724aca
#  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
Packit Service 724aca
#  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
Packit Service 724aca
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 724aca
#
Packit Service 724aca
Packit Service 724aca
from mpl_toolkits.mplot3d import Axes3D
Packit Service 724aca
import matplotlib.pyplot as plt
Packit Service 724aca
import numpy as np
Packit Service 724aca
import numpy.ma as ma
Packit Service 724aca
import os
Packit Service 724aca
from shutil import rmtree
Packit Service 724aca
Packit Service 724aca
files = ('alloctest_hbw.txt', 'alloctest_glibc.txt', 'alloctest_tbb.txt', 'alloctest_pmem.txt')
Packit Service 724aca
legend = ('avg hbw', 'avg glibc', 'avg tbb', 'avg pmem', 'first operation')
Packit Service 724aca
colors = ('red', 'green', 'blue', 'black')
Packit Service 724aca
first_operation_color = 'yellow'
Packit Service 724aca
Packit Service 724aca
threads_values = ('1', '2', '4', '8', '16', '18', '36')
Packit Service 724aca
Packit Service 724aca
small_sizes_values = ('1', '4', '16')
Packit Service 724aca
medium_sizes_values = ('64', '256')
Packit Service 724aca
big_sizes_values = ('1024', '4096', '16384')
Packit Service 724aca
sizes_values = (small_sizes_values, medium_sizes_values, big_sizes_values)
Packit Service 724aca
sizes_display = ('small', 'medium', 'big')
Packit Service 724aca
Packit Service 724aca
operations = ('Allocation', 'Free', 'Total')
Packit Service 724aca
Packit Service 724aca
iterations = 1000
Packit Service 724aca
output_directory = './plots/'
Packit Service 724aca
Packit Service 724aca
threads_index      = np.arange(len(threads_values))
Packit Service 724aca
small_sizes_index  = np.arange(len(small_sizes_values))
Packit Service 724aca
medium_sizes_index = np.arange(len(medium_sizes_values))
Packit Service 724aca
big_sizes_index    = np.arange(len(big_sizes_values))
Packit Service 724aca
sizes_index = (small_sizes_index, medium_sizes_index, big_sizes_index)
Packit Service 724aca
Packit Service 724aca
# 3D and 2D plots needs different width, so that bars do not cover each other in 3D
Packit Service 724aca
bar_width_2D = 0.2
Packit Service 724aca
bar_width_3D = 0.1
Packit Service 724aca
Packit Service 724aca
# return times (total, allocation, free, first allocation, first free) as columns 2 - 6
Packit Service 724aca
def return_times(entry):
Packit Service 724aca
    return entry[:,2], entry[:,3], entry[:,4], entry[:,5], entry[:,6]
Packit Service 724aca
Packit Service 724aca
# initialize axis with labels, ticks and values
Packit Service 724aca
def init_axis(fig, suptitle, subplot_projection, x_label, x_ticks, x_values, y_label, y_ticks, y_values, z_label):
Packit Service 724aca
    assert fig is not None
Packit Service 724aca
    fig.clf()
Packit Service 724aca
    fig.suptitle(suptitle)
Packit Service 724aca
    if subplot_projection:
Packit Service 724aca
        ax = fig.add_subplot(111, projection=subplot_projection)
Packit Service 724aca
    else:
Packit Service 724aca
        ax = fig.add_subplot(111)
Packit Service 724aca
    assert ax is not None
Packit Service 724aca
    if x_label:
Packit Service 724aca
        ax.set_xlabel(x_label)
Packit Service 724aca
        if x_ticks is not None and x_values is not None:
Packit Service 724aca
            ax.set_xticks(x_ticks)
Packit Service 724aca
            ax.set_xticklabels(x_values)
Packit Service 724aca
    if y_label:
Packit Service 724aca
        ax.set_ylabel(y_label)
Packit Service 724aca
        if y_ticks is not None and y_values is not None:
Packit Service 724aca
            ax.set_yticks(y_ticks)
Packit Service 724aca
            ax.set_yticklabels(y_values)
Packit Service 724aca
    if z_label:
Packit Service 724aca
        ax.set_zlabel(z_label)
Packit Service 724aca
    return ax
Packit Service 724aca
Packit Service 724aca
def draw_bar(ax, show_first_operation, x, y, time, init_time, draw_color):
Packit Service 724aca
    assert ax is not None
Packit Service 724aca
    if y is None:
Packit Service 724aca
        if show_first_operation is True:
Packit Service 724aca
            mask_time = ma.where(time>=init_time)
Packit Service 724aca
            mask_init_time = ma.where(init_time>=time)
Packit Service 724aca
            ax.bar(x[mask_time], time[mask_time], width=bar_width, color=draw_color)
Packit Service 724aca
            ax.bar(x, init_time, width=bar_width, color=first_operation_color)
Packit Service 724aca
            ax.bar(x[mask_init_time], time[mask_init_time], width=bar_width, color=draw_color)
Packit Service 724aca
        else:
Packit Service 724aca
            ax.bar(x, time, width=bar_width, color=draw_color)
Packit Service 724aca
    else:
Packit Service 724aca
        if show_first_operation is True:
Packit Service 724aca
            mask_time = ma.where(time>=init_time)
Packit Service 724aca
            mask_init_time = ma.where(init_time>=time)
Packit Service 724aca
            ax.bar(x[mask_time], (time - init_time)[mask_time], y[mask_time], bottom=init_time[mask_time], zdir='y', width=bar_width, color=draw_color)
Packit Service 724aca
            ax.bar(x[mask_init_time], (init_time - time)[mask_init_time], y[mask_init_time], bottom=time[mask_init_time], zdir='y', width=bar_width, color=first_operation_color)
Packit Service 724aca
            ax.bar(x[mask_init_time], time[mask_init_time], y[mask_init_time], zdir='y', width=bar_width, color=draw_color)
Packit Service 724aca
            ax.bar(x[mask_time], init_time[mask_time], y[mask_time], zdir='y', width=bar_width, color=first_operation_color)
Packit Service 724aca
        else:
Packit Service 724aca
            ax.bar(x, time, y, zdir='y', width=bar_width, color=draw_color)
Packit Service 724aca
Packit Service 724aca
def save_plot(show_first_operation, subfolder, filename):
Packit Service 724aca
    if show_first_operation:
Packit Service 724aca
        path = os.path.join(output_directory, "with_first_operation")
Packit Service 724aca
    else:
Packit Service 724aca
        path = os.path.join(output_directory, "without_first_operation")
Packit Service 724aca
    if subfolder:
Packit Service 724aca
        path = os.path.join(path, subfolder)
Packit Service 724aca
    if not os.path.exists(path):
Packit Service 724aca
        os.mkdir(path)
Packit Service 724aca
    plt.savefig(os.path.join(path, filename))
Packit Service 724aca
    print "Saved file %s" % filename
Packit Service 724aca
Packit Service 724aca
def load_data_from_files():
Packit Service 724aca
    data = []
Packit Service 724aca
    # load all files into data
Packit Service 724aca
    for f in files:
Packit Service 724aca
        assert os.path.isfile(f) is True
Packit Service 724aca
        data.append(np.loadtxt(f, comments='#'))
Packit Service 724aca
    return data
Packit Service 724aca
Packit Service 724aca
def set_bar_width_and_offsets(requested_width):
Packit Service 724aca
    bar_width = requested_width
Packit Service 724aca
    offsets = (0, bar_width, 2*bar_width, 3*bar_width)
Packit Service 724aca
    return bar_width, offsets
Packit Service 724aca
Packit Service 724aca
if os.path.exists(output_directory):
Packit Service 724aca
    rmtree(output_directory)
Packit Service 724aca
os.mkdir(output_directory)
Packit Service 724aca
Packit Service 724aca
data = load_data_from_files()
Packit Service 724aca
Packit Service 724aca
fig = plt.figure()
Packit Service 724aca
Packit Service 724aca
########################################
Packit Service 724aca
# Draw 3D plots (time, sizes, threads) #
Packit Service 724aca
########################################
Packit Service 724aca
Packit Service 724aca
bar_width, offsets = set_bar_width_and_offsets(bar_width_3D)
Packit Service 724aca
Packit Service 724aca
# for each size range (small, medium, big)
Packit Service 724aca
for size_values, size_index, size_display in zip(sizes_values, sizes_index, sizes_display):
Packit Service 724aca
    # show plots with and without first operation
Packit Service 724aca
    for show_first_operation in (True, False):
Packit Service 724aca
        # for each operation (allocation, free, total)
Packit Service 724aca
        for operation in operations:
Packit Service 724aca
            # add bar_width to each element of size_index
Packit Service 724aca
            ax = init_axis(fig, "%s time of %s sizes (%s iterations)" % (operation, size_display, iterations), '3d',
Packit Service 724aca
                           'size [kB]', size_index + (bar_width,) * len(size_index), size_values,
Packit Service 724aca
                           'threads', threads_index, threads_values,
Packit Service 724aca
                           'time [ms]')
Packit Service 724aca
            legend_data = []
Packit Service 724aca
            # for each allocator (hbw, glibc, tbb, pmem)
Packit Service 724aca
            for entry, offset, draw_color in zip(data, offsets, colors):
Packit Service 724aca
                # remove all rows where column 1 (size) is not in size_values (current size range)
Packit Service 724aca
                entry = entry[np.in1d(entry[:,1], np.array(size_values).astype(np.int))]
Packit Service 724aca
                # convert column 0 (threads values) to thread index
Packit Service 724aca
                threads_col = np.array([threads_values.index(str(n)) for n in map(int, entry[:,0])])
Packit Service 724aca
                # convert column 1 (sizes values) to size index
Packit Service 724aca
                size_col = [size_values.index(str(n)) for n in map(int, entry[:,1])]
Packit Service 724aca
                # add offset to size index so that bars display near each other
Packit Service 724aca
                size_col = np.array(size_col) + offset
Packit Service 724aca
                total_time_col, alloc_time_col, free_time_col, first_alloc_time_col, first_free_time_col = return_times(entry)
Packit Service 724aca
                if operation == 'Allocation':
Packit Service 724aca
                    draw_bar(ax, show_first_operation, size_col, threads_col, alloc_time_col, first_alloc_time_col, draw_color)
Packit Service 724aca
                elif operation == 'Free':
Packit Service 724aca
                    draw_bar(ax, show_first_operation, size_col, threads_col, free_time_col, first_free_time_col, draw_color)
Packit Service 724aca
                elif operation == 'Total':
Packit Service 724aca
                    draw_bar(ax, show_first_operation, size_col, threads_col, total_time_col, first_alloc_time_col+first_free_time_col, draw_color)
Packit Service 724aca
                legend_data.append(plt.Rectangle((0, 0), 1, 1, fc=draw_color))
Packit Service 724aca
            if show_first_operation is True:
Packit Service 724aca
                legend_data.append(plt.Rectangle((0, 0), 1, 1, fc=first_operation_color))
Packit Service 724aca
            ax.legend(legend_data,legend,loc='best')
Packit Service 724aca
            plt.grid()
Packit Service 724aca
            save_plot(show_first_operation, None, "%s_time_of_%s_sizes_%s_iterations.png" % (operation, size_display, iterations))
Packit Service 724aca
Packit Service 724aca
################################################
Packit Service 724aca
# Draw 2D plots (time, sizes, constant thread) #
Packit Service 724aca
################################################
Packit Service 724aca
Packit Service 724aca
bar_width, offsets = set_bar_width_and_offsets(bar_width_2D)
Packit Service 724aca
Packit Service 724aca
# for each size range (small, medium, big)
Packit Service 724aca
for size_values, size_index, size_display in zip(sizes_values, sizes_index, sizes_display):
Packit Service 724aca
    # show plots with and without first operation
Packit Service 724aca
    for show_first_operation in (True, False):
Packit Service 724aca
        for thread in threads_values:
Packit Service 724aca
            # for each operation (allocation, free, total)
Packit Service 724aca
            for operation in operations:
Packit Service 724aca
                # add bar_width to each element of size_index
Packit Service 724aca
                ax = init_axis(fig, "%s time of %s sizes with %s threads (%s operations)" % (operation, size_display, thread, iterations), None,
Packit Service 724aca
                               'size [kB]', size_index + (bar_width,) * len(size_index), size_values,
Packit Service 724aca
                               'time [ms]', None, None,
Packit Service 724aca
                               None)
Packit Service 724aca
                legend_data = []
Packit Service 724aca
                # for each allocator (hbw, glibc, tbb, pmem)
Packit Service 724aca
                for entry, offset, draw_color in zip(data, offsets, colors):
Packit Service 724aca
                    # remove all rows where column 1 (size) is not in size_values (current size range)
Packit Service 724aca
                    entry = entry[np.in1d(entry[:,1], np.array(size_values).astype(np.int))]
Packit Service 724aca
                    # remove all rows where column 0 (threads) is not equal to currently analyzed thread value
Packit Service 724aca
                    entry = entry[entry[:,0] == int(thread)]
Packit Service 724aca
                    # convert column 0 (threads values) to thread index
Packit Service 724aca
                    threads_col = np.array([threads_values.index(str(n)) for n in map(int, entry[:,0])])
Packit Service 724aca
                    # convert column 1 (size values) to size index
Packit Service 724aca
                    size_col = [size_values.index(str(n)) for n in map(int, entry[:,1])]
Packit Service 724aca
                    # add offset to size index so that bars display near each other
Packit Service 724aca
                    size_col = np.array(size_col) + offset
Packit Service 724aca
                    total_time_col, alloc_time_col, free_time_col, first_alloc_time_col, first_free_time_col = return_times(entry)
Packit Service 724aca
                    if operation == 'Allocation':
Packit Service 724aca
                        draw_bar(ax, show_first_operation, size_col, None, alloc_time_col, first_alloc_time_col, draw_color)
Packit Service 724aca
                    elif operation == 'Free':
Packit Service 724aca
                        draw_bar(ax, show_first_operation, size_col, None, free_time_col, first_free_time_col, draw_color)
Packit Service 724aca
                    elif operation == 'Total':
Packit Service 724aca
                        draw_bar(ax, show_first_operation, size_col, None, total_time_col, first_alloc_time_col+first_free_time_col, draw_color)
Packit Service 724aca
                    legend_data.append(plt.Rectangle((0, 0), 1, 1, fc=draw_color))
Packit Service 724aca
                if show_first_operation is True:
Packit Service 724aca
                    legend_data.append(plt.Rectangle((0, 0), 1, 1, fc=first_operation_color))
Packit Service 724aca
                ax.legend(legend_data,legend,loc='best')
Packit Service 724aca
                plt.grid()
Packit Service 724aca
                save_plot(show_first_operation, "constant_thread", "%s_time_of_%s_sizes_with_%s_threads_%s_iterations.png" % (operation, size_display, thread, iterations))
Packit Service 724aca
Packit Service 724aca
################################################
Packit Service 724aca
# Draw 2D plots (time, threads, constant size) #
Packit Service 724aca
################################################
Packit Service 724aca
Packit Service 724aca
# for each size range (small, medium, big)
Packit Service 724aca
for size_values, size_index, size_display in zip(sizes_values, sizes_index, sizes_display):
Packit Service 724aca
    # show plots with and without first operation
Packit Service 724aca
    for show_first_operation in (True, False):
Packit Service 724aca
        for size in size_values:
Packit Service 724aca
            # for each operation (allocation, free, total)
Packit Service 724aca
            for operation in operations:
Packit Service 724aca
                # add bar_width to each element of threads_index
Packit Service 724aca
                ax = init_axis(fig, "%s time of %s kB (%s operations)" % (operation, size, iterations), None,
Packit Service 724aca
                               'threads', threads_index + (bar_width,) * len(threads_index), threads_values,
Packit Service 724aca
                               'time [ms]', None, None,
Packit Service 724aca
                               None)
Packit Service 724aca
                legend_data = []
Packit Service 724aca
                # for each allocator (hbw, glibc, tbb, pmem)
Packit Service 724aca
                for entry, offset, draw_color in zip(data, offsets, colors):
Packit Service 724aca
                    # remove all rows where column 1 (size) is not in size_values (current size range)
Packit Service 724aca
                    entry = entry[np.in1d(entry[:,1], np.array(size_values).astype(np.int))]
Packit Service 724aca
                    # remove all rows where column 1 (size) is not equal to currently analyzed size value
Packit Service 724aca
                    entry = entry[entry[:,1] == int(size)]
Packit Service 724aca
                    # convert column 0 (threads values) to thread index
Packit Service 724aca
                    threads_col = np.array([threads_values.index(str(n)) for n in map(int, entry[:,0])])
Packit Service 724aca
                    # add offset to thread index so that bars display near each other
Packit Service 724aca
                    threads_col = np.array(threads_col) + offset
Packit Service 724aca
                    # convert column 1 (size values) to size index
Packit Service 724aca
                    size_col = [size_values.index(str(n)) for n in map(int, entry[:,1])]
Packit Service 724aca
                    total_time_col, alloc_time_col, free_time_col, first_alloc_time_col, first_free_time_col = return_times(entry)
Packit Service 724aca
                    if operation == 'Allocation':
Packit Service 724aca
                        draw_bar(ax, show_first_operation, threads_col, None, alloc_time_col, first_alloc_time_col, draw_color)
Packit Service 724aca
                    elif operation == 'Free':
Packit Service 724aca
                        draw_bar(ax, show_first_operation, threads_col, None, free_time_col, first_free_time_col, draw_color)
Packit Service 724aca
                    elif operation == 'Total':
Packit Service 724aca
                        draw_bar(ax, show_first_operation, threads_col, None, total_time_col, first_alloc_time_col+first_free_time_col, draw_color)
Packit Service 724aca
                    legend_data.append(plt.Rectangle((0, 0), 1, 1, fc=draw_color))
Packit Service 724aca
                if show_first_operation is True:
Packit Service 724aca
                    legend_data.append(plt.Rectangle((0, 0), 1, 1, fc=first_operation_color))
Packit Service 724aca
                ax.legend(legend_data,legend,loc='best')
Packit Service 724aca
                plt.grid()
Packit Service 724aca
                save_plot(show_first_operation, "constant_size", "%s_time_of_%s_kB_%s_operations.png" % (operation, size, iterations))