2024-heraklion-comp-arch/architecture/cpu_clock_rate.py

84 lines
2.5 KiB
Python
Raw Normal View History

# CPU clock rate data from Wikipedia
# https://en.wikipedia.org/wiki/Microprocessor_chronology
# Table data extracted with: https://wikitable2csv.ggor.de/
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
plt.style.use('ggplot')
matplotlib.rcParams['font.size'] = 12
matplotlib.rcParams['font.family'] = ['Exo 2', 'sans-serif']
data = open('cpu_clock_rate.csv', 'rt')
# first, remove units and rescale everything to MHz
rescaled = []
for line in data:
date, raw = line.split(',')
try:
value, unit = raw.split()
except ValueError:
# there are lines with multiple units, for example
# 550 MHz-1.3 GHz
# take the left most one
raw = raw.split('-')[1]
value, unit = raw.split()
# if value is in the form X-Y, just use the biggest, i.e. Y
if '-' in value:
value = value.split('-')[1]
value = float(value)
# rescale value
if unit == 'kHz':
value = value/1000
elif unit == 'GHz':
value = value*1000
elif unit == 'MHz':
pass
else:
raise ValueError(f'Unit not understood! {unit}')
rescaled.append((date, value))
dtype = [('year', np.float64), ('clock', np.float64)]
rescaled = np.array(rescaled, dtype=dtype)
# sort first by year and then by value
rescaled.sort(order=['year', 'clock'])
# add some jitter on values corresponding to the same year, so that the plot
# looks more understandable
old_year = rescaled[0][0]
count = 0
for row in range(rescaled.shape[0]):
year = rescaled[row][0]
count += 1
if year != old_year:
# add jitter to the values corresponding to the previous year
prev_count = count-1
if prev_count > 1:
jitter = 1/prev_count
for i in range(1, count):
loc_year, loc_value = rescaled[row-count+i]
rescaled[row-count+i] = (loc_year+(jitter*(i-1)), loc_value)
# restart counting
count = 1
old_year = year
# plot the thing
plt.figure(figsize=(8.5,7.5))
plt.semilogy(rescaled['year'], rescaled['clock'], 'o')
# my laptop here
plt.semilogy([2020], [4900], 'o')
plt.grid(None)
plt.grid(which='both', axis='both')
plt.ylim(0.1, 10000)
plt.xlim(1968, 2025)
years = np.arange(1970, 2025, 5)
plt.xticks(years, years)
plt.yticks([0.1, 1,10,100,1000, 10000], ['1 kHz\n1 ms', '1 MHz\n1 µs', '10 MHz\n100 ns',
'100 MHz\n10 ns', '1 GHz\n1 ns', '10 GHz\n0.1 ns'])
plt.tick_params(labelright=True, top=True, right=True)
plt.title('CPU clock rate')
plt.savefig('cpu_clock_rate.svg')