added state of code as of 09/06/2020
This commit is contained in:
commit
000f329d06
|
@ -0,0 +1,158 @@
|
|||
#id clock num_cores tdp cpumark_1_cpu cpumark_2_cpu
|
||||
core-i7-8700k 3.7 6 95 0 0
|
||||
5150 2.66 2 65 1746 3498
|
||||
E5462 2.8 4 80 4038 7350
|
||||
X5550 2.67 4 95 5416 9131
|
||||
X5560 2.8 4 95 5426 9215
|
||||
X5650 2.67 6 95 7601 11728
|
||||
X5660 2.8 6 95 7954 11893
|
||||
E5-2660 2.2 8 95 11535 17282
|
||||
E5-2670 2.6 8 115 0 18509
|
||||
E5-2680 2.7 8 130 0 18480
|
||||
E5-2690 2.9 8 135 0 20699
|
||||
E5-2620v2 2.1 6 95 8664 13474
|
||||
E5-2630v2 2.6 6 80 10615 16256
|
||||
E5-2640v2 2 8 95 10132 14792
|
||||
E5-2650v2 2.6 8 95 13276 19333
|
||||
E5-2660v2 2.2 10 95 13659 18670
|
||||
E5-2670v2 2.5 10 115 14892 22062
|
||||
E5-2680v2 2.8 10 115 16340 23263
|
||||
E5-2690v2 3 10 130 17304 24189
|
||||
E5-2695v2 2.4 12 130 17231 21980
|
||||
E5-2697v2 2.7 12 130 17516 23910
|
||||
E5-2603v3 1.6 6 85 4996 8358
|
||||
E5-2609v3 1.9 6 85 5878 9885
|
||||
E5-2620v3 2.4 6 85 9955 15400
|
||||
E5-2623v3 3 6 105 9007 13914
|
||||
E5-2630v3 2.4 8 85 12803 18699
|
||||
E5-2630Lv3 1.8 8 55 11201 0
|
||||
E5-2637v3 3.5 4 135 10278 16823
|
||||
E5-2640v3 2.6 8 90 14081 20824
|
||||
E5-2643v3 3.4 6 135 13671 20574
|
||||
E5-2650v3 2.3 10 105 15106 20602
|
||||
E5-2650Lv3 1.8 12 65 13132 0
|
||||
E5-2660v3 2.6 10 105 16161 23388
|
||||
E5-2667v3 3.2 8 135 16125 22935
|
||||
E5-2670v3 2.3 12 120 16549 22330
|
||||
E5-2680v3 2.5 12 120 18840 25352
|
||||
E5-2683v3 2 14 120 17917 22704
|
||||
E5-2687Wv3 3.1 10 160 17785 24769
|
||||
E5-2690v3 2.6 12 160 19567 26665
|
||||
E5-2695v3 2.3 14 120 20742 26021
|
||||
E5-2697v3 2.6 14 145 21667 29009
|
||||
E5-2698v3 2.3 16 135 21794 30217
|
||||
E5-2699v3 2.3 18 145 22520 24820
|
||||
E5-2603v4 1.7 6 85 5247 8809
|
||||
E5-2609v4 1.7 8 85 0 10835
|
||||
E5-2620v4 2.1 8 85 11219 17063
|
||||
E5-2623v4 2.6 4 85 0 10196
|
||||
E5-2630v4 2.2 10 85 14221 18281
|
||||
E5-2630Lv4 1.8 10 55 0 0
|
||||
E5-2637v4 3.5 4 135 9665 17398
|
||||
E5-2640v4 2.4 10 90 15244 21556
|
||||
E5-2643v4 3.4 6 135 14329 22063
|
||||
E5-2650v4 2.2 12 105 16212 22619
|
||||
E5-2650Lv4 1.7 14 65 0 0
|
||||
E5-2660v4 2.0 14 105 0 0
|
||||
E5-2667v4 3.2 8 135 0 0
|
||||
E5-2680v4 2.4 14 120 20489 0
|
||||
E5-2683v4 2.1 16 120 0 0
|
||||
E5-2687Wv4 3.0 12 160 20340 27161
|
||||
E5-2690v4 2.6 14 120 22843 28262
|
||||
E5-2695v4 2.1 18 135 19351 20768
|
||||
E5-2697v4 2.3 18 135 23070 0
|
||||
E5-2697Av4 2.6 16 145 0 24075
|
||||
E5-2698v4 2.2 20 135 24615 32248
|
||||
E5-2699v4 2.2 22 145 21277 38461
|
||||
Gold-5115 2.4 10 85 0 0
|
||||
Gold-5117 2.0 14 105 0 0
|
||||
Gold-5117F 2.0 14 113 0 0
|
||||
Gold-5117M 2.0 0 0 0 21250
|
||||
Gold-5118 2.3 12 105 0 0
|
||||
Gold-5119T 1.9 14 85 0 0
|
||||
Gold-5120 2.2 14 105 0 0
|
||||
Gold-5120T 2.2 14 105 0 0
|
||||
Gold-5122 3.6 4 105 0 0
|
||||
Gold-6126 2.6 12 125 0 0
|
||||
Gold-6126F 2.6 12 135 0 0
|
||||
Gold-6128 3.4 6 115 0 0
|
||||
Gold-6130 2.1 16 125 0 0
|
||||
Gold-6130F 2.1 16 125 0 0
|
||||
Gold-6130T 2.1 16 125 0 0
|
||||
Gold-6132 2.6 14 140 0 0
|
||||
Gold-6134 3.2 8 130 0 0
|
||||
Gold-6134M 3.2 8 130 0 0
|
||||
Gold-6136 3.0 12 150 0 0
|
||||
Gold-6138 2.0 20 125 0 0
|
||||
Gold-6138F 2.0 20 135 0 0
|
||||
Gold-6138T 2.0 20 125 0 0
|
||||
Gold-6140 2.3 18 140 0 0
|
||||
Gold-6140M 2.3 18 140 0 0
|
||||
Gold-6142 2.6 16 150 0 0
|
||||
Gold-6142F 2.6 16 160 0 0
|
||||
Gold-6142M 2.6 16 150 0 0
|
||||
Gold-6144 3.5 8 150 0 0
|
||||
Gold-6145 2.0 20 145 0 0
|
||||
Gold-6146 3.2 12 165 0 0
|
||||
Gold-6148 2.4 20 150 0 0
|
||||
Gold-6150 2.7 18 165 0 26349
|
||||
Gold-6152 2.1 22 140 0 0
|
||||
Gold-6154 3.0 18 200 0 0
|
||||
Gold-6161 2.2 22 165 0 0
|
||||
|
||||
Silver-4208 2.1 8 85 0 0
|
||||
Silver-4210R 2.4 10 100 0 0
|
||||
Silver-4214R 2.4 12 100 0 0
|
||||
Silver-4214Y 2.2 12 85 0 0
|
||||
Silver-4215R 3.2 8 130 0 0
|
||||
Silver-4216 2.1 16 100 0 0
|
||||
Gold-5215 2.5 10 85 0 0
|
||||
Gold-5215L 2.5 10 85 0 0
|
||||
Gold-5217 3.0 8 115 0 0
|
||||
Gold-5218 2.3 16 125 0 0
|
||||
Gold-5218R 2.1 20 125 0 0
|
||||
Gold-5220 2.2 18 125 0 0
|
||||
Gold-5220R 2.2 24 150 0 0
|
||||
Gold-5222 3.8 4 105 0 0
|
||||
Gold-6210U 2.5 20 150 0 0
|
||||
Gold-6212U 2.4 24 165 0 0
|
||||
Gold-6226 2.7 12 125 0 0
|
||||
Gold-6226R 2.9 16 150 0 0
|
||||
Gold-6230 2.1 20 125 0 0
|
||||
Gold-6230R 2.1 26 150 0 0
|
||||
Gold-6234 3.3 8 130 0 0
|
||||
Gold-6238 2.1 22 140 0 0
|
||||
Gold-6238L 2.1 22 140 0 0
|
||||
Gold-6238R 2.2 28 165 0 0
|
||||
Gold-6240 2.6 18 150 0 0
|
||||
Gold-6240L 2.6 18 150 0 0
|
||||
Gold-6240R 2.4 24 165 0 0
|
||||
Gold-6240Y 2.6 18 150 0 0
|
||||
Gold-6242 2.8 16 150 0 0
|
||||
Gold-6242R 3.1 20 205 0 0
|
||||
Gold-6244 3.6 8 150 0 0
|
||||
Gold-6246 3.3 12 165 0 0
|
||||
Gold-6246R 3.4 16 205 0 0
|
||||
Gold-6248 2.5 20 150 0 0
|
||||
Gold-6248R 3.0 24 205 0 0
|
||||
Gold-6252 2.1 24 150 0 0
|
||||
Gold-6254 3.1 18 200 0 0
|
||||
Gold-6258R 2.7 28 205 0 0
|
||||
Platinum-8256 3.8 4 105 0 0
|
||||
Platinum-8260 2.4 24 165 0 0
|
||||
Platinum-8260L 2.4 24 165 0 0
|
||||
Platinum-8260Y 2.4 24 165 0 0
|
||||
Platinum-8253 2.2 16 125 0 0
|
||||
Platinum-8268 2.9 24 205 0 0
|
||||
Platinum-8270 2.7 26 205 0 0
|
||||
Platinum-8276 2.2 28 165 0 0
|
||||
Platinum-8280 2.7 28 205 0 0
|
||||
Platinum-8280L 2.7 28 205 0 0
|
||||
|
||||
Platinum-8153 2.0 16 125 0 0
|
||||
Platinum-8160 2.1 24 150 0 0
|
||||
Platinum-8164 2.0 26 165 0 0
|
||||
Platinum-8168 2.7 24 205 0 0
|
||||
Platinum-8170 2.1 26 165 0 0
|
||||
Platinum-8176 2.1 28 165 0 0
|
||||
|
|
@ -0,0 +1,188 @@
|
|||
#host_type_id #proc_id proc_option_price
|
||||
r620 E5-2620v2 900
|
||||
r620 E5-2630v2 1585
|
||||
r620 E5-2640v2 1735
|
||||
r620 E5-2650v2 2075
|
||||
r620 E5-2660v2 2955
|
||||
r620 E5-2670v2 3335
|
||||
r620 E5-2680v2 3745
|
||||
r620 E5-2690v2 4345
|
||||
r620 E5-2695v2 4985
|
||||
r620 E5-2697v2 5625
|
||||
r630 E5-2603v3 196
|
||||
r630 E5-2609v3 394
|
||||
r630 E5-2620v3 634
|
||||
r630 E5-2623v3 860
|
||||
r630 E5-2630v3 1136
|
||||
r630 E5-2630Lv3 1024
|
||||
r630 E5-2637v3 1646
|
||||
r630 E5-2640v3 1529
|
||||
r630 E5-2643v3 2793
|
||||
r630 E5-2650v3 1997
|
||||
r630 E5-2650Lv3 2332
|
||||
r630 E5-2660v3 2570
|
||||
r630 E5-2667v3 3834
|
||||
r630 E5-2670v3 2868
|
||||
r630 E5-2680v3 3190
|
||||
r630 E5-2683v3 3396
|
||||
r630 E5-2687Wv3 4009
|
||||
r630 E5-2690v3 3903
|
||||
r630 E5-2695v3 4590
|
||||
r630 E5-2697v3 5165
|
||||
r630 E5-2698v3 6246
|
||||
r630 E5-2699v3 8081
|
||||
c6220 E5-2620v2 0
|
||||
c6220 E5-2630v2 4760
|
||||
c6220 E5-2640v2 6250
|
||||
c6220 E5-2650v2 7000
|
||||
c6220 E5-2660v2 9000
|
||||
c6220 E5-2670v2 10760
|
||||
c6220 E5-2680v2 11960
|
||||
c6220 E5-2690v2 14360
|
||||
c6220 E5-2695v2 14440
|
||||
c6220 E5-2697v2 15720
|
||||
r630 E5-2603v4 432
|
||||
r630 E5-2609v4 648
|
||||
r630 E5-2620v4 916
|
||||
r630 E5-2623v4 964
|
||||
r630 E5-2630v4 1470
|
||||
r630 E5-2630Lv4 1346
|
||||
r630 E5-2637v4 2032
|
||||
r630 E5-2640v4 1902
|
||||
r630 E5-2650v4 2418
|
||||
r630 E5-2650Lv4 2786
|
||||
r630 E5-2660v4 3050
|
||||
r630 E5-2667v4 4446
|
||||
r630 E5-2680v4 3734
|
||||
r630 E5-2683v4 3960
|
||||
r630 E5-2687Wv4 4638
|
||||
r630 E5-2690v4 4522
|
||||
r630 E5-2695v4 5276
|
||||
r630 E5-2697v4 5914
|
||||
r630 E5-2697Av4 6400
|
||||
r630 E5-2698v4 7104
|
||||
r630 E5-2699v4 9128
|
||||
r730 E5-2603v4 432
|
||||
r730 E5-2609v4 648
|
||||
r730 E5-2620v4 916
|
||||
r730 E5-2623v4 964
|
||||
r730 E5-2630v4 1470
|
||||
r730 E5-2630Lv4 1346
|
||||
r730 E5-2637v4 2032
|
||||
r730 E5-2640v4 1902
|
||||
r730 E5-2650v4 2418
|
||||
r730 E5-2650Lv4 2786
|
||||
r730 E5-2660v4 3050
|
||||
r730 E5-2667v4 4446
|
||||
r730 E5-2680v4 3734
|
||||
r730 E5-2683v4 3960
|
||||
r730 E5-2687Wv4 4638
|
||||
r730 E5-2690v4 4522
|
||||
r730 E5-2695v4 5276
|
||||
r730 E5-2697v4 5914
|
||||
r730 E5-2697Av4 6400
|
||||
r730 E5-2698v4 7104
|
||||
r730 E5-2699v4 9128
|
||||
c6320 E5-2620v4 3144
|
||||
c6320 E5-2640v4 6466
|
||||
c6320 E5-2650v4 8221
|
||||
c6320 E5-2660v4 10730
|
||||
c6320 E5-2680v4 12695
|
||||
c6320 E5-2690v4 15375
|
||||
c4310 E5-2640v4 1902
|
||||
r640 Gold-5115 2508
|
||||
r640 Gold-5120 3192
|
||||
r640 Gold-5122 2414
|
||||
r640 Gold-6126 3838
|
||||
r640 Gold-6128 3648
|
||||
r640 Gold-6130 4124
|
||||
r640 Gold-6134 4560
|
||||
r640 Gold-6136 5320
|
||||
r640 Gold-6138 5700
|
||||
r640 Gold-6140 5112
|
||||
r640 Gold-6142 6366
|
||||
r640 Gold-6148 6556
|
||||
r640 Gold-6150 7182
|
||||
r640 Gold-6152 7734
|
||||
r640 Gold-6154 7562
|
||||
r640 Platinum-8153 6404
|
||||
r640 Platinum-8160 9026
|
||||
r640 Platinum-8164 12008
|
||||
r640 Platinum-8168 11438
|
||||
r640 Platinum-8170 14308
|
||||
r640 Platinum-8176 17100
|
||||
|
||||
r640 Silver-4208 858
|
||||
r640 Silver-4210R 978
|
||||
r640 Silver-4214Y 1650
|
||||
r640 Silver-4214R 1418
|
||||
r640 Silver-4215R 1620
|
||||
r640 Silver-4216 2016
|
||||
r640 Gold-5215 2634
|
||||
r640 Gold-5215L 7150
|
||||
r640 Gold-5217 3300
|
||||
r640 Gold-5218R 2600
|
||||
r640 Gold-5220R 3352
|
||||
r640 Gold-5222 2534
|
||||
r640 Gold-6226R 3100
|
||||
r640 Gold-6230R 4330
|
||||
r640 Gold-6234 4980
|
||||
r640 Gold-6238L 10600
|
||||
r640 Gold-6238R 5900
|
||||
r640 Gold-6240L 9960
|
||||
r640 Gold-6240R 5368
|
||||
r640 Gold-6240Y 5900
|
||||
r640 Gold-6242R 5700
|
||||
r640 Gold-6244 6780
|
||||
r640 Gold-6246R 7150
|
||||
r640 Gold-6248R 6884
|
||||
r640 Gold-6252 8120
|
||||
r640 Gold-6254 7940
|
||||
r640 Gold-6258R 8800
|
||||
r640 Platinum-8253 6724
|
||||
r640 Platinum-8260 9478
|
||||
r640 Platinum-8260L 13340
|
||||
r640 Platinum-8260Y 10600
|
||||
r640 Platinum-8268 12010
|
||||
r640 Platinum-8270 15024
|
||||
r640 Platinum-8276 17956
|
||||
|
||||
r940 Gold-5215L 14300
|
||||
r940 Gold-5218 5348
|
||||
r940 Gold-5220 6704
|
||||
r940 Gold-5222 5068
|
||||
r940 Gold-6226 7800
|
||||
r940 Gold-6230 8660
|
||||
r940 Gold-6234 9960
|
||||
r940 Gold-6238 11800
|
||||
r940 Gold-6238L 21200
|
||||
r940 Gold-6240 10736
|
||||
r940 Gold-6240L 19920
|
||||
r940 Gold-6242 11400
|
||||
r940 Gold-6244 13560
|
||||
r940 Gold-6246 14300
|
||||
r940 Gold-6248 13768
|
||||
r940 Gold-6252 16240
|
||||
r940 Gold-6254 15880
|
||||
r940 Platinum-8253 13448
|
||||
r940 Platinum-8256 27600
|
||||
r940 Platinum-8260 18956
|
||||
r940 Platinum-8260L 26680
|
||||
r940 Platinum-8268 24020
|
||||
r940 Platinum-8270 30048
|
||||
r940 Platinum-8276 35912
|
||||
r940 Platinum-8280 39900
|
||||
r940 Platinum-8280L 48300
|
||||
|
||||
precision3630 core-i7-8700k 190
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,491 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import numpy
|
||||
import pylab
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib.colors
|
||||
import itertools
|
||||
import re
|
||||
import hashlib
|
||||
from string import ascii_lowercase
|
||||
|
||||
markerTypes=[',', '+', '.', '^', 'v', '<', '>', 'o', '*', '1', '2', '3', '4', '8', 's', 'p', 'h', 'H', 'x', 'X', 'D', 'd', '|', '_']
|
||||
#for c in ascii_lowercase:
|
||||
# markerTypes.append('$%s$' % c)
|
||||
#markerColors=('r', 'g', 'b')
|
||||
markerColors=('r')
|
||||
|
||||
def get_marker(proc_id):
|
||||
hash_object = hashlib.md5(proc_id.encode('utf-8'))
|
||||
hash = int(hash_object.hexdigest(), 16)
|
||||
return markerTypes[ hash % len(markerTypes) ]
|
||||
|
||||
def plotCpuPassmark():
|
||||
cpuTable = numpy.genfromtxt('cpu_table.dat', dtype=("|U10", float, int, float, float), names=True, delimiter='\t')
|
||||
plt.subplot(1,1,0)
|
||||
plt.subplots_adjust(bottom = 0.1)
|
||||
markersCycler = itertools.cycle(itertools.product(markerTypes, markerColors))
|
||||
labels = cpuTable['id']
|
||||
x = cpuTable['clock'] * cpuTable['num_cores']
|
||||
y = cpuTable['cpumark']
|
||||
markerSize = 50
|
||||
color = 'b'
|
||||
for label, x1, y1 in zip(labels, x, y):
|
||||
if y1 <= 0.0:
|
||||
continue # no passmark available fo this data
|
||||
generation=label[-1]
|
||||
if generation == '2':
|
||||
color = 'b'
|
||||
else:
|
||||
color = 'r'
|
||||
marker = markersCycler.next()
|
||||
plt.scatter( x1, y1, color = color, s = markerSize, marker = marker[0], label = label)
|
||||
plt.xlabel(u'theoretical cpu speed [core.GHz]')
|
||||
plt.ylabel(u'passmark [?]')
|
||||
plt.title(u'comparison between cpu theoretical and effective speed')
|
||||
plt.xlim( xmin = 0.0 )
|
||||
plt.ylim( ymin = 0.0 )
|
||||
plt.legend(bbox_to_anchor=(0.2, 1.0))
|
||||
#plt.legend()
|
||||
plt.draw()
|
||||
plt.show()
|
||||
|
||||
|
||||
def get_proc_architecture(proc_id):
|
||||
if re.match('core-i[357]-8[0-9][0-9][0-9][ktbuh]', proc_id):
|
||||
return 'coffeelake'
|
||||
elif re.match('Silver-[0-9]2[0-9][0-9]', proc_id):
|
||||
return 'cascadelake'
|
||||
elif re.match('Gold-[0-9]2[0-9][0-9]', proc_id):
|
||||
return 'cascadelake'
|
||||
elif re.match('Platinum-[0-9]2[0-9][0-9]', proc_id):
|
||||
return 'cascadelake'
|
||||
elif re.match('Gold-[0-9]1[0-9][0-9]', proc_id):
|
||||
return 'skylake'
|
||||
elif re.match('Platinum-[0-9]1[0-9][0-9]', proc_id):
|
||||
return 'skylake'
|
||||
elif re.match('E5-26[0-9][0-9][LWA]*v4', proc_id):
|
||||
return 'broadwell'
|
||||
elif re.match('E5-26[0-9][0-9][LWA]*v3', proc_id):
|
||||
return 'haswell'
|
||||
elif re.match('E5-26[0-9][0-9][LWA]*v2', proc_id):
|
||||
return 'ivy bridge'
|
||||
elif re.match('E5-26[0-9][0-9][LWA]*', proc_id):
|
||||
return 'sandy bridge'
|
||||
elif re.match('X56[0-9][0-9]', proc_id):
|
||||
return 'gulftown'
|
||||
elif re.match('X55[0-9][0-9]', proc_id):
|
||||
return 'gainestown'
|
||||
elif re.match('E54[0-9][0-9]', proc_id):
|
||||
return 'harpertown'
|
||||
elif re.match('51[0-9][0-9]', proc_id):
|
||||
return 'woodcrest'
|
||||
else:
|
||||
assert False
|
||||
|
||||
def get_proc_arch_transistor_size(proc_arch):
|
||||
return {
|
||||
'woodcrest':65,
|
||||
'harpertown':45,
|
||||
'gainestown':45,
|
||||
'gulftown':32,
|
||||
'sandy bridge':32,
|
||||
'ivy bridge':22,
|
||||
'haswell':22,
|
||||
'broadwell':14,
|
||||
'skylake':14,
|
||||
'coffeelake':14,
|
||||
'cascadelake':14
|
||||
}[get_proc_architecture(proc_arch)]
|
||||
|
||||
def simd_id_to_dp_flops_per_cycle(simd_id):
|
||||
"""
|
||||
:param str simd_id: eg 'avx2'
|
||||
|
||||
"""
|
||||
# from https://stackoverflow.com/questions/15655835/flops-per-cycle-for-sandy-bridge-and-haswell-sse2-avx-avx2
|
||||
# Intel Core 2 and Nehalem:
|
||||
#
|
||||
# 4 DP FLOPs/cycle: 2-wide SSE2 addition + 2-wide SSE2 multiplication
|
||||
# 8 SP FLOPs/cycle: 4-wide SSE addition + 4-wide SSE multiplication
|
||||
#
|
||||
# Intel Sandy Bridge/Ivy Bridge:
|
||||
#
|
||||
# 8 DP FLOPs/cycle: 4-wide AVX addition + 4-wide AVX multiplication
|
||||
# 16 SP FLOPs/cycle: 8-wide AVX addition + 8-wide AVX multiplication
|
||||
#
|
||||
# Intel Haswell/Broadwell/Skylake/Kaby Lake:
|
||||
#
|
||||
# 16 DP FLOPs/cycle: two 4-wide FMA (fused multiply-add) instructions
|
||||
# 32 SP FLOPs/cycle: two 8-wide FMA (fused multiply-add) instructions
|
||||
|
||||
return {
|
||||
'sse4.1':4,
|
||||
'sse4.2':4,
|
||||
'avx':8,
|
||||
'avx2':16,
|
||||
'avx-512':16,
|
||||
}[simd_id]
|
||||
|
||||
def get_simd_id(proc_arch):
|
||||
"""
|
||||
:param str proc_arch: eg 'broadwell'
|
||||
:return str: eg 'sse4'
|
||||
"""
|
||||
return {
|
||||
'woodcrest':'sse4.1',
|
||||
'harpertown':'sse4.1',
|
||||
'gainestown':'sse4.2',
|
||||
'gulftown':'sse4.2',
|
||||
'sandy bridge':'avx',
|
||||
'ivy bridge':'avx',
|
||||
'haswell':'avx2',
|
||||
'broadwell':'avx2',
|
||||
'skylake':'avx-512',
|
||||
'cascadelake':'avx-512',
|
||||
'coffeelake':'avx2'
|
||||
}[proc_arch]
|
||||
|
||||
def num_dp_flop_per_cycle(proc_id):
|
||||
proc_arch = get_proc_architecture(proc_id)
|
||||
simd_id = get_simd_id(proc_arch)
|
||||
num_simd_per_core = 1
|
||||
if proc_arch == 'skylake' or proc_arch == 'cascadelake':
|
||||
# from https://en.wikipedia.org/wiki/List_of_Intel_Xeon_microprocessors : Xeon Platinum, Gold 61XX, and Gold 5122 have two AVX-512 FMA units per core; Xeon Gold 51XX (except 5122), Silver, and Bronze have a single AVX-512 FMA unit per core
|
||||
if re.match('Gold-5122', proc_id):
|
||||
num_simd_per_core = 2
|
||||
if re.match('Gold-61[0-9][0-9]', proc_id):
|
||||
num_simd_per_core = 2
|
||||
if re.match('Gold-62[0-9][0-9]', proc_id):
|
||||
num_simd_per_core = 2
|
||||
dp_flops_per_cycle = num_simd_per_core * simd_id_to_dp_flops_per_cycle(simd_id)
|
||||
print(proc_id, dp_flops_per_cycle)
|
||||
return dp_flops_per_cycle
|
||||
|
||||
def get_system_base_price( host_id ):
|
||||
# for r730 on 06/10/2016
|
||||
# (x: price without procs, p1 : price of e5-2603v4, p2: price of e5-2609v4)
|
||||
# we want to know x, given dell's web site, where we can get the price for multiple proc but not 0
|
||||
# x + p1 = 1014.0
|
||||
# x + 2 * p1 = 1014.0 + 216
|
||||
# => p1 approx= 215.5
|
||||
# => x = 1014. - 215. = 799.0
|
||||
# x + p2 = 1123.0
|
||||
# => p2 = 324.0
|
||||
# x + 2 * p2 = 1447.0
|
||||
# for r630 on 14/10/2016
|
||||
# (x: price without procs, p2603: price of e5-2603v4, p2609: price of e5-2609v4)
|
||||
# we want to know x, given dell's web site, where we can get the price for multiple proc but not 0
|
||||
# x + p2603 = 948.0
|
||||
# x + 2 * p2603 = 948.0 + 216
|
||||
# => p2603 approx= 215.5
|
||||
# => x = 948. - 215. = 733.0
|
||||
# verification :
|
||||
# x + p2609 = 1057.0
|
||||
# => p2609 = 1057-733=324.0
|
||||
# x + 2 * p2609 = 1381.0
|
||||
# for 4xc6320 on 14/10/2016
|
||||
# (x: price without procs, p2603: price of e5-2603v4, p2609: price of e5-2609v4)
|
||||
# x + 4 x (2 x p2620 + p32G) = 5135 € HT
|
||||
# x + 4 x (2 x p2640 + p128G + pX520 + p5years) = 15590 € HT
|
||||
# x + 4 x (2 x p2650 + p128G + pX520 + p5years) = 17340 € HT
|
||||
# x + 4 x (2 x p2660 + p128G + pX520 + p5years) = 19490 € HT
|
||||
# by examining this and the price of processors on R630
|
||||
# - E5-2620v4 : 458€
|
||||
# - E5-2640v4 : 951€
|
||||
# - E5-2650v4 : 1209€
|
||||
# - E5-2660v4 : 1525€
|
||||
# - E5-2680v4 : 1867€
|
||||
# - E5-2690v4 : 2261€
|
||||
# I could work out that :
|
||||
# - the price of procs on c6320 is the price of procs on r630 * 85%
|
||||
# - the price of the base c6320 with 32 Go and no proc at all is 2020.6
|
||||
# - the price of the 32G to 128G upgrade is 6222.6 euros (cheaper price of 16G->128G upgrade on r630 : (1778*4 = 7112))
|
||||
# details :
|
||||
# >>> (19490.-17340)/8
|
||||
# 268.75
|
||||
# >>> (17340.-15590)/8
|
||||
# 218.75
|
||||
# >>> 218.75/258.
|
||||
# 0.8478682170542635
|
||||
# >>> 268.75/316
|
||||
# 0.8504746835443038
|
||||
# >>> 15590.0+((1209.0-951.0)*0.85)*8
|
||||
# 17344.4
|
||||
# >>> 15590.0+((1525.0-951.0)*0.85)*8
|
||||
# 19493.2
|
||||
# price of 128G ram upgrade assuming that 5years guarantee costs 880€ (same as c6220),
|
||||
# >>> 15590.0+((458.0-951.0)*0.85)*8-210.0*4-880.0 - 5135.0
|
||||
# 6222.6
|
||||
# >>> 5135.0 - (458.0*0.85)*8
|
||||
# 2020.6
|
||||
# for c4130 on 14/10/2016
|
||||
# x + 2 x E5-2640v4 + 128G + 2 * K80 + X520 + p5years = 12281€
|
||||
# x + 2 x E5-2640v4 + 128G + 4 * K80 + X520 + p5years = 19317€
|
||||
# price of a K80
|
||||
# >>> (19317.-12281)/2
|
||||
# 3518.0
|
||||
# assuming the options cost the same as for R630 (X520=210€, p5years=240€, 128G=1778€, E5-2640v4=951€), the cost of the base system is :
|
||||
# >>> 12281-951-951-1778-210-240-3518-3518
|
||||
# 1115
|
||||
# but if we integrate the X520 card so that we have a 10Gb ethernet in the base, the cost of the base system becomes :
|
||||
# >>> 1115+210
|
||||
# 1325
|
||||
# on 29/09/2017
|
||||
# (x: price without procs, p3106: price of Bronze-3106, p6126: price of Gold6126)
|
||||
# we want to know x, given dell's web site, where we can get the price for multiple proc but not 0
|
||||
# x + p3106 = 1067.0
|
||||
# x + 2 * p3106 = 1067.0 + 320.0
|
||||
# => p3106 = 320
|
||||
# => x = 1067.0 - 320.0 = 747.0
|
||||
# check if x computation is consistent with p6126
|
||||
# x + p6126 = 2767
|
||||
# x + 2 * p6126 = 4787.0
|
||||
# => p6126 = 2020.0
|
||||
# => x = 747.0 --> yes !
|
||||
|
||||
# price of r940 (with 2x xeon gold 5215 and 32 Go DDR4 @ 2933GHz) on 09/06/2020 : 3784€
|
||||
# (x: price without procs, p5215: price of gold-5215, p6248: price of Gold6248)
|
||||
# p6240 = 2684
|
||||
# p6248 = 3442
|
||||
# p8280l = 12075
|
||||
# x + 2 * p5215 = 3784
|
||||
# x + 4 * p6240 = 11886 => x = 1150
|
||||
# x + 4 * p6248 = 14918 => x = 1150
|
||||
# x + 4 * p8280l = 49450 => x = 1150
|
||||
# => p5215 = 1317 (agrees with proc price on r640)
|
||||
|
||||
|
||||
return {
|
||||
'c6220':4890.0,
|
||||
'r620':860.0,
|
||||
'r630':733.0,
|
||||
'r640':747.0,
|
||||
'r730':799.0,
|
||||
'r940':1150.0,
|
||||
'c6320':2020.6,
|
||||
'c4310':1325.0,
|
||||
'precision3630':449.0
|
||||
}[host_id]
|
||||
|
||||
def plotSystemEfficiency():
|
||||
|
||||
cpuTable = numpy.genfromtxt('cpu_table.dat', dtype=("|U15", float, int, float, float, float), names=True, delimiter='\t')
|
||||
#cpuTable = numpy.genfromtxt('dell_ivybridge_table.dat', dtype=(('id', "|S10"), ('clock', float), ('num_cores', int), ('price', float, float)), names=None, delimiter='\t')
|
||||
print(type(cpuTable))
|
||||
print(cpuTable.dtype)
|
||||
print(cpuTable)
|
||||
print(cpuTable['id'])
|
||||
|
||||
dellPriceTable = numpy.genfromtxt('dell_procoptions_table.dat', dtype=("|U15", "|U15", float), names=True, delimiter='\t')
|
||||
#cpuTable = numpy.genfromtxt('dell_ivybridge_table.dat', dtype=(('id', "|S10"), ('clock', float), ('num_cores', int), ('price', float, float)), names=None, delimiter='\t')
|
||||
|
||||
#for (x, y) in clusters:
|
||||
serverBasePowerConsumption = 100.0 # rough estimation in watts
|
||||
def GHzToMHz( frequency ):
|
||||
return frequency * 1000.0
|
||||
|
||||
|
||||
|
||||
kWHPrice = 0.07 * 1.5
|
||||
containerLifetime = 7.0 # in years
|
||||
powerUsageEfficiency = 0.5
|
||||
|
||||
ramUpgradePrice128Gb = {
|
||||
'c6220':3520.0,
|
||||
'r620':2010.0,
|
||||
'r630':1778.0,
|
||||
'r640':1780.0,
|
||||
'r730':1778.0,
|
||||
'r940':960.0, # 32 Gb 2933 MHz RDIMM : 320 €
|
||||
'c6320':6222.6,
|
||||
'c4310':1778.0,
|
||||
'precision3630': 1536.0 }
|
||||
guarantee5YearsPrice = {
|
||||
'c6220':880.0,
|
||||
'r620':240.0,
|
||||
'r630':240.0,
|
||||
'r640':0.0,
|
||||
'r730':240.0,
|
||||
'r940':0.0,
|
||||
'c6320':880.0,
|
||||
'c4310':240.0,
|
||||
'precision3630': 0.0 }
|
||||
hddUpgradePrice2To = {
|
||||
'c6220':320.0,
|
||||
'r620':-20.0,
|
||||
'r630':0.0,
|
||||
'r640':70.0,
|
||||
'r730':0.0,
|
||||
'r940':70.0,
|
||||
'c6320':0.0,
|
||||
'c4310':0.0,
|
||||
'precision3630': 0.0}
|
||||
|
||||
def getColorCodeFromItemLabel(label):
|
||||
generation=label[-1]
|
||||
(model, proc_id) = re.split('_', label)
|
||||
saturation = {
|
||||
'sandy bridge':0.0,
|
||||
'ivy bridge':0.2,
|
||||
'haswell':0.2,
|
||||
'broadwell':0.2,
|
||||
'skylake':0.4,
|
||||
'coffeelake':0.6,
|
||||
'cascadelake':1.0
|
||||
}[get_proc_architecture(proc_id)]
|
||||
# if model == 'r620':
|
||||
# color = 'r'
|
||||
# elif model == 'r630':
|
||||
# color = 'g'
|
||||
# elif model == 'r730':
|
||||
# color = 'm'
|
||||
# elif model == 'c6220':
|
||||
# if generation == '2':
|
||||
# color = 'b'
|
||||
# else:
|
||||
# color = 'y'
|
||||
hue = {
|
||||
'r620': 0.6,
|
||||
'r630': 0.6,
|
||||
'r640': 0.6,
|
||||
'c4310': 0.6,
|
||||
'r730': 0.4,
|
||||
'r940': 0.8,
|
||||
'c6220': 1.0,
|
||||
'c6320': 1.0,
|
||||
'precision3630': 0.2
|
||||
}[model]
|
||||
value = 0.9
|
||||
return matplotlib.colors.hsv_to_rgb((hue, saturation, value))
|
||||
|
||||
def get_marker_from_label(label):
|
||||
(model, proc_id) = re.split('_', label)
|
||||
return get_marker(proc_id)
|
||||
|
||||
|
||||
itemPrice = numpy.array([])
|
||||
itemPowerConsumption = numpy.array([])
|
||||
itemSpeed = numpy.array([])
|
||||
itemLabel = numpy.array([])
|
||||
itemGeneration = numpy.array([])
|
||||
for hostTypeId, procId, procOptionPrice in zip(dellPriceTable['host_type_id'], dellPriceTable['proc_id'], dellPriceTable['proc_option_price']):
|
||||
#print(hostTypeId)
|
||||
#if hostTypeId == 'r630':
|
||||
# continue
|
||||
proc_arch = get_proc_architecture(procId)
|
||||
if not proc_arch in ['coffeelake', 'skylake','cascadelake']:
|
||||
continue
|
||||
|
||||
itemGeneration = procId[-1]
|
||||
|
||||
itemLabel = numpy.append( itemLabel, hostTypeId + '_' + procId )
|
||||
itemPrice = numpy.append( itemPrice, procOptionPrice + get_system_base_price(hostTypeId) + ramUpgradePrice128Gb[hostTypeId] + guarantee5YearsPrice[hostTypeId] + hddUpgradePrice2To[hostTypeId] )
|
||||
if hostTypeId == 'c6220' or hostTypeId == 'c6320' :
|
||||
numServersPerContainer = 4
|
||||
else:
|
||||
numServersPerContainer = 1
|
||||
for id, clock, numCores, tdp, cpumark in zip(cpuTable['id'], cpuTable['clock'], cpuTable['num_cores'], cpuTable['tdp'], cpuTable['cpumark_1_cpu']):
|
||||
if id == procId:
|
||||
# print('found '+procId)
|
||||
break
|
||||
assert id == procId, 'Failed to find %s in cputable' % procId
|
||||
#print(tdp)
|
||||
if hostTypeId == 'precision3630':
|
||||
numProcsPerServer = 1
|
||||
elif hostTypeId in ['r940']: # re.match('r9[0-9]0', hostTypeId):
|
||||
numProcsPerServer = 4
|
||||
else:
|
||||
numProcsPerServer = 2
|
||||
print(hostTypeId, numProcsPerServer)
|
||||
itemPowerConsumption = numpy.append( itemPowerConsumption, (tdp*numProcsPerServer+serverBasePowerConsumption)*numServersPerContainer )
|
||||
# print(hostTypeId, procId, itemPowerConsumption[-1])
|
||||
itemSpeed = numpy.append( itemSpeed, num_dp_flop_per_cycle(procId)*clock*1.e9*numCores*numProcsPerServer*numServersPerContainer)
|
||||
#itemSpeed = numpy.append( itemSpeed, GHzToMHz(clock)*numCores*numProcsPerServer*numServersPerContainer)
|
||||
#itemSpeed = numpy.append( itemSpeed, cpumark * numProcsPerServer*numServersPerContainer )
|
||||
|
||||
#pylab.plot(x, y, '+')
|
||||
#pylab.xlabel('speed/price ratio [core.MHz/euros]')
|
||||
#pylab.ylabel('speed/power consumption ratio [core.MHz/W]')
|
||||
#pylab.show() # or savefig(<filename>)
|
||||
|
||||
|
||||
#print("items = ")
|
||||
#print(itemLabel)
|
||||
|
||||
markerSize = 50
|
||||
|
||||
if False:
|
||||
plt.subplot(1,2,1)
|
||||
plt.subplots_adjust(bottom = 0.1)
|
||||
markersCycler = itertools.cycle(itertools.product(markerTypes, markerColors))
|
||||
x = itemSpeed / itemPrice
|
||||
y = itemSpeed / itemPowerConsumption
|
||||
for label, x1, y1, power, speed, price, in zip(itemLabel, x, y, itemPowerConsumption, itemSpeed, itemPrice):
|
||||
marker = markersCycler.next()
|
||||
color = getColorCodeFromItemLabel(label)
|
||||
plt.scatter( x1, y1, color = color, s = markerSize, marker = marker[0], label = label)
|
||||
#print(x1, y1, color, markerSize, marker[0], label)
|
||||
if False:
|
||||
plt.scatter( x, y, marker = 'o')
|
||||
for label, x1, y1, power, speed, price, in zip(itemLabel, x, y, itemPowerConsumption, itemSpeed, itemPrice):
|
||||
#print(label)
|
||||
plt.annotate( u'%s (%.1f core.GHz, %.0f W, %.0f €)' % (label,speed/1000.0, power, price),
|
||||
xy = (x1, y1), xytext = (-50, 50),
|
||||
textcoords = 'offset points', ha = 'right', va = 'bottom',
|
||||
bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
|
||||
arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
|
||||
plt.xlabel(u'speed/price ratio [core.MHz/€]')
|
||||
plt.ylabel(u'speed/power consumption ratio [core.MHz/W]')
|
||||
plt.xlim( xmin = 0.0 )
|
||||
plt.ylim( ymin = 0.0 )
|
||||
|
||||
plt.subplot(1,2,1)
|
||||
#fig = plt.figure()
|
||||
#ax = fig.gca()
|
||||
#ax.set_xticks(numpy.arange(0,1,0.1))
|
||||
#ax.set_yticks(numpy.arange(0,1.,0.1))
|
||||
|
||||
powerUsedInLifetime = (itemPowerConsumption * containerLifetime * 365 * 24) / powerUsageEfficiency
|
||||
itemTotalCost = itemPrice + (powerUsedInLifetime / 1000.0 * kWHPrice )
|
||||
markersCycler = itertools.cycle(itertools.product(markerTypes, markerColors))
|
||||
item_flops = itemSpeed
|
||||
# print item_flops
|
||||
item_total_num_ops = item_flops * containerLifetime * 365 * 24 * 3600
|
||||
# print(itemPrice)
|
||||
x = itemPrice
|
||||
y = item_total_num_ops / itemTotalCost
|
||||
for i in range(len(itemLabel)):
|
||||
print(itemLabel[i], itemPrice[i], y[i])
|
||||
print('itemTotalCost', itemTotalCost[i])
|
||||
print('flops', item_flops[i])
|
||||
# print y
|
||||
for label, x1, y1, power, speed, price, in zip(itemLabel, x, y, itemPowerConsumption, itemSpeed, itemPrice):
|
||||
if y1 > 0.0001:
|
||||
color = getColorCodeFromItemLabel(label)
|
||||
# marker = markersCycler.next()
|
||||
marker = get_marker_from_label( label )
|
||||
#print(x1, y1)
|
||||
plt.scatter( x1, y1, facecolors = color, s = markerSize, marker = marker[0], label = label)
|
||||
if y1 > 5.7e16:
|
||||
plt.annotate( u'%s' % label,
|
||||
xy = (x1, y1), xytext = (x1*4.0, (y1-5.5e16)*7.1),
|
||||
textcoords = 'data', ha = 'right', va = 'bottom',
|
||||
bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
|
||||
arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
|
||||
|
||||
plt.xlabel(u'purchase price [€]')
|
||||
plt.ylabel(u'num total DP operations/total cost [€/^-1]')
|
||||
plt.title(u'total cost including electricity')
|
||||
plt.xlim( xmin = 0.0 )
|
||||
plt.ylim( ymin = 0.0 )
|
||||
plt.minorticks_on()
|
||||
plt.grid(b=True, which='major', color='b', linestyle='-', linewidth=0.5)
|
||||
plt.grid(b=True, which='minor', color='b', linestyle='-', linewidth=0.2)
|
||||
plt.legend(bbox_to_anchor=(1.1, 1.1), ncol=3)
|
||||
plt.draw()
|
||||
|
||||
|
||||
plt.show()
|
||||
|
||||
#plotCpuPassmark():
|
||||
plotSystemEfficiency()
|
Loading…
Reference in New Issue