{"id":2486,"date":"2024-06-08T07:45:54","date_gmt":"2024-06-08T07:45:54","guid":{"rendered":"https:\/\/mvermeulen.org\/perf\/?p=2486"},"modified":"2024-06-08T07:48:01","modified_gmt":"2024-06-08T07:48:01","slug":"clustering","status":"publish","type":"post","link":"https:\/\/mvermeulen.org\/perf\/2024\/06\/08\/clustering\/","title":{"rendered":"clustering"},"content":{"rendered":"\n<p>Following are affinity clusters of similar benchmarks based on on_cpu (# of cores used) and topdown metrics (retirement, fronted stall, backend stall, speculation)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cluster 0 (16 entries): 500.perlbench_r 508.namd_r 511.povray_r 525.x264_r 544.nab_r brl-cad c-ray john-the-ripper namd openssl povray qe quicksilver specfem3d svt-hevc vvenc\nCluster 1 (23 entries): 503.bwaves_r 507.cactuBSSN_r 510.parest_r 519.lbm_r 520.omnetpp_r 521.wrf_r 549.fotonik3d_r 554.roms_r ai-benchmark cloverleaf easywave kripke libxsmm minibud\ne mt-dgemm ncnn oidn onednn openvino stream tensorflow xmrig y-cruncher\nCluster 2 (4 entries): 541.leela_r compress-7zip m-queens n-queens\nCluster 3 (5 entries): aobench compress-lz4 gnupg lammps lzbench\nCluster 4 (7 entries): 538.imagick_r 548.exchange2_r avifenc helsing hmmer rays1bench uvg266\nCluster 5 (6 entries): build-eigen build-python compress-gzip hadoop inkscape tscp\nCluster 6 (8 entries): 505.mcf_r 531.deepsjeng_r appleseed asmfish blender primesieve stockfish v-ray\nCluster 7 (14 entries): build2 build-erlang build-ffmpeg build-gcc build-gdb build-gem5 build-godot build-imagemagick build-linux-kernel build-llvm build-mesa build-mplayer build-php\n build-wasmer\nCluster 8 (10 entries): apache cassandra compilebench ctx-clock dbench fast-cli ipc-benchmark memcached sqlite wireguard\nCluster 9 (8 entries): cp2k graphics-magick qmcpack rodinia smallpt stargate vpxenc x264\nCluster 10 (6 entries): blosc clickhouse core-latency daphne gimp mbw\nCluster 11 (6 entries): arrayfire dragonflydb nginx pgbench pjsip rbenchmark\nCluster 12 (5 entries): espeak phpbench pybench securemark smhasher\nCluster 13 (7 entries): apache-iotdb encode-wavpack fftw gcrypt java-scimark2 polybench-c synthmark\nCluster 14 (12 entries): 523.xalancbmk_r 526.blender_r 527.cam4_r 557.xz_r embree graph500 lczero openvkl ospray-studio quadray sysbench tensorflow-lite\nCluster 15 (10 entries): amg askap heffte hpcg incompact3d onnx openfoam parboil pytorch ramspeed\nCluster 16 (9 entries): compress-zstd cpp-perf-bench draco indigobench jpegxl jpegxl-decode polyhedron scimark2 z3\nCluster 17 (12 entries): clomp darktable deepsparse deepspeech ffte himeno llama.cpp llamafile lulesh ngspice npb palabos\nCluster 18 (6 entries): 502.gcc_r build-nodejs ebizzy faiss minife mnn\nCluster 19 (5 entries): botan cachebench glibc-bench gnuradio nettle\nCluster 20 (8 entries): blake2 build-apache build-clash octave-benchmark openjpeg selenium tungsten vkpeak\nCluster 21 (5 entries): mpcbench node-octane openscad pyperformance rav1e\nCluster 22 (7 entries): bork byte libreoffice numpy perl-benchmark rsvg sudokut\nCluster 23 (9 entries): compress-rar dacapobench duckdb ffmpeg gegl node-web-tooling pyhpc renaissance spark-tpcds\nCluster 24 (11 entries): aircrack-ng astcenc basis coremark cpuminer-opt java-jmh kvazaar mrbayes quantlib toybrot webp2\nCluster 25 (6 entries): dav1d opencv ospray schbench svt-av1 svt-vp9\nCluster 26 (9 entries): cryptopp dolfyn encode-flac gmpbench mutex nwchem rnnoise simdjson spark\nCluster 27 (6 entries): cockroach hackbench rocksdb scylladb speedb stress-ng\nCluster 28 (13 entries): aom-av1 financebench gpaw gromacs liquid-dsp neat openradioss pennant rawtherapee srsran tnn whisper.cpp x265\nCluster 29 (11 entries): bullet compress-pbzip2 crafty cython-bench encode-mp3 encode-opus etcpak fhourstones git libraw webp\n<\/code><\/pre>\n\n\n\n<p>Experimented some and settled on the following approach for clustering.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Attributes of interest<\/h2>\n\n\n\n<p>First question was &#8220;clustering based on what&#8221;.  Following is a more complete set of metrics that range anywhere from the amount of I\/O to floating density to counter-based instrumentation.  These also have rather different ranges though can be normalized using the mean and standard deviation. I experimented first using a set of 10 metrics (on_cpu, retire, frontend, backend, speculation, IPC, GHz, float-density, branch-density, smt-contention) before settling on just the first five.<\/p>\n\n\n\n<p>Some of these metrics are correlated and why I figured it wouldn&#8217;t add value to use both AMD and Intel. Some such as I\/O metrics are very orthogonal and likely make sense in broader context but I don&#8217;t have enough study to clearly characterize.<\/p>\n\n\n\n<table id=\"tablepress-8\" class=\"tablepress tablepress-id-8\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">metric<\/th><th class=\"column-2\">count<\/th><th class=\"column-3\">min<\/th><th class=\"column-4\">max<\/th><th class=\"column-5\">median<\/th><th class=\"column-6\">mean<\/th><th class=\"column-7\">stddev<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">elapsed<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">3.53<\/td><td class=\"column-4\">8.76e+03<\/td><td class=\"column-5\">532<\/td><td class=\"column-6\">1.15e+03<\/td><td class=\"column-7\">1.53e+03<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">on_cpu<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">15.9<\/td><td class=\"column-5\">6.34<\/td><td class=\"column-6\">6.68<\/td><td class=\"column-7\">5.42<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">inblock<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">4.46e+05<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">3.65e+03<\/td><td class=\"column-7\">3.92e+04<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">onblock<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.46<\/td><td class=\"column-4\">8.97e+05<\/td><td class=\"column-5\">131<\/td><td class=\"column-6\">1.57e+04<\/td><td class=\"column-7\">7.91e+04<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">page-fault<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">2.6<\/td><td class=\"column-4\">1.31e+05<\/td><td class=\"column-5\">2.1e+03<\/td><td class=\"column-6\">1.17e+04<\/td><td class=\"column-7\">2.1e+04<\/td>\n<\/tr>\n<tr class=\"row-7\">\n\t<td class=\"column-1\">context-switch<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">2.88<\/td><td class=\"column-4\">4.77e+04<\/td><td class=\"column-5\">66<\/td><td class=\"column-6\">2.49e+03<\/td><td class=\"column-7\">7.58e+03<\/td>\n<\/tr>\n<tr class=\"row-8\">\n\t<td class=\"column-1\">IPC<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.01<\/td><td class=\"column-4\">4.59<\/td><td class=\"column-5\">1.51<\/td><td class=\"column-6\">1.64<\/td><td class=\"column-7\">0.888<\/td>\n<\/tr>\n<tr class=\"row-9\">\n\t<td class=\"column-1\">GHz<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">5.23<\/td><td class=\"column-5\">1.87<\/td><td class=\"column-6\">1.82<\/td><td class=\"column-7\">1.4<\/td>\n<\/tr>\n<tr class=\"row-10\">\n\t<td class=\"column-1\">retire-rate<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.7<\/td><td class=\"column-4\">76.2<\/td><td class=\"column-5\">29.2<\/td><td class=\"column-6\">32.1<\/td><td class=\"column-7\">16<\/td>\n<\/tr>\n<tr class=\"row-11\">\n\t<td class=\"column-1\">frontend-stall<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.1<\/td><td class=\"column-4\">72.8<\/td><td class=\"column-5\">16.3<\/td><td class=\"column-6\">21.7<\/td><td class=\"column-7\">18<\/td>\n<\/tr>\n<tr class=\"row-12\">\n\t<td class=\"column-1\">backend-stall<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">4.1<\/td><td class=\"column-4\">97.4<\/td><td class=\"column-5\">38.2<\/td><td class=\"column-6\">42.9<\/td><td class=\"column-7\">21.9<\/td>\n<\/tr>\n<tr class=\"row-13\">\n\t<td class=\"column-1\">spec-stall<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">21.3<\/td><td class=\"column-5\">2<\/td><td class=\"column-6\">3.28<\/td><td class=\"column-7\">3.78<\/td>\n<\/tr>\n<tr class=\"row-14\">\n\t<td class=\"column-1\">retire-ucode<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">1.2<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">0.0769<\/td><td class=\"column-7\">0.141<\/td>\n<\/tr>\n<tr class=\"row-15\">\n\t<td class=\"column-1\">retire-fastpath<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.7<\/td><td class=\"column-4\">76.2<\/td><td class=\"column-5\">25.5<\/td><td class=\"column-6\">27.7<\/td><td class=\"column-7\">14.5<\/td>\n<\/tr>\n<tr class=\"row-16\">\n\t<td class=\"column-1\">float-density<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.016<\/td><td class=\"column-4\">676<\/td><td class=\"column-5\">62.9<\/td><td class=\"column-6\">129<\/td><td class=\"column-7\">151<\/td>\n<\/tr>\n<tr class=\"row-17\">\n\t<td class=\"column-1\">frontend-latency<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.1<\/td><td class=\"column-4\">57.8<\/td><td class=\"column-5\">8.4<\/td><td class=\"column-6\">13.4<\/td><td class=\"column-7\">13.6<\/td>\n<\/tr>\n<tr class=\"row-18\">\n\t<td class=\"column-1\">frontend-bandwidth<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">31.7<\/td><td class=\"column-5\">4.8<\/td><td class=\"column-6\">5.83<\/td><td class=\"column-7\">4.8<\/td>\n<\/tr>\n<tr class=\"row-19\">\n\t<td class=\"column-1\">opcache-miss<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">65.9<\/td><td class=\"column-5\">6.1<\/td><td class=\"column-6\">13.4<\/td><td class=\"column-7\">15.1<\/td>\n<\/tr>\n<tr class=\"row-20\">\n\t<td class=\"column-1\">icache-miss<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.1<\/td><td class=\"column-4\">69<\/td><td class=\"column-5\">13.4<\/td><td class=\"column-6\">16.8<\/td><td class=\"column-7\">11.5<\/td>\n<\/tr>\n<tr class=\"row-21\">\n\t<td class=\"column-1\">backend-cpu<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.7<\/td><td class=\"column-4\">64<\/td><td class=\"column-5\">9.4<\/td><td class=\"column-6\">12.8<\/td><td class=\"column-7\">11.4<\/td>\n<\/tr>\n<tr class=\"row-22\">\n\t<td class=\"column-1\">backend-memory<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.2<\/td><td class=\"column-4\">95.9<\/td><td class=\"column-5\">19.9<\/td><td class=\"column-6\">24.6<\/td><td class=\"column-7\">18.1<\/td>\n<\/tr>\n<tr class=\"row-23\">\n\t<td class=\"column-1\">amd-l2-miss<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.05<\/td><td class=\"column-4\">67.5<\/td><td class=\"column-5\">17.1<\/td><td class=\"column-6\">18.3<\/td><td class=\"column-7\">13<\/td>\n<\/tr>\n<tr class=\"row-24\">\n\t<td class=\"column-1\">amd-l2-density<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.022<\/td><td class=\"column-4\">4.29e+04<\/td><td class=\"column-5\">35.1<\/td><td class=\"column-6\">229<\/td><td class=\"column-7\">2.72e+03<\/td>\n<\/tr>\n<tr class=\"row-25\">\n\t<td class=\"column-1\">spec-branch<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">21.2<\/td><td class=\"column-5\">1.7<\/td><td class=\"column-6\">2.82<\/td><td class=\"column-7\">3.6<\/td>\n<\/tr>\n<tr class=\"row-26\">\n\t<td class=\"column-1\">spec-pipeline<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">2<\/td><td class=\"column-5\">0<\/td><td class=\"column-6\">0.113<\/td><td class=\"column-7\">0.249<\/td>\n<\/tr>\n<tr class=\"row-27\">\n\t<td class=\"column-1\">branch-miss<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">14.8<\/td><td class=\"column-5\">1.85<\/td><td class=\"column-6\">2.72<\/td><td class=\"column-7\">2.99<\/td>\n<\/tr>\n<tr class=\"row-28\">\n\t<td class=\"column-1\">branch-density<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">4.9<\/td><td class=\"column-4\">317<\/td><td class=\"column-5\">128<\/td><td class=\"column-6\">130<\/td><td class=\"column-7\">61.8<\/td>\n<\/tr>\n<tr class=\"row-29\">\n\t<td class=\"column-1\">branch-cond<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">4.5<\/td><td class=\"column-4\">311<\/td><td class=\"column-5\">92.3<\/td><td class=\"column-6\">98.3<\/td><td class=\"column-7\">48.8<\/td>\n<\/tr>\n<tr class=\"row-30\">\n\t<td class=\"column-1\">branch-ind<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0.003<\/td><td class=\"column-4\">28.7<\/td><td class=\"column-5\">2.85<\/td><td class=\"column-6\">4.44<\/td><td class=\"column-7\">5.12<\/td>\n<\/tr>\n<tr class=\"row-31\">\n\t<td class=\"column-1\">smt-contention<\/td><td class=\"column-2\">247<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">48.4<\/td><td class=\"column-5\">9.6<\/td><td class=\"column-6\">12.7<\/td><td class=\"column-7\">13.3<\/td>\n<\/tr>\n<tr class=\"row-32\">\n\t<td class=\"column-1\">elapsed<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">16<\/td><td class=\"column-4\">1.69e+04<\/td><td class=\"column-5\">655<\/td><td class=\"column-6\">1.66e+03<\/td><td class=\"column-7\">2.5e+03<\/td>\n<\/tr>\n<tr class=\"row-33\">\n\t<td class=\"column-1\">on_cpu<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">15.8<\/td><td class=\"column-5\">6.77<\/td><td class=\"column-6\">7<\/td><td class=\"column-7\">5.54<\/td>\n<\/tr>\n<tr class=\"row-34\">\n\t<td class=\"column-1\">inblock<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.01<\/td><td class=\"column-4\">3.86e+05<\/td><td class=\"column-5\">65.8<\/td><td class=\"column-6\">6.31e+03<\/td><td class=\"column-7\">3.54e+04<\/td>\n<\/tr>\n<tr class=\"row-35\">\n\t<td class=\"column-1\">onblock<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.37<\/td><td class=\"column-4\">6.35e+05<\/td><td class=\"column-5\">19.9<\/td><td class=\"column-6\">1.1e+04<\/td><td class=\"column-7\">5.18e+04<\/td>\n<\/tr>\n<tr class=\"row-36\">\n\t<td class=\"column-1\">page-fault<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">4.07<\/td><td class=\"column-4\">1.21e+05<\/td><td class=\"column-5\">1.68e+03<\/td><td class=\"column-6\">1.06e+04<\/td><td class=\"column-7\">2.02e+04<\/td>\n<\/tr>\n<tr class=\"row-37\">\n\t<td class=\"column-1\">context-switch<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">2.23<\/td><td class=\"column-4\">6.44e+04<\/td><td class=\"column-5\">62.4<\/td><td class=\"column-6\">2.49e+03<\/td><td class=\"column-7\">8.92e+03<\/td>\n<\/tr>\n<tr class=\"row-38\">\n\t<td class=\"column-1\">IPC<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.01<\/td><td class=\"column-4\">5.53<\/td><td class=\"column-5\">1.89<\/td><td class=\"column-6\">2.02<\/td><td class=\"column-7\">1.01<\/td>\n<\/tr>\n<tr class=\"row-39\">\n\t<td class=\"column-1\">GHz<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">3.04<\/td><td class=\"column-5\">1.32<\/td><td class=\"column-6\">1.2<\/td><td class=\"column-7\">0.88<\/td>\n<\/tr>\n<tr class=\"row-40\">\n\t<td class=\"column-1\">retire-rate<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">3.7<\/td><td class=\"column-4\">87.3<\/td><td class=\"column-5\">43.2<\/td><td class=\"column-6\">43.4<\/td><td class=\"column-7\">15.4<\/td>\n<\/tr>\n<tr class=\"row-41\">\n\t<td class=\"column-1\">frontend-stall<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.5<\/td><td class=\"column-4\">52<\/td><td class=\"column-5\">15.9<\/td><td class=\"column-6\">17.8<\/td><td class=\"column-7\">11<\/td>\n<\/tr>\n<tr class=\"row-42\">\n\t<td class=\"column-1\">backend-stall<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">1.3<\/td><td class=\"column-4\">95.3<\/td><td class=\"column-5\">26.2<\/td><td class=\"column-6\">30.9<\/td><td class=\"column-7\">20.2<\/td>\n<\/tr>\n<tr class=\"row-43\">\n\t<td class=\"column-1\">spec-stall<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">46.7<\/td><td class=\"column-5\">6.1<\/td><td class=\"column-6\">8.38<\/td><td class=\"column-7\">8.3<\/td>\n<\/tr>\n<tr class=\"row-44\">\n\t<td class=\"column-1\">retire-ucode<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">16.7<\/td><td class=\"column-5\">2.9<\/td><td class=\"column-6\">3.26<\/td><td class=\"column-7\">2.26<\/td>\n<\/tr>\n<tr class=\"row-45\">\n\t<td class=\"column-1\">retire-fastpath<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">2.4<\/td><td class=\"column-4\">83.2<\/td><td class=\"column-5\">39.6<\/td><td class=\"column-6\">40.2<\/td><td class=\"column-7\">14.9<\/td>\n<\/tr>\n<tr class=\"row-46\">\n\t<td class=\"column-1\">frontend-latency<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.3<\/td><td class=\"column-4\">39.2<\/td><td class=\"column-5\">8.6<\/td><td class=\"column-6\">9.57<\/td><td class=\"column-7\">6.73<\/td>\n<\/tr>\n<tr class=\"row-47\">\n\t<td class=\"column-1\">frontend-bandwidth<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.1<\/td><td class=\"column-4\">25.8<\/td><td class=\"column-5\">7.3<\/td><td class=\"column-6\">8.2<\/td><td class=\"column-7\">5.84<\/td>\n<\/tr>\n<tr class=\"row-48\">\n\t<td class=\"column-1\">backend-cpu<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.6<\/td><td class=\"column-4\">76.1<\/td><td class=\"column-5\">11.5<\/td><td class=\"column-6\">15.5<\/td><td class=\"column-7\">12.4<\/td>\n<\/tr>\n<tr class=\"row-49\">\n\t<td class=\"column-1\">backend-memory<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.3<\/td><td class=\"column-4\">89.9<\/td><td class=\"column-5\">10.7<\/td><td class=\"column-6\">15.4<\/td><td class=\"column-7\">16.1<\/td>\n<\/tr>\n<tr class=\"row-50\">\n\t<td class=\"column-1\">l1-stall<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">29.6<\/td><td class=\"column-5\">4.1<\/td><td class=\"column-6\">5.53<\/td><td class=\"column-7\">5.66<\/td>\n<\/tr>\n<tr class=\"row-51\">\n\t<td class=\"column-1\">l2-stall<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">58.8<\/td><td class=\"column-5\">7.1<\/td><td class=\"column-6\">7.84<\/td><td class=\"column-7\">8.18<\/td>\n<\/tr>\n<tr class=\"row-52\">\n\t<td class=\"column-1\">l3-stall<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">35<\/td><td class=\"column-5\">2.3<\/td><td class=\"column-6\">3.98<\/td><td class=\"column-7\">5.42<\/td>\n<\/tr>\n<tr class=\"row-53\">\n\t<td class=\"column-1\">dram-stall<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">86.9<\/td><td class=\"column-5\">3.3<\/td><td class=\"column-6\">7.46<\/td><td class=\"column-7\">11.7<\/td>\n<\/tr>\n<tr class=\"row-54\">\n\t<td class=\"column-1\">store-stall<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">28.3<\/td><td class=\"column-5\">0.8<\/td><td class=\"column-6\">1.7<\/td><td class=\"column-7\">3.11<\/td>\n<\/tr>\n<tr class=\"row-55\">\n\t<td class=\"column-1\">intel-l2-miss<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.35<\/td><td class=\"column-4\">92.7<\/td><td class=\"column-5\">29.1<\/td><td class=\"column-6\">30.1<\/td><td class=\"column-7\">18.2<\/td>\n<\/tr>\n<tr class=\"row-56\">\n\t<td class=\"column-1\">intel-l2-density<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.019<\/td><td class=\"column-4\">2.12e+04<\/td><td class=\"column-5\">21.9<\/td><td class=\"column-6\">126<\/td><td class=\"column-7\">1.37e+03<\/td>\n<\/tr>\n<tr class=\"row-57\">\n\t<td class=\"column-1\">spec-branch<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">46.7<\/td><td class=\"column-5\">5.7<\/td><td class=\"column-6\">7.95<\/td><td class=\"column-7\">8.3<\/td>\n<\/tr>\n<tr class=\"row-58\">\n\t<td class=\"column-1\">spec-pipeline<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">6.2<\/td><td class=\"column-5\">0.3<\/td><td class=\"column-6\">0.427<\/td><td class=\"column-7\">0.652<\/td>\n<\/tr>\n<tr class=\"row-59\">\n\t<td class=\"column-1\">branch-miss<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\">20.4<\/td><td class=\"column-5\">0.83<\/td><td class=\"column-6\">1.57<\/td><td class=\"column-7\">2.32<\/td>\n<\/tr>\n<tr class=\"row-60\">\n\t<td class=\"column-1\">branch-density<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">6.24<\/td><td class=\"column-4\">320<\/td><td class=\"column-5\">129<\/td><td class=\"column-6\">129<\/td><td class=\"column-7\">61<\/td>\n<\/tr>\n<tr class=\"row-61\">\n\t<td class=\"column-1\">branch-cond<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">6.24<\/td><td class=\"column-4\">320<\/td><td class=\"column-5\">129<\/td><td class=\"column-6\">129<\/td><td class=\"column-7\">61<\/td>\n<\/tr>\n<tr class=\"row-62\">\n\t<td class=\"column-1\">branch-ind<\/td><td class=\"column-2\">238<\/td><td class=\"column-3\">0.027<\/td><td class=\"column-4\">83<\/td><td class=\"column-5\">20.8<\/td><td class=\"column-6\">22.1<\/td><td class=\"column-7\">17.4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-8 from cache -->\n\n\n<h2 class=\"wp-block-heading\">Clustering algorithm<\/h2>\n\n\n\n<p>After a web search, I ended up with a variation of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lloyd%27s_algorithm\">Lloyd&#8217;s Algorithm<\/a>. This seems relatively straightforward and settles fairly quickly on a set of clusters. As a summary, this goes through the following steps:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Start with a set of randomly chosen cluster points. I picked every Nth benchmark as my starting point<\/li>\n\n\n\n<li>Now assign each benchmark to the closest cluster point. I used a simple Nth dimensional distance as sqrt(distance1 ^2 + distance2 ^2 + distance3 ^2 &#8230; distanceN^2).<\/li>\n\n\n\n<li>Now recompute the cluster points based on a center of the points assigned to the cluster<\/li>\n\n\n\n<li>Iterate the last two steps until it converges on a set of clusters.<\/li>\n<\/ul>\n\n\n\n<p>This takes ~8 iterations when I tried it on ~240 phoronix tests along with 23 SPEC CPU 2017 benchmarks.<\/p>\n\n\n\n<p>Now with these clusters, I can both use them to spread out a benchmark analysis across a wide range of different benchmarks and also to think of more similar benchmarks that might substitute for each other. For example cluster #7 from the list above collects a set of build benchmarks while cluster #1 looks like a set of backend bound benchmarks running on all cores.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Following are affinity clusters of similar benchmarks based on on_cpu (# of cores used) and topdown metrics (retirement, fronted stall, backend stall, speculation) Experimented some and settled on the following approach for clustering. Attributes of interest First question was &#8220;clustering <span class=\"excerpt-dots\">&hellip;<\/span> <a class=\"more-link\" href=\"https:\/\/mvermeulen.org\/perf\/2024\/06\/08\/clustering\/\"><span class=\"more-msg\">Continue reading &rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[23,34],"class_list":["post-2486","post","type-post","status-publish","format-standard","hentry","category-experiment","tag-benchmarks","tag-cluster"],"_links":{"self":[{"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/posts\/2486","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/comments?post=2486"}],"version-history":[{"count":2,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/posts\/2486\/revisions"}],"predecessor-version":[{"id":2489,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/posts\/2486\/revisions\/2489"}],"wp:attachment":[{"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/media?parent=2486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/categories?post=2486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mvermeulen.org\/perf\/wp-json\/wp\/v2\/tags?post=2486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}