From 000f329d06b6d385d0f9b951619db576fc0cad3f Mon Sep 17 00:00:00 2001 From: Guillaume Raffy Date: Tue, 15 Sep 2020 18:46:53 +0200 Subject: [PATCH] added state of code as of 09/06/2020 --- cpu_table.dat | 158 ++++++++++++ dell_procoptions_table.dat | 188 ++++++++++++++ procs_chooser.py | 491 +++++++++++++++++++++++++++++++++++++ readme.md | 3 + 4 files changed, 840 insertions(+) create mode 100644 cpu_table.dat create mode 100644 dell_procoptions_table.dat create mode 100644 procs_chooser.py create mode 100644 readme.md diff --git a/cpu_table.dat b/cpu_table.dat new file mode 100644 index 0000000..845f8a8 --- /dev/null +++ b/cpu_table.dat @@ -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 + diff --git a/dell_procoptions_table.dat b/dell_procoptions_table.dat new file mode 100644 index 0000000..c473543 --- /dev/null +++ b/dell_procoptions_table.dat @@ -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 + + + + + + + + + + + diff --git a/procs_chooser.py b/procs_chooser.py new file mode 100644 index 0000000..4b5b73c --- /dev/null +++ b/procs_chooser.py @@ -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() + + + #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() diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..75f7d29 --- /dev/null +++ b/readme.md @@ -0,0 +1,3 @@ +# ConCho : Configuration Choser + +a tool to help choosing the best quality price ratio for a compute node \ No newline at end of file