In [3]:
%matplotlib inline

from itertools import *
from collections import defaultdict
import numpy as np

def groupby(seq, key):
    groups = defaultdict(list)
    for item in seq:
        groups[key(item)].append(item)
    return groups.iteritems()

def read_means(fname, header_cols):
    with file(fname) as f:
        for l in f:
            values = map(int, l.split(','))
            yield values[:header_cols] + [np.mean(values[header_cols:], dtype=np.float64)]

def get_dk_blocks(dk_length):
    return dk_length / 20 + (1 if dk_length % 20 != 0 else 0)

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

def fig_init(size=10):
    fig = plt.figure()
    fig.set_size_inches(size, size)
    return fig

def plot_3d(fig, data, label, xlabel, ylabel, zlabel, bot, top, azim, elev=10):
    ax = fig.gca(projection='3d')
    ax.plot_trisurf(*zip(*data), cmap=cm.coolwarm, edgecolor='none', label=label)
    
    ax.set_xlabel(xlabel)
    ax.set_ylabel(ylabel)
    ax.set_zlabel(zlabel)
    
    ax.azim = azim
    ax.elev = elev
    ax.set_zlim(bot, top)

def plot_2d(fig, data, label, xlabel, ylabel, bot, top):
    ax = fig.gca()
    ax.plot(*zip(*sorted(data, key=lambda (x, y): x)), marker='o', markersize=4, markeredgewidth=1, label=label)
    
    ax.set_xlabel(xlabel)
    ax.set_ylabel(ylabel)
    
    ax.set_ylim(bot, top)

def plot_bs_dl_to_ips(fig, data, label=None, azim=-120, elev=15):
    plot_3d(fig, data, label, 'Batch size', 'DK length', 'PBKDF2 iteration-blocks per second', 0, 500000000, azim, elev)

def plot_dl_it_to_ips(fig, data, label=None, azim=190, elev=10):
    plot_3d(fig, data, label, 'DK length', 'Iterations', 'PBKDF2 iteration-blocks per second', 0, 500000000, azim, elev)
    
def plot_dl_it_to_bestbs(fig, data, label=None, azim=110, elev=10):
    plot_3d(fig, data, label, 'DK length', 'Iterations', 'Best batch size', 0, 70000, azim, elev)

def plot_it_to_ips(fig, data, label=None):
    plot_2d(fig, data, label, 'Iterations', 'PBKDF2 iteration-blocks per second', 0, 500000000)

def plot_sl_to_ips(fig, data, label=None):
    plot_2d(fig, data, label, 'Salt length', 'PBKDF2 iteration-blocks per second', 0, 500000000)

In [4]:
def read_dl_iter_bs(fname):
    return [(dl, iter, bs, get_dk_blocks(dl) * val) for (dl, iter, bs, val) in read_means(fname, 3)]

def get_bs_dl_to_max_from_dl_iter_bs(data):
    return [(bs, dl, max(val for (_, _, _, val) in rows)) for (bs, dl), rows in groupby(data, lambda (dl, it, bs, val): (bs, dl))]

def get_dl_it_to_max_from_dl_iter_bs(data):
    return [(dl, it, max(val for (_, _, _, val) in rows))
            for (dl, it), rows in groupby(data, lambda (dl, it, bs, val): (dl, it))]
    
def get_dl_it_to_bestbs_from_dl_iter_bs(data):
    return [(dl, it, max(rows, key=lambda (dl, it, bs, val): val)[2])
            for (dl, it), rows in groupby(data, lambda (dl, it, bs, val): (dl, it))]

In [5]:
def read_dl_bs(fname):
    return [(dl, bs, get_dk_blocks(dl) * val) for (dl, bs, val) in read_means(fname, 2)]

def read_2d(fname):
    return list(read_means(fname, 1))

def read_dl(fname):
    return [(dl, get_dk_blocks(dl) * val) for (dl, val) in list(read_means(fname, 1))]

def get_bs_dl_to_ips_from_dl_bs(data):
    return [(bs, dl, val) for (dl, bs, val) in data]

In [6]:
data_doom = read_dl_iter_bs('data-v1/benchmark-dl-iter-bs-gpu-doom.csv')
data_konos = read_dl_iter_bs('data-v1/benchmark-dl-iter-bs-gpu-konos.csv')
data_gram = read_dl_iter_bs('data-v1/benchmark-dl-iter-bs-gpu-gram.csv')

In [7]:
#fig = fig_init()
#plot_dl_it_to_ips(get_dl_it_to_max_from_dl_iter_bs(data_doom))
#fig.show()

#fig = fig_init()
#plot_dl_it_to_ips(get_dl_it_to_max_from_dl_iter_bs(data_konos))
#fig.show()

#fig = fig_init()
#plot_dl_it_to_ips(get_dl_it_to_max_from_dl_iter_bs(data_gram))
#fig.show()

In [8]:
fig = fig_init()
plot_bs_dl_to_ips(fig, get_bs_dl_to_max_from_dl_iter_bs(data_doom))
fig.show()

fig = fig_init()
plot_bs_dl_to_ips(fig, get_bs_dl_to_max_from_dl_iter_bs(data_konos))
fig.show()

fig = fig_init()
plot_bs_dl_to_ips(fig, get_bs_dl_to_max_from_dl_iter_bs(data_gram))
fig.show()


/usr/lib/python2.7/dist-packages/matplotlib/figure.py:387: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
  "matplotlib is currently using a non-GUI backend, "

In [9]:
data_doom = read_dl_bs('data-v2/benchmark-dl-bs-gpu-doom.csv')
data_konos = read_dl_bs('data-v2/benchmark-dl-bs-gpu-konos.csv')
data_gram = read_dl_bs('data-v2/benchmark-dl-bs-gpu-gram.csv')

fig = fig_init()
plot_bs_dl_to_ips(fig, get_bs_dl_to_ips_from_dl_bs(data_doom))
fig.show()

fig = fig_init()
plot_bs_dl_to_ips(fig, get_bs_dl_to_ips_from_dl_bs(data_konos))
fig.show()

fig = fig_init()
plot_bs_dl_to_ips(fig, get_bs_dl_to_ips_from_dl_bs(data_gram))
fig.show()



In [10]:
data_doom = read_2d('data-v2/benchmark-iterations-gpu-doom.csv')
data_konos = read_2d('data-v2/benchmark-iterations-gpu-konos.csv')
data_gram = read_2d('data-v2/benchmark-iterations-gpu-gram.csv')
fig = fig_init()
plot_it_to_ips(fig, data_doom, 'doom')
plot_it_to_ips(fig, data_konos, 'konos')
plot_it_to_ips(fig, data_gram, 'gram')
plt.legend(loc='lower right')
fig.show()



In [11]:
data_doom = read_2d('data-v2/benchmark-salt-len-gpu-doom.csv')
data_konos = read_2d('data-v2/benchmark-salt-len-gpu-konos.csv')
data_gram = read_2d('data-v2/benchmark-salt-len-gpu-gram.csv')
fig = fig_init()
plot_sl_to_ips(fig, data_doom, 'doom')
plot_sl_to_ips(fig, data_konos, 'konos')
plot_sl_to_ips(fig, data_gram, 'gram')
plt.legend(loc='lower right')
fig.show()



In [12]:
data = read_2d('data-v2/benchmark-iterations-cpu-manegrot.csv')

fig = fig_init()
plot_2d(fig, data, 'manegrot', 'Iterations', 'PBKDF2 iteration-blocks per second', 0, 2000000)
fig.show()



In [13]:
data = read_2d('data-v2/benchmark-batch-size-cpu-manegrot.csv')

fig = fig_init()
plot_2d(fig, [(x, y) for (x, y) in data if 0 <= x <= 1024], 'manegrot', 'Batch size', 'PBKDF2 iteration-blocks per second', 0, 2000000)
fig.show()

fig = fig_init()
plot_2d(fig, data, 'manegrot', 'Batch size', 'PBKDF2 iteration-blocks per second', 0, 2000000)
fig.show()



In [14]:
data = read_2d('data-v2/benchmark-salt-len-cpu-manegrot.csv')

fig = fig_init()
plot_2d(fig, [(x, y) for (x, y) in data if 0 <= x <= 4096], 'manegrot', 'Salt length', 'PBKDF2 iteration-blocks per second', 0, 2000000)
fig.show()

fig = fig_init()
plot_2d(fig, data, 'manegrot', 'Salt length', 'PBKDF2 iteration-blocks per second', 0, 2000000)
fig.show()



In [15]:
data = read_dl('data-v2/benchmark-dk-length-cpu-manegrot.csv')

fig = fig_init()
plot_2d(fig, data, 'manegrot', 'DK length', 'PBKDF2 iteration-blocks per second', 0, 2000000)
fig.show()



In [15]: