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