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()
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]: