From 1de1fe014f05cdfb4fd029f5bd6d547a0ffbbdc7 Mon Sep 17 00:00:00 2001 From: Oseltamivir <58582368+Oseltamivir@users.noreply.github.com> Date: Mon, 26 Oct 2026 20:03:29 +0800 Subject: [PATCH 1/4] data(ubenchx): preserve Ascend scalar memory-profile matrices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 保留 Ascend Cube 与 Vector 标量访存矩阵、实际核心 ID、计时单位和来源哈希。 --- .../ubenchx/data/ascend-core-profiles.json | 2791 +++++++++++++++++ 1 file changed, 2791 insertions(+) create mode 100644 packages/app/src/components/ubenchx/data/ascend-core-profiles.json diff --git a/packages/app/src/components/ubenchx/data/ascend-core-profiles.json b/packages/app/src/components/ubenchx/data/ascend-core-profiles.json new file mode 100644 index 000000000..5eb637c8a --- /dev/null +++ b/packages/app/src/components/ubenchx/data/ascend-core-profiles.json @@ -0,0 +1,2791 @@ +{ + "panels": [ + { + "condition": "scalar_128MiB_cube_isolated", + "metric": "distance", + "coreids": [ + 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 66, 67, 68 + ], + "matrix": [ + [ + 0.0, 19.027974446614582, 15.300923665364582, 15.283406575520834, 19.580586751302082, + 15.349894205729166, 19.832946777343754, 16.487752278645836, 19.247151692708336, + 21.951802571614582, 19.190226236979168, 22.055155436197914, 21.287740071614586, + 21.827087402343754, 96.70648193359374, 96.00101725260416, 96.62278238932292, + 95.90114339192706, 96.65403238932292, 95.71311442057292, 95.3453369140625, + 94.90818277994792, 95.24820963541667, 94.66768391927083, 95.51359049479166, + 94.79604085286459, 94.73256429036458, 94.60552978515625 + ], + [ + 19.027974446614582, 0.0, 18.081013997395832, 15.829691569010416, 25.63102213541667, + 20.154398600260414, 16.420247395833332, 25.60260009765625, 15.530619303385418, + 23.85546875, 19.429707845052082, 18.3709716796875, 24.900065104166668, 20.837972005208332, + 95.14326985677083, 94.60972086588542, 94.913330078125, 94.37414550781249, + 94.80505371093751, 93.9951171875, 93.57114664713542, 93.33890787760417, 93.42869059244794, + 93.01369222005209, 93.54298909505206, 93.2154541015625, 93.31042480468751, + 92.8597412109375 + ], + [ + 15.300923665364582, 18.081013997395832, 0.0, 14.924173990885416, 16.8680419921875, + 16.530782063802082, 18.774169921875004, 17.871073404947914, 17.38360595703125, + 16.655151367187504, 16.687154134114586, 20.571858723958332, 21.251302083333332, + 19.516642252604164, 94.51045735677084, 93.80674235026041, 94.39298502604167, + 93.70560709635416, 94.48262532552083, 93.52315266927083, 93.09222412109375, + 92.7025146484375, 93.00575764973958, 92.42506917317708, 93.29840087890625, + 92.59476725260417, 92.56180826822916, 92.37972005208334 + ], + [ + 15.283406575520834, 15.829691569010416, 14.924173990885416, 0.0, 22.111226399739582, + 17.248087565104164, 15.53704833984375, 19.26847330729167, 16.892578125, + 21.400004069010418, 15.62353515625, 18.396708170572918, 22.923807779947918, + 21.096659342447918, 94.66469319661456, 94.0772705078125, 94.52947998046876, + 93.91265869140625, 94.50266520182292, 93.61175537109375, 93.20499674479166, + 92.84047444661459, 93.11625162760419, 92.64737955729169, 93.30391438802084, + 92.72226969401041, 92.74383544921876, 92.49546305338541 + ], + [ + 19.580586751302082, 25.63102213541667, 16.8680419921875, 22.111226399739582, 0.0, + 18.177469889322918, 26.117187499999996, 19.59051513671875, 23.158955891927082, + 18.67919921875, 22.012959798177086, 27.0980224609375, 19.468831380208332, + 22.501261393229164, 94.95231119791669, 94.22353108723956, 94.969970703125, + 94.13228352864583, 95.07657877604167, 94.046142578125, 93.66465250651042, + 93.22330729166666, 93.60666910807291, 92.97113037109375, 93.93011474609376, + 93.03181966145834, 92.9677734375, 92.953857421875 + ], + [ + 15.349894205729166, 20.154398600260414, 16.530782063802082, 17.248087565104164, + 18.177469889322918, 0.0, 16.958231608072918, 14.060343424479168, 14.851725260416664, + 17.33258056640625, 15.220133463541666, 18.770772298177086, 17.589090983072918, + 16.93341064453125, 95.14385986328125, 94.65169270833333, 95.11566162109375, + 94.45147705078125, 95.11460367838542, 94.22068277994791, 93.800048828125, + 93.45969645182292, 93.72395833333333, 93.18644205729167, 93.86267089843749, + 93.35361735026041, 93.35866292317708, 93.09238688151041 + ], + [ + 19.832946777343754, 16.420247395833332, 18.774169921875004, 15.53704833984375, + 26.117187499999996, 16.958231608072918, 0.0, 22.08367919921875, 12.689229329427084, + 22.894490559895832, 15.810485839843748, 14.5633544921875, 23.456868489583332, + 16.675455729166664, 94.26383463541666, 93.7852579752604, 94.04219563802084, + 93.57832845052083, 94.00919596354166, 93.19437662760416, 92.78586832682292, + 92.51798502604167, 92.66522216796875, 92.26422119140625, 92.81658935546874, + 92.47908528645831, 92.52750651041666, 92.05598958333334 + ], + [ + 16.487752278645836, 25.60260009765625, 17.871073404947914, 19.26847330729167, + 19.59051513671875, 14.060343424479168, 22.08367919921875, 0.0, 20.855590820312504, + 17.681172688802082, 17.703409830729168, 22.595682779947914, 19.69866943359375, + 20.511576334635414, 93.99208577473958, 93.44665527343749, 93.90232340494791, + 93.21258544921876, 93.91566975911458, 92.99843343098958, 92.64717610677084, + 92.31154378255209, 92.50899251302083, 92.01127115885416, 92.7205810546875, + 92.18707275390625, 92.18605550130209, 91.96901448567708 + ], + [ + 19.247151692708336, 15.530619303385418, 17.38360595703125, 16.892578125, + 23.158955891927082, 14.851725260416664, 12.689229329427084, 20.855590820312504, 0.0, + 19.97344970703125, 12.770100911458336, 15.278299967447918, 19.797098795572918, + 15.304951985677082, 94.02504475911459, 93.53096516927083, 93.92303466796875, + 93.26051839192709, 93.86370849609375, 93.06439208984375, 92.63810221354167, + 92.31760660807292, 92.50337727864581, 92.03824869791666, 92.7315673828125, + 92.26125081380209, 92.32484944661458, 91.95220947265624 + ], + [ + 21.951802571614582, 23.85546875, 16.655151367187504, 21.400004069010418, 18.67919921875, + 17.33258056640625, 22.894490559895832, 17.681172688802082, 19.97344970703125, 0.0, + 17.610697428385418, 22.286336263020832, 16.576334635416668, 16.896077473958332, + 94.15523274739583, 93.49163818359375, 94.21525065104166, 93.38309733072917, + 94.26529947916666, 93.28853352864583, 92.88397216796875, 92.4493408203125, + 92.81467692057291, 92.25311279296875, 93.03769938151042, 92.31131998697917, + 92.3729248046875, 92.22090657552083 + ], + [ + 19.190226236979168, 19.429707845052082, 16.687154134114586, 15.62353515625, + 22.012959798177086, 15.220133463541666, 15.810485839843748, 17.703409830729168, + 12.770100911458336, 17.610697428385418, 0.0, 15.839864095052084, 18.836079915364586, + 15.701070149739584, 93.63852945963541, 93.05700683593751, 93.58396402994792, + 92.88511149088542, 93.61789957682291, 92.69004313151041, 92.30623372395833, + 91.87738037109375, 92.15592447916667, 91.7264404296875, 92.42594401041667, + 91.78452555338541, 91.84478759765625, 91.59218343098959 + ], + [ + 22.055155436197914, 18.3709716796875, 20.571858723958332, 18.396708170572918, + 27.0980224609375, 18.770772298177086, 14.5633544921875, 22.595682779947914, + 15.278299967447918, 22.286336263020832, 15.839864095052084, 0.0, 22.102091471354168, + 14.932739257812498, 92.98677571614583, 92.46470133463541, 92.86531575520834, + 92.28165690104166, 92.86446126302084, 92.01094563802084, 91.70794677734375, + 91.37320963541667, 91.53082275390624, 91.11631266276042, 91.65325927734374, + 91.32088216145833, 91.33809407552084, 90.97965494791669 + ], + [ + 21.287740071614586, 24.900065104166668, 21.251302083333332, 22.923807779947918, + 19.468831380208332, 17.589090983072918, 23.456868489583332, 19.69866943359375, + 19.797098795572918, 16.576334635416668, 18.836079915364586, 22.102091471354168, 0.0, + 15.934163411458334, 93.28959147135417, 92.60577392578124, 93.31445312500001, + 92.48531087239583, 93.36881510416666, 92.4110107421875, 92.05141194661459, 91.58837890625, + 91.94394938151042, 91.42038981119794, 92.21543375651044, 91.50874837239583, + 91.54280598958334, 91.34936523437499 + ], + [ + 21.827087402343754, 20.837972005208332, 19.516642252604164, 21.096659342447918, + 22.501261393229164, 16.93341064453125, 16.675455729166664, 20.511576334635414, + 15.304951985677082, 16.896077473958332, 15.701070149739584, 14.932739257812498, + 15.934163411458334, 0.0, 92.36401367187501, 91.78599039713542, 92.28271484375, + 91.6282958984375, 92.25626627604166, 91.41585286458331, 91.00299072265625, + 90.687744140625, 90.92767333984375, 90.43471272786458, 91.13612874348958, + 90.60030110677083, 90.56298828124999, 90.3438720703125 + ], + [ + 96.70648193359374, 95.14326985677083, 94.51045735677084, 94.66469319661456, + 94.95231119791669, 95.14385986328125, 94.26383463541666, 93.99208577473958, + 94.02504475911459, 94.15523274739583, 93.63852945963541, 92.98677571614583, + 93.28959147135417, 92.36401367187501, 0.0, 17.39678955078125, 15.305053710937498, + 14.198486328125002, 21.145304361979164, 19.384236653645836, 18.27105712890625, + 17.156209309895832, 22.116190592447914, 19.083475748697918, 22.445699055989586, + 19.460530598958336, 23.982421875, 25.1165771484375 + ], + [ + 96.00101725260416, 94.60972086588542, 93.80674235026041, 94.0772705078125, + 94.22353108723956, 94.65169270833333, 93.7852579752604, 93.44665527343749, + 93.53096516927083, 93.49163818359375, 93.05700683593751, 92.46470133463541, + 92.60577392578124, 91.78599039713542, 17.39678955078125, 0.0, 17.984883626302086, + 13.138203938802084, 23.740417480468746, 20.875956217447914, 17.712158203125, + 16.022603352864586, 21.837320963541664, 16.709716796875, 24.972167968750004, + 19.38726806640625, 18.39898681640625, 25.247294108072914 + ], + [ + 96.62278238932292, 94.913330078125, 94.39298502604167, 94.52947998046876, 94.969970703125, + 95.11566162109375, 94.04219563802084, 93.90232340494791, 93.92303466796875, + 94.21525065104166, 93.58396402994792, 92.86531575520834, 93.31445312500001, + 92.28271484375, 15.305053710937498, 17.984883626302086, 0.0, 14.468343098958334, + 18.545125325520832, 17.649658203125, 14.034281412760416, 18.071573893229168, + 17.245951334635414, 15.904642740885416, 16.707132975260418, 20.496337890625, + 21.43013509114583, 23.107421875000004 + ], + [ + 95.90114339192706, 94.37414550781249, 93.70560709635416, 93.91265869140625, + 94.13228352864583, 94.45147705078125, 93.57832845052083, 93.21258544921876, + 93.26051839192709, 93.38309733072917, 92.88511149088542, 92.28165690104166, + 92.48531087239583, 91.6282958984375, 14.198486328125002, 13.138203938802084, + 14.468343098958334, 0.0, 21.265909830729168, 19.903889973958332, 16.623392740885418, + 14.52294921875, 20.215352376302086, 15.780171712239582, 21.514424641927082, + 19.096964518229168, 18.705322265625, 25.073120117187496 + ], + [ + 96.65403238932292, 94.80505371093751, 94.48262532552083, 94.50266520182292, + 95.07657877604167, 95.11460367838542, 94.00919596354166, 93.91566975911458, + 93.86370849609375, 94.26529947916666, 93.61789957682291, 92.86446126302084, + 93.36881510416666, 92.25626627604166, 21.145304361979164, 23.740417480468746, + 18.545125325520832, 21.265909830729168, 0.0, 12.948933919270834, 15.40899658203125, + 21.2266845703125, 15.306009928385418, 19.386332194010418, 15.466247558593752, + 20.056477864583332, 22.554809570312496, 18.44803873697917 + ], + [ + 95.71311442057292, 93.9951171875, 93.52315266927083, 93.61175537109375, 94.046142578125, + 94.22068277994791, 93.19437662760416, 92.99843343098958, 93.06439208984375, + 93.28853352864583, 92.69004313151041, 92.01094563802084, 92.4110107421875, + 91.41585286458331, 19.384236653645836, 20.875956217447914, 17.649658203125, + 19.903889973958332, 12.948933919270834, 0.0, 15.156066894531252, 19.115681966145836, + 14.93292236328125, 18.479715983072918, 17.19207763671875, 17.745361328125, + 21.489990234375, 17.435546875 + ], + [ + 95.3453369140625, 93.57114664713542, 93.09222412109375, 93.20499674479166, + 93.66465250651042, 93.800048828125, 92.78586832682292, 92.64717610677084, + 92.63810221354167, 92.88397216796875, 92.30623372395833, 91.70794677734375, + 92.05141194661459, 91.00299072265625, 18.27105712890625, 17.712158203125, + 14.034281412760416, 16.623392740885418, 15.40899658203125, 15.156066894531252, 0.0, + 15.717142740885418, 12.158976236979168, 13.731770833333332, 14.570271809895832, + 15.10894775390625, 16.77740478515625, 16.001525878906254 + ], + [ + 94.90818277994792, 93.33890787760417, 92.7025146484375, 92.84047444661459, + 93.22330729166666, 93.45969645182292, 92.51798502604167, 92.31154378255209, + 92.31760660807292, 92.4493408203125, 91.87738037109375, 91.37320963541667, 91.58837890625, + 90.687744140625, 17.156209309895832, 16.022603352864586, 18.071573893229168, + 14.52294921875, 21.2266845703125, 19.115681966145836, 15.717142740885418, 0.0, + 19.861918131510418, 12.777852376302086, 22.342915852864582, 14.482055664062498, + 15.219970703125, 22.359659830729168 + ], + [ + 95.24820963541667, 93.42869059244794, 93.00575764973958, 93.11625162760419, + 93.60666910807291, 93.72395833333333, 92.66522216796875, 92.50899251302083, + 92.50337727864581, 92.81467692057291, 92.15592447916667, 91.53082275390624, + 91.94394938151042, 90.92767333984375, 22.116190592447914, 21.837320963541664, + 17.245951334635414, 20.215352376302086, 15.306009928385418, 14.93292236328125, + 12.158976236979168, 19.861918131510418, 0.0, 16.51888020833333, 12.7291259765625, + 17.723286946614582, 18.892842610677082, 15.931009928385418 + ], + [ + 94.66768391927083, 93.01369222005209, 92.42506917317708, 92.64737955729169, + 92.97113037109375, 93.18644205729167, 92.26422119140625, 92.01127115885416, + 92.03824869791666, 92.25311279296875, 91.7264404296875, 91.11631266276042, + 91.42038981119794, 90.43471272786458, 19.083475748697918, 16.709716796875, + 15.904642740885416, 15.780171712239582, 19.386332194010418, 18.479715983072918, + 13.731770833333332, 12.777852376302086, 16.51888020833333, 0.0, 17.798095703125, + 16.21746826171875, 14.331888834635418, 21.164164225260418 + ], + [ + 95.51359049479166, 93.54298909505206, 93.29840087890625, 93.30391438802084, + 93.93011474609376, 93.86267089843749, 92.81658935546874, 92.7205810546875, + 92.7315673828125, 93.03769938151042, 92.42594401041667, 91.65325927734374, + 92.21543375651044, 91.13612874348958, 22.445699055989586, 24.972167968750004, + 16.707132975260418, 21.514424641927082, 15.466247558593752, 17.19207763671875, + 14.570271809895832, 22.342915852864582, 12.7291259765625, 17.798095703125, 0.0, + 21.84332275390625, 21.957784016927082, 18.087178548177086 + ], + [ + 94.79604085286459, 93.2154541015625, 92.59476725260417, 92.72226969401041, + 93.03181966145834, 93.35361735026041, 92.47908528645831, 92.18707275390625, + 92.26125081380209, 92.31131998697917, 91.78452555338541, 91.32088216145833, + 91.50874837239583, 90.60030110677083, 19.460530598958336, 19.38726806640625, + 20.496337890625, 19.096964518229168, 20.056477864583332, 17.745361328125, + 15.10894775390625, 14.482055664062498, 17.723286946614582, 16.21746826171875, + 21.84332275390625, 0.0, 15.520385742187502, 16.835693359375 + ], + [ + 94.73256429036458, 93.31042480468751, 92.56180826822916, 92.74383544921876, 92.9677734375, + 93.35866292317708, 92.52750651041666, 92.18605550130209, 92.32484944661458, + 92.3729248046875, 91.84478759765625, 91.33809407552084, 91.54280598958334, + 90.56298828124999, 23.982421875, 18.39898681640625, 21.43013509114583, 18.705322265625, + 22.554809570312496, 21.489990234375, 16.77740478515625, 15.219970703125, + 18.892842610677082, 14.331888834635418, 21.957784016927082, 15.520385742187502, 0.0, + 22.3677978515625 + ], + [ + 94.60552978515625, 92.8597412109375, 92.37972005208334, 92.49546305338541, + 92.953857421875, 93.09238688151041, 92.05598958333334, 91.96901448567708, + 91.95220947265624, 92.22090657552083, 91.59218343098959, 90.97965494791669, + 91.34936523437499, 90.3438720703125, 25.1165771484375, 25.247294108072914, + 23.107421875000004, 25.073120117187496, 18.44803873697917, 17.435546875, + 16.001525878906254, 22.359659830729168, 15.931009928385418, 21.164164225260418, + 18.087178548177086, 16.835693359375, 22.3677978515625, 0.0 + ] + ], + "units": "SYS_CNT ticks", + "source": { + "name": "scalar_128MiB_cube_isolated", + "matrices": { + "path": "benchmarks/ascend950pr_cube_vector_heatmaps_20261006/analysis/scalar_128MiB_cube_isolated.npz", + "sha256": "7f678aae8067ad7464d0a97411abdbbb63261f4da330ae76bd9fe53443b404f6", + "bytes": 2506885 + }, + "statistics": { + "path": "benchmarks/ascend950pr_cube_vector_heatmaps_20261006/analysis/scalar_128MiB_cube_isolated.json", + "sha256": "897ad327c8a8e80d69c53157105adf6a97085612a00851c9797b96558976f91c", + "bytes": 50296 + } + }, + "pair_statistics": { + "all_unique_core_pairs": { + "count": 378, + "mean": 57.22345105260349, + "std": 37.33750015815064, + "quantiles": { + "0.0": 12.158976236979168, + "0.01": 12.776069539388024, + "0.05": 14.931454467773436, + "0.25": 18.41124979654948, + "0.5": 90.99132283528647, + "0.75": 93.08526611328125, + "0.95": 94.79739278157552, + "0.99": 95.9241143798828, + "1.0": 96.70648193359374 + } + }, + "within_decoded_die": { + "count": 182, + "mean": 18.554992116851245, + "std": 3.1748091800094915, + "quantiles": { + "0.0": 12.158976236979168, + "0.01": 12.721545613606771, + "0.05": 14.067250569661459, + "0.25": 15.931798299153646, + "0.5": 18.224263509114586, + "0.75": 21.133143107096352, + "0.95": 23.97607421875, + "0.99": 25.7233935546875, + "1.0": 27.0980224609375 + } + }, + "between_decoded_die": { + "count": 196, + "mean": 93.12987720723055, + "std": 1.2340974582112165, + "quantiles": { + "0.0": 90.3438720703125, + "0.01": 90.55657450358072, + "0.05": 91.27469380696614, + "0.25": 92.31004842122397, + "0.5": 93.03475952148438, + "0.75": 93.91751098632812, + "0.95": 95.14341735839844, + "0.99": 96.62434488932293, + "1.0": 96.70648193359374 + } + } + }, + "dieGroups": [ + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B" + ] + }, + { + "condition": "scalar_128MiB_cube_concurrent", + "metric": "distance", + "coreids": [ + 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 66, 67, 68 + ], + "matrix": [ + [ + 0.0, 35.94970703125, 28.267130533854168, 24.744099934895836, 37.34417724609375, + 30.532307942708332, 29.8131103515625, 20.894042968749996, 37.64971923828125, + 33.197509765625, 34.327433268229164, 33.532328287760414, 30.786356608072918, + 40.900187174479164, 92.80275472005208, 74.6177978515625, 89.49163818359374, + 75.70969645182291, 87.09710693359375, 66.18766276041667, 89.31703694661459, + 106.05940755208334, 102.22385660807292, 58.711527506510414, 85.63018798828125, + 102.55999755859374, 102.19559733072916, 74.99434407552084 + ], + [ + 35.94970703125, 0.0, 34.07975260416666, 40.39270019531249, 30.73883056640625, + 26.036661783854168, 34.095784505208336, 38.664510091145836, 30.18752034505208, + 36.709065755208336, 27.768839518229164, 32.861673990885414, 35.304545084635414, + 30.878255208333332, 65.93406168619791, 51.92789713541667, 62.621236165364586, + 52.37416585286458, 60.159810384114586, 43.314534505208336, 62.678202311197914, + 78.34749348958333, 74.26320393880208, 41.419942220052086, 59.03456624348958, + 74.66033935546875, 75.09415690104167, 51.227498372395836 + ], + [ + 28.267130533854168, 34.07975260416666, 0.0, 27.390177408854164, 31.25270589192708, + 28.188110351562496, 26.878702799479168, 28.532389322916664, 33.407246907552086, + 26.71341959635416, 27.917236328124996, 29.49338785807291, 16.283060709635414, + 37.08638509114583, 89.79176839192708, 71.29158528645834, 86.46270751953125, + 71.53261311848959, 84.38425699869792, 62.889567057291664, 86.61810302734375, + 103.70756022135417, 100.00054931640625, 54.94435628255208, 82.74163818359374, + 100.18544514973958, 99.9605712890625, 73.17451985677083 + ], + [ + 24.744099934895836, 40.39270019531249, 27.390177408854164, 0.0, 41.400126139322914, + 34.6890869140625, 28.388712565104164, 25.960327148437496, 41.058451334635414, + 33.2744140625, 36.7115478515625, 34.781840006510414, 28.344380696614586, + 44.106852213541664, 99.69036865234376, 81.03556315104167, 96.35536702473956, + 82.43463134765625, 93.97524007161458, 72.09049479166666, 96.44468180338541, + 113.63708496093749, 109.60487874348958, 64.50270589192708, 92.67580159505209, + 109.92156982421876, 109.70719401041667, 82.3917236328125 + ], + [ + 37.34417724609375, 30.73883056640625, 31.25270589192708, 41.400126139322914, 0.0, + 21.937276204427082, 34.271504720052086, 37.11167399088542, 28.91365559895833, + 30.468811035156243, 28.37969970703125, 28.515584309895836, 33.150797526041664, + 30.461934407552082, 66.976806640625, 50.86492919921875, 64.86112467447917, + 49.913899739583336, 62.1273193359375, 43.193868001302086, 63.83300781249999, + 79.74318440755208, 76.87443033854167, 38.006103515625, 60.5753173828125, + 76.53137207031249, 76.65627034505209, 51.088521321614586 + ], + [ + 30.532307942708332, 26.036661783854168, 28.188110351562496, 34.6890869140625, + 21.937276204427082, 0.0, 28.764200846354168, 30.2337646484375, 27.031555175781246, + 26.693929036458336, 24.63350423177083, 26.357076009114586, 28.437113444010418, + 28.965372721354164, 73.21091715494792, 55.866658528645836, 70.59844970703125, + 55.54791259765625, 67.85219319661459, 47.50089518229167, 69.76588948567708, + 86.60363769531249, 83.16042073567708, 41.08652750651042, 66.18214925130209, + 83.06052652994792, 83.04182942708333, 57.47448730468749 + ], + [ + 29.8131103515625, 34.095784505208336, 26.878702799479168, 28.388712565104164, + 34.271504720052086, 28.764200846354168, 0.0, 29.571248372395832, 30.256286621093746, + 25.574584960937504, 29.092000325520832, 27.233907063802086, 28.173156738281246, + 34.67842610677083, 86.42047119140624, 68.83040364583333, 83.28529866536458, + 69.34999593098958, 80.67213948567709, 60.466471354166664, 83.24228922526041, + 100.34029134114583, 96.44879150390625, 53.04644775390626, 79.38299560546875, + 96.93438720703124, 96.67309570312501, 70.02742513020833 + ], + [ + 20.894042968749996, 38.664510091145836, 28.532389322916664, 25.960327148437496, + 37.11167399088542, 30.2337646484375, 29.571248372395832, 0.0, 38.26361083984375, + 32.66365559895833, 34.758870442708336, 35.38991292317708, 26.884745279947918, + 41.36539713541667, 93.33872477213542, 75.01021321614583, 89.82240804036459, + 76.58184814453125, 87.78904215494791, 67.38883463541666, 90.04648844401041, + 106.75097656250001, 102.76031494140625, 59.618794759114586, 86.3109334309896, + 103.1830851236979, 102.72668457031249, 75.81368001302084 + ], + [ + 37.64971923828125, 30.18752034505208, 33.407246907552086, 41.058451334635414, + 28.91365559895833, 27.031555175781246, 30.256286621093746, 38.26361083984375, 0.0, + 31.55413818359375, 25.189554850260418, 30.677408854166668, 33.0687255859375, + 29.777689615885414, 66.64803059895834, 50.97430419921875, 63.736083984375, + 50.80208333333333, 61.21244303385417, 44.24407958984376, 63.15014648437499, + 79.63641357421875, 75.85872395833333, 38.814860026041664, 60.17395019531249, + 76.20454915364584, 76.35569254557292, 51.81020100911458 + ], + [ + 33.197509765625, 36.709065755208336, 26.71341959635416, 33.2744140625, 30.468811035156243, + 26.693929036458336, 25.574584960937504, 32.66365559895833, 31.55413818359375, 0.0, + 28.311848958333336, 25.055562337239582, 26.606302897135414, 33.49373372395833, + 82.74965413411459, 64.00089518229167, 80.10471598307292, 64.50209554036459, + 77.38690185546875, 56.4730224609375, 79.39316813151042, 96.40132649739583, + 93.00811767578125, 47.72117106119792, 75.77659098307292, 93.09747314453125, + 92.86686197916667, 67.31437174479167 + ], + [ + 34.327433268229164, 27.768839518229164, 27.917236328124996, 36.7115478515625, + 28.37969970703125, 24.63350423177083, 29.092000325520832, 34.758870442708336, + 25.189554850260418, 28.311848958333336, 0.0, 26.69549560546875, 28.46771240234375, + 28.8642578125, 72.75526936848958, 56.167561848958336, 70.00978597005209, + 55.35752360026042, 67.92665608723958, 48.437906901041664, 69.43280029296875, + 86.5869140625, 82.94252522786458, 40.97186279296875, 65.72406005859375, 83.21877034505208, + 83.20113118489584, 58.34590657552083 + ], + [ + 33.532328287760414, 32.861673990885414, 29.49338785807291, 34.781840006510414, + 28.515584309895836, 26.357076009114586, 27.233907063802086, 35.38991292317708, + 30.677408854166668, 25.055562337239582, 26.69549560546875, 0.0, 29.588338216145836, + 29.79640706380209, 77.47611490885417, 59.92242431640625, 74.89530436197917, + 59.7857666015625, 71.78055826822917, 52.50506591796874, 74.09647623697916, + 91.03615315755208, 87.47607421875, 43.77042643229167, 70.0340576171875, 87.8284912109375, + 87.84840901692708, 61.46205647786458 + ], + [ + 30.786356608072918, 35.304545084635414, 16.283060709635414, 28.344380696614586, + 33.150797526041664, 28.437113444010418, 28.173156738281246, 26.884745279947918, + 33.0687255859375, 26.606302897135414, 28.46771240234375, 29.588338216145836, 0.0, + 35.82533772786458, 88.80497233072917, 69.88165283203125, 85.31050618489584, + 70.56131998697917, 83.44523111979167, 62.32277425130208, 85.65421549479166, + 102.72914632161459, 98.99983723958333, 54.417154947916664, 81.94352213541667, + 99.26009114583334, 98.92653401692709, 72.5925089518229 + ], + [ + 40.900187174479164, 30.878255208333332, 37.08638509114583, 44.106852213541664, + 30.461934407552082, 28.965372721354164, 34.67842610677083, 41.36539713541667, + 29.777689615885414, 33.49373372395833, 28.8642578125, 29.79640706380209, + 35.82533772786458, 0.0, 64.72629801432292, 48.81258138020833, 62.23533121744791, + 49.16347249348958, 59.66969807942708, 43.285929361979164, 61.05780029296875, + 78.01949055989583, 74.07790120442709, 37.558085123697914, 56.826395670572914, + 74.82781982421875, 74.77937825520833, 50.34672037760416 + ], + [ + 92.80275472005208, 65.93406168619791, 89.79176839192708, 99.69036865234376, + 66.976806640625, 73.21091715494792, 86.42047119140624, 93.33872477213542, + 66.64803059895834, 82.74965413411459, 72.75526936848958, 77.47611490885417, + 88.80497233072917, 64.72629801432292, 0.0, 29.88079833984375, 19.371012369791668, + 32.526570638020836, 27.967936197916668, 39.145039876302086, 25.34110514322917, + 27.669576009114582, 26.949015299479168, 42.791178385416664, 29.933959960937504, + 27.436889648437496, 28.158182779947918, 36.21413167317708 + ], + [ + 74.6177978515625, 51.92789713541667, 71.29158528645834, 81.03556315104167, + 50.86492919921875, 55.866658528645836, 68.83040364583333, 75.01021321614583, + 50.97430419921875, 64.00089518229167, 56.167561848958336, 59.92242431640625, + 69.88165283203125, 48.81258138020833, 29.88079833984375, 0.0, 30.330017089843746, + 30.25583902994792, 32.95257568359374, 33.6961669921875, 31.803853352864586, + 39.319010416666664, 39.061665852864586, 31.14621988932292, 34.26861572265625, + 38.65736897786458, 37.9774169921875, 35.38305664062499 + ], + [ + 89.49163818359374, 62.621236165364586, 86.46270751953125, 96.35536702473956, + 64.86112467447917, 70.59844970703125, 83.28529866536458, 89.82240804036459, + 63.736083984375, 80.10471598307292, 70.00978597005209, 74.89530436197917, + 85.31050618489584, 62.23533121744791, 19.371012369791668, 30.330017089843746, 0.0, + 32.4351806640625, 27.574015299479164, 37.98659261067708, 27.552693684895836, + 30.782165527343746, 27.74886067708333, 43.645711263020836, 30.135213216145836, + 29.829020182291668, 30.043924967447914, 35.57716878255208 + ], + [ + 75.70969645182291, 52.37416585286458, 71.53261311848959, 82.43463134765625, + 49.913899739583336, 55.54791259765625, 69.34999593098958, 76.58184814453125, + 50.80208333333333, 64.50209554036459, 55.35752360026042, 59.7857666015625, + 70.56131998697917, 49.16347249348958, 32.526570638020836, 30.25583902994792, + 32.4351806640625, 0.0, 32.667032877604164, 27.09629313151042, 28.392008463541668, + 37.59234619140625, 38.982991536458336, 34.58158365885416, 29.015543619791664, + 36.62748209635417, 39.62811279296875, 28.677958170572918 + ], + [ + 87.09710693359375, 60.159810384114586, 84.38425699869792, 93.97524007161458, + 62.1273193359375, 67.85219319661459, 80.67213948567709, 87.78904215494791, + 61.21244303385417, 77.38690185546875, 67.92665608723958, 71.78055826822917, + 83.44523111979167, 59.66969807942708, 27.967936197916668, 32.95257568359374, + 27.574015299479164, 32.667032877604164, 0.0, 32.43125406901042, 24.892496744791668, + 32.51450602213542, 28.850789388020832, 40.9671630859375, 28.319742838541668, + 31.867106119791664, 34.27793375651042, 33.681986490885414 + ], + [ + 66.18766276041667, 43.314534505208336, 62.889567057291664, 72.09049479166666, + 43.193868001302086, 47.50089518229167, 60.466471354166664, 67.38883463541666, + 44.24407958984376, 56.4730224609375, 48.437906901041664, 52.50506591796874, + 62.32277425130208, 43.285929361979164, 39.145039876302086, 33.6961669921875, + 37.98659261067708, 27.09629313151042, 32.43125406901042, 0.0, 34.557840983072914, + 47.13924153645833, 45.090596516927086, 34.050028483072914, 35.29510498046876, + 45.09938557942708, 46.952229817708336, 33.4302978515625 + ], + [ + 89.31703694661459, 62.678202311197914, 86.61810302734375, 96.44468180338541, + 63.83300781249999, 69.76588948567708, 83.24228922526041, 90.04648844401041, + 63.15014648437499, 79.39316813151042, 69.43280029296875, 74.09647623697916, + 85.65421549479166, 61.05780029296875, 25.34110514322917, 31.803853352864586, + 27.552693684895836, 28.392008463541668, 24.892496744791668, 34.557840983072914, 0.0, + 29.156880696614582, 27.03580729166667, 42.519816080729164, 23.590250651041668, + 28.352783203125004, 26.97324625651042, 33.587626139322914 + ], + [ + 106.05940755208334, 78.34749348958333, 103.70756022135417, 113.63708496093749, + 79.74318440755208, 86.60363769531249, 100.34029134114583, 106.75097656250001, + 79.63641357421875, 96.40132649739583, 86.5869140625, 91.03615315755208, + 102.72914632161459, 78.01949055989583, 27.669576009114582, 39.319010416666664, + 30.782165527343746, 37.59234619140625, 32.51450602213542, 47.13924153645833, + 29.156880696614582, 0.0, 26.226175944010418, 55.47857666015624, 33.460062662760414, + 20.538146972656254, 23.900431315104168, 39.16625976562499 + ], + [ + 102.22385660807292, 74.26320393880208, 100.00054931640625, 109.60487874348958, + 76.87443033854167, 83.16042073567708, 96.44879150390625, 102.76031494140625, + 75.85872395833333, 93.00811767578125, 82.94252522786458, 87.47607421875, + 98.99983723958333, 74.07790120442709, 26.949015299479168, 39.061665852864586, + 27.74886067708333, 38.982991536458336, 28.850789388020832, 45.090596516927086, + 27.03580729166667, 26.226175944010418, 0.0, 53.980550130208336, 25.619710286458336, + 25.190226236979168, 26.232808430989582, 36.867574055989586 + ], + [ + 58.711527506510414, 41.419942220052086, 54.94435628255208, 64.50270589192708, + 38.006103515625, 41.08652750651042, 53.04644775390626, 59.618794759114586, + 38.814860026041664, 47.72117106119792, 40.97186279296875, 43.77042643229167, + 54.417154947916664, 37.558085123697914, 42.791178385416664, 31.14621988932292, + 43.645711263020836, 34.58158365885416, 40.9671630859375, 34.050028483072914, + 42.519816080729164, 55.47857666015624, 53.980550130208336, 0.0, 41.041910807291664, + 53.31644694010417, 54.442118326822914, 38.094136555989586 + ], + [ + 85.63018798828125, 59.03456624348958, 82.74163818359374, 92.67580159505209, + 60.5753173828125, 66.18214925130209, 79.38299560546875, 86.3109334309896, + 60.17395019531249, 75.77659098307292, 65.72406005859375, 70.0340576171875, + 81.94352213541667, 56.826395670572914, 29.933959960937504, 34.26861572265625, + 30.135213216145836, 29.015543619791664, 28.319742838541668, 35.29510498046876, + 23.590250651041668, 33.460062662760414, 25.619710286458336, 41.041910807291664, 0.0, + 32.79504394531249, 33.18410237630208, 27.11846923828125 + ], + [ + 102.55999755859374, 74.66033935546875, 100.18544514973958, 109.92156982421876, + 76.53137207031249, 83.06052652994792, 96.93438720703124, 103.1830851236979, + 76.20454915364584, 93.09747314453125, 83.21877034505208, 87.8284912109375, + 99.26009114583334, 74.82781982421875, 27.436889648437496, 38.65736897786458, + 29.829020182291668, 36.62748209635417, 31.867106119791664, 45.09938557942708, + 28.352783203125004, 20.538146972656254, 25.190226236979168, 53.31644694010417, + 32.79504394531249, 0.0, 22.246846516927086, 37.75433349609375 + ], + [ + 102.19559733072916, 75.09415690104167, 99.9605712890625, 109.70719401041667, + 76.65627034505209, 83.04182942708333, 96.67309570312501, 102.72668457031249, + 76.35569254557292, 92.86686197916667, 83.20113118489584, 87.84840901692708, + 98.92653401692709, 74.77937825520833, 28.158182779947918, 37.9774169921875, + 30.043924967447914, 39.62811279296875, 34.27793375651042, 46.952229817708336, + 26.97324625651042, 23.900431315104168, 26.232808430989582, 54.442118326822914, + 33.18410237630208, 22.246846516927086, 0.0, 40.3746337890625 + ], + [ + 74.99434407552084, 51.227498372395836, 73.17451985677083, 82.3917236328125, + 51.088521321614586, 57.47448730468749, 70.02742513020833, 75.81368001302084, + 51.81020100911458, 67.31437174479167, 58.34590657552083, 61.46205647786458, + 72.5925089518229, 50.34672037760416, 36.21413167317708, 35.38305664062499, + 35.57716878255208, 28.677958170572918, 33.681986490885414, 33.4302978515625, + 33.587626139322914, 39.16625976562499, 36.867574055989586, 38.094136555989586, + 27.11846923828125, 37.75433349609375, 40.3746337890625, 0.0 + ] + ], + "units": "SYS_CNT ticks", + "source": { + "name": "scalar_128MiB_cube_concurrent", + "matrices": { + "path": "benchmarks/ascend950pr_cube_vector_heatmaps_20261006/analysis/scalar_128MiB_cube_concurrent.npz", + "sha256": "68b3a397f17aa7847f883a8fb25be5e5fbb8c23a7c4ad19e127280126a64e2ee", + "bytes": 3023127 + }, + "statistics": { + "path": "benchmarks/ascend950pr_cube_vector_heatmaps_20261006/analysis/scalar_128MiB_cube_concurrent.json", + "sha256": "9f187cb6873132acf305b75d48b187ac6627f24fb91b9693276a8debef6b76cb", + "bytes": 50465 + } + }, + "pair_statistics": { + "all_unique_core_pairs": { + "count": 378, + "mean": 54.04791577320671, + "std": 24.78088043692896, + "quantiles": { + "0.0": 16.283060709635414, + "0.01": 21.69733256022135, + "0.05": 26.19774881998698, + "0.25": 31.61656697591146, + "0.5": 47.320068359375, + "0.75": 74.96958414713542, + "0.95": 99.3246327718099, + "0.99": 107.40737406412767, + "1.0": 113.63708496093749 + } + }, + "within_decoded_die": { + "count": 182, + "mean": 32.369188804766196, + "std": 6.378932704782334, + "quantiles": { + "0.0": 16.283060709635414, + "0.01": 20.316391398111982, + "0.05": 24.751519775390626, + "0.25": 28.17689514160156, + "0.5": 30.832305908203125, + "0.75": 35.53035481770833, + "0.95": 43.60298461914062, + "0.99": 54.0682480875651, + "1.0": 55.47857666015624 + } + }, + "between_decoded_die": { + "count": 196, + "mean": 74.17816224390147, + "std": 17.46170425957447, + "quantiles": { + "0.0": 37.558085123697914, + "0.01": 38.77442220052083, + "0.05": 44.125666300455734, + "0.25": 61.17378234863281, + "0.5": 74.71985880533853, + "0.75": 86.59109497070312, + "0.95": 102.72730000813802, + "0.99": 109.71791280110678, + "1.0": 113.63708496093749 + } + } + }, + "dieGroups": [ + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B" + ] + }, + { + "condition": "scalar_128MiB_vector_isolated", + "metric": "distance", + "coreids": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, + 45, 46, 47, 48, 49, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 96, 97, 98, 99, 100, 101 + ], + "matrix": [ + [ + 0.0, 10.660400390625, 16.78631591796875, 16.2188720703125, 14.609659830729166, + 15.288736979166666, 13.865091959635416, 16.432210286458336, 18.86505126953125, + 20.33135986328125, 16.555216471354168, 16.902445475260414, 18.801005045572918, + 18.338948567708336, 18.161458333333332, 18.029215494791664, 17.43585205078125, + 15.934326171874998, 21.419881184895832, 20.605834960937504, 19.556254069010418, + 17.234781901041668, 22.228006998697914, 21.51043701171875, 21.246114095052082, + 21.053670247395836, 20.784505208333336, 19.583353678385418, 94.44472249348958, + 95.28102620442708, 94.16617838541667, 94.30828857421875, 95.12670898437501, + 94.36861165364583, 94.56561279296876, 94.11405436197916, 94.90852864583333, + 94.75211588541667, 94.24149576822917, 94.1085205078125, 93.74505615234374, + 93.78169759114583, 93.38283284505208, 92.34895833333333, 93.88944498697917, + 93.94034830729166, 93.16851806640625, 93.04101562500001, 93.77386474609376, + 93.69598388671875, 93.19500732421876, 93.06608072916666, 93.00933837890625, + 93.01247151692708, 92.75638834635416, 93.36850992838541 + ], + [ + 10.660400390625, 0.0, 16.61785888671875, 18.437174479166668, 14.471801757812498, + 12.950724283854168, 13.38897705078125, 14.978352864583336, 19.92462158203125, + 18.416524251302082, 16.034464518229168, 16.565572102864586, 17.166239420572918, + 18.903564453125, 18.181437174479168, 16.791219075520836, 15.879862467447914, + 15.563761393229168, 19.269490559895832, 19.714599609374996, 17.456807454427082, + 16.742024739583332, 21.795308430989586, 20.01434326171875, 21.42645263671875, + 19.749837239583332, 20.335449218749996, 18.74859619140625, 94.86838785807292, + 95.75356038411458, 94.584716796875, 94.73227945963541, 95.52347819010417, + 94.77258300781249, 94.93585205078125, 94.59973144531253, 95.3734130859375, + 95.18953450520834, 94.71634928385417, 94.55558268229167, 94.25815836588542, + 94.1888427734375, 93.82082112630208, 92.7725830078125, 94.39428710937499, 94.41259765625, + 93.63136800130209, 93.55399576822917, 94.26255289713542, 94.20831298828125, + 93.64996337890625, 93.55977376302083, 93.47983805338544, 93.40834554036458, + 93.2069091796875, 93.83998616536459 + ], + [ + 16.78631591796875, 16.61785888671875, 0.0, 18.354878743489582, 18.47918701171875, + 17.492004394531254, 17.3297119140625, 13.08819580078125, 25.8746337890625, + 24.989217122395832, 19.30072021484375, 18.746826171875, 16.895304361979168, + 18.001647949218754, 21.639790852864582, 23.932556152343746, 18.189208984374996, + 17.829121907552086, 26.399271647135414, 25.352600097656246, 20.075602213541668, + 17.844217936197918, 20.01318359375, 20.5010986328125, 25.257934570312504, + 25.979227701822918, 21.15093994140625, 20.975301106770836, 94.79313151041667, + 95.69958496093751, 94.64837646484375, 94.85892740885417, 95.36285400390624, + 94.65948486328125, 94.98148600260416, 94.64699300130208, 95.16864013671875, + 94.91200764973959, 94.55690511067708, 94.41737874348958, 94.1212158203125, + 94.06272379557292, 93.76053873697917, 92.80942789713542, 94.20086669921875, + 94.18821207682292, 93.50240071614583, 93.42392985026042, 93.97147623697917, + 93.90604654947916, 93.6387939453125, 93.44944254557292, 93.54781087239583, + 93.554443359375, 93.08534749348958, 93.66516113281251 + ], + [ + 16.2188720703125, 18.437174479166668, 18.354878743489582, 0.0, 18.4329833984375, + 23.232421875, 13.592671712239586, 21.21630859375, 23.12396240234375, 29.066019694010414, + 18.736328125, 18.894063313802082, 20.17364501953125, 14.911661783854168, + 24.650594075520832, 23.75935872395833, 19.972839355468746, 19.474405924479168, + 29.172648111979164, 25.890624999999996, 24.296081542968746, 22.316569010416668, + 20.299784342447914, 24.76861572265625, 23.686299641927082, 26.085164388020832, + 24.2203369140625, 22.833964029947918, 94.77158610026044, 95.57720947265626, + 94.69384765625, 94.90948486328125, 95.22155761718751, 94.54581705729167, + 94.89495849609375, 94.53670247395833, 94.91931152343751, 94.7156982421875, + 94.35697428385416, 94.22635904947917, 93.93019612630208, 93.8572998046875, + 93.60809326171875, 92.66060384114584, 93.89188639322916, 93.91662597656249, + 93.35797119140625, 93.25590006510417, 93.75661214192708, 93.63637288411458, + 93.46006266276042, 93.36629231770833, 93.43857828776042, 93.47458902994792, + 92.864013671875, 93.39735921223959 + ], + [ + 14.609659830729166, 14.471801757812498, 18.47918701171875, 18.4329833984375, 0.0, + 15.3260498046875, 14.480000813802082, 18.374877929687504, 16.00677490234375, + 18.78057861328125, 16.196248372395832, 14.127095540364584, 18.96710205078125, + 18.268229166666664, 16.980387369791668, 17.552408854166668, 19.037007649739582, + 18.921590169270832, 20.83793131510417, 18.786092122395832, 20.65777587890625, + 18.451904296875, 21.650492350260418, 23.67596435546875, 18.761250813802082, + 21.0076904296875, 20.833089192708332, 19.553487141927082, 94.78835042317709, + 95.61765543619791, 94.47705078125001, 94.62795003255208, 95.41271972656251, + 94.63069661458333, 94.83034261067709, 94.47806803385417, 95.27803548177083, + 95.07149251302083, 94.57303873697917, 94.43937174479167, 94.13795979817708, + 94.08565266927084, 93.67287190755208, 92.64762369791666, 94.23482259114583, + 94.30712890625001, 93.48862711588542, 93.39550781249999, 94.12758382161458, + 94.04347737630208, 93.54335530598958, 93.39815266927084, 93.33872477213541, + 93.35935465494791, 93.14261881510419, 93.71303304036458 + ], + [ + 15.288736979166666, 12.950724283854168, 17.492004394531254, 23.232421875, + 15.3260498046875, 0.0, 18.27105712890625, 14.816731770833334, 18.699239095052082, + 15.822489420572918, 16.511881510416668, 16.495463053385414, 17.683329264322914, + 21.661946614583336, 19.06787109375, 18.544392903645836, 17.498067220052086, + 18.015462239583336, 16.336832682291664, 17.562703450520836, 18.101338704427086, + 17.351643880208336, 21.293233235677082, 21.127827962239586, 22.029195149739582, + 21.001627604166664, 19.320638020833336, 20.55194091796875, 94.87738037109375, + 95.70078531901042, 94.52144368489583, 94.64975992838542, 95.51383463541667, + 94.78470865885416, 94.88718668619792, 94.49519856770831, 95.38297526041667, + 95.19169108072917, 94.6611328125, 94.54182942708334, 94.20652262369792, 94.19160970052083, + 93.72833251953126, 92.77242024739583, 94.3226318359375, 94.38671875000001, + 93.60085042317709, 93.44962565104166, 94.21506754557292, 94.22308349609374, + 93.59678141276042, 93.42622884114583, 93.43410237630208, 93.39552815755209, + 93.17846679687501, 93.80499267578125 + ], + [ + 13.865091959635416, 13.38897705078125, 17.3297119140625, 13.592671712239586, + 14.480000813802082, 18.27105712890625, 0.0, 16.237691243489586, 21.075520833333332, + 23.360636393229168, 15.527404785156252, 15.99617513020833, 17.383341471354164, + 15.21820068359375, 19.328470865885418, 17.740458170572918, 16.274251302083336, + 15.158711751302082, 23.368591308593754, 21.736551920572918, 18.845621744791668, + 17.64361572265625, 19.869913736979168, 21.38134765625, 20.744913736979164, + 20.99957275390625, 20.796000162760414, 18.9688720703125, 94.87418619791666, + 95.74727376302083, 94.65565999348958, 94.83955891927084, 95.47784423828124, + 94.75217692057291, 95.02551269531249, 94.63393147786458, 95.26922607421875, + 95.08465576171876, 94.70688883463542, 94.50994873046875, 94.2401123046875, + 94.19268798828126, 93.8880615234375, 92.84474690755206, 94.31760660807291, + 94.32928466796876, 93.59098307291667, 93.55963134765624, 94.1297607421875, + 94.08520507812499, 93.69555664062499, 93.58880615234375, 93.55900065104166, + 93.57666015625, 93.21632893880208, 93.80745442708333 + ], + [ + 16.432210286458336, 14.978352864583336, 13.08819580078125, 21.21630859375, + 18.374877929687504, 14.816731770833334, 16.237691243489586, 0.0, 24.660746256510418, + 21.091206868489582, 18.167683919270836, 18.84771728515625, 18.575052897135418, + 19.504313151041668, 19.605305989583336, 20.04150390625, 16.906026204427086, + 16.4783935546875, 22.765909830729168, 22.38358561197917, 16.543924967447918, + 14.885172526041666, 20.480041503906246, 18.371968587239586, 23.857482910156254, + 22.419352213541664, 20.229573567708332, 20.065531412760418, 94.76357014973959, + 95.58119710286459, 94.5611572265625, 94.67429606119792, 95.35603841145834, + 94.68172200520833, 94.91021728515625, 94.49344889322917, 95.16971842447916, + 94.96354166666669, 94.53104654947917, 94.40869140625, 94.05885823567709, 94.03369140625, + 93.67417399088542, 92.66516113281249, 94.15523274739584, 94.1231689453125, + 93.45188395182291, 93.28792317708333, 93.96962483723958, 93.93206787109374, + 93.50095621744791, 93.42574055989584, 93.38051350911459, 93.40757242838541, + 93.05338541666667, 93.64621988932291 + ], + [ + 18.86505126953125, 19.92462158203125, 25.8746337890625, 23.12396240234375, + 16.00677490234375, 18.699239095052082, 21.075520833333332, 24.660746256510418, 0.0, + 17.240315755208332, 17.56292724609375, 16.272257486979164, 25.154744466145832, + 24.019266764322918, 20.61676025390625, 19.83343505859375, 22.970703125, 23.02252197265625, + 19.80364990234375, 17.675150553385414, 23.853841145833332, 22.281392415364582, + 25.413777669270836, 27.4002685546875, 20.160481770833332, 22.157816569010418, + 23.221211751302086, 22.40653483072917, 94.47855631510417, 95.35856119791667, + 94.07423909505206, 94.27559407552083, 95.18646240234375, 94.45542399088542, + 94.50577799479166, 94.13417561848959, 95.09210205078126, 94.96913655598958, + 94.37375895182291, 94.20233154296874, 93.91031901041667, 93.85544840494791, + 93.42403157552086, 92.39711507161459, 94.01332600911458, 94.09206136067709, + 93.24308268229167, 93.14739990234375, 93.99430338541667, 93.90848795572916, + 93.2200927734375, 93.10854085286459, 93.03666178385416, 93.00728352864583, + 92.86875406901042, 93.55135091145836 + ], + [ + 20.33135986328125, 18.416524251302082, 24.989217122395832, 29.066019694010414, + 18.78057861328125, 15.822489420572918, 23.360636393229168, 21.091206868489582, + 17.240315755208332, 0.0, 20.724589029947914, 19.221842447916668, 23.149169921874996, + 28.304951985677086, 19.93206787109375, 17.444681803385414, 19.9749755859375, + 21.972310384114582, 16.225362141927082, 18.346089680989582, 17.81494140625, + 18.335835774739586, 26.1182861328125, 23.308024088541668, 21.655883789062496, + 20.456197102864582, 20.195170084635414, 22.3101806640625, 94.6219482421875, + 95.47041829427083, 94.18194580078124, 94.38875325520833, 95.31960042317709, + 94.60801188151042, 94.66845703125001, 94.32586669921875, 95.21437581380209, + 95.10764567057292, 94.50657145182294, 94.42645263671875, 94.0771484375, 93.96596272786458, + 93.56172688802084, 92.49281819661459, 94.18174235026042, 94.22304280598958, + 93.3829345703125, 93.26153564453125, 94.1060791015625, 94.037109375, 93.38525390625, + 93.25913492838541, 93.16357421875, 93.12186686197916, 93.04962158203126, 93.62048339843751 + ], + [ + 16.555216471354168, 16.034464518229168, 19.30072021484375, 18.736328125, + 16.196248372395832, 16.511881510416668, 15.527404785156252, 18.167683919270836, + 17.56292724609375, 20.724589029947914, 0.0, 10.572448730468752, 18.645121256510414, + 15.210408528645834, 15.569986979166666, 15.716796875, 16.247701009114586, + 14.883219401041666, 18.236328125, 15.052368164062498, 17.936421712239586, + 15.709676106770832, 16.70184326171875, 20.77154541015625, 16.343851725260418, + 17.368082682291664, 17.906819661458332, 16.419087727864586, 94.33367919921875, + 95.16473388671874, 94.02555338541667, 94.22674560546875, 94.9737548828125, + 94.20796712239584, 94.46730550130209, 94.05293782552083, 94.83247884114581, + 94.63468424479167, 94.15388997395834, 93.97819010416666, 93.74318440755209, + 93.66528320312499, 93.25136311848959, 92.29597981770833, 93.8187255859375, 93.8427734375, + 93.11741129557291, 92.99580891927083, 93.66257731119792, 93.63714599609374, + 93.13214111328125, 93.03816731770831, 93.05206298828126, 93.03774007161458, + 92.71858723958334, 93.30653889973959 + ], + [ + 16.902445475260414, 16.565572102864586, 18.746826171875, 18.894063313802082, + 14.127095540364584, 16.495463053385414, 15.99617513020833, 18.84771728515625, + 16.272257486979164, 19.221842447916668, 10.572448730468752, 0.0, 16.145426432291664, + 16.943990071614582, 16.36724853515625, 15.545267740885414, 15.462361653645834, + 16.213358561197914, 16.939432779947918, 14.933573404947918, 17.308919270833332, + 15.816874186197918, 16.5914306640625, 20.373819986979168, 15.280965169270834, + 18.269795735677082, 16.038960774739582, 16.411702473958336, 94.52482096354166, + 95.43229166666667, 94.29201253255208, 94.48579915364583, 95.22751871744792, + 94.46449788411459, 94.69828287760419, 94.22959391276041, 95.03021240234375, + 94.87424723307292, 94.33929443359375, 94.24200439453125, 93.98905436197916, + 93.93267822265626, 93.49409993489583, 92.54933675130209, 94.07716878255208, + 94.10337320963542, 93.31722005208334, 93.23284912109375, 93.88179524739584, + 93.86796061197916, 93.39147949218749, 93.29290771484375, 93.25004069010416, + 93.2972412109375, 92.89211018880208, 93.56457519531249 + ], + [ + 18.801005045572918, 17.166239420572918, 16.895304361979168, 20.17364501953125, + 18.96710205078125, 17.683329264322914, 17.383341471354164, 18.575052897135418, + 25.154744466145832, 23.149169921874996, 18.645121256510414, 16.145426432291664, 0.0, + 16.77996826171875, 22.53338623046875, 20.93963623046875, 13.147013346354168, + 15.410013834635416, 22.00372314453125, 24.283345540364582, 17.824625651041664, + 17.404439290364586, 17.391764322916668, 17.027140299479164, 22.49495442708333, + 23.225931803385414, 15.466532389322916, 17.511922200520832, 93.99003092447916, + 94.85750325520833, 93.72930908203125, 93.95418294270833, 94.55006917317708, + 93.77239990234376, 94.2244873046875, 93.77968343098959, 94.31679280598958, + 94.13531494140626, 93.65118408203125, 93.61647542317709, 93.32222493489584, + 93.25087483723958, 92.94474283854167, 91.94309488932291, 93.37497965494792, + 93.40098063151042, 92.69954427083333, 92.56235758463542, 93.112060546875, + 93.0968017578125, 92.93733723958334, 92.79665120442708, 92.85668945312501, + 92.87923177083334, 92.26023356119792, 92.85367838541667 + ], + [ + 18.338948567708336, 18.903564453125, 18.001647949218754, 14.911661783854168, + 18.268229166666664, 21.661946614583336, 15.21820068359375, 19.504313151041668, + 24.019266764322918, 28.304951985677086, 15.210408528645834, 16.943990071614582, + 16.77996826171875, 0.0, 21.046671549479168, 22.347900390625, 17.36187744140625, + 15.375000000000002, 27.376302083333332, 23.922403971354164, 22.01312255859375, + 19.098958333333336, 15.39536539713542, 20.546407063802086, 21.69899495442708, + 23.2156982421875, 20.513305664062496, 17.834574381510418, 94.18654378255208, + 95.09438069661456, 94.10567220052083, 94.31557210286459, 94.82137044270834, + 94.06591796875, 94.51039632161458, 94.06901041666667, 94.57137044270833, + 94.37089029947919, 94.000244140625, 93.88240559895833, 93.55067952473959, + 93.52705891927083, 93.22532145182292, 92.25516764322916, 93.63956705729166, + 93.62186686197917, 92.89605712890624, 92.84077962239584, 93.35569254557292, + 93.34438069661458, 93.17124430338544, 93.04073079427083, 93.16623942057292, + 93.14577229817709, 92.49552408854167, 93.08237711588542 + ], + [ + 18.161458333333332, 18.181437174479168, 21.639790852864582, 24.650594075520832, + 16.980387369791668, 19.06787109375, 19.328470865885418, 19.605305989583336, + 20.61676025390625, 19.93206787109375, 15.569986979166666, 16.36724853515625, + 22.53338623046875, 21.046671549479168, 0.0, 13.129760742187502, 19.286519368489586, + 18.1864013671875, 18.383138020833332, 18.670898437500004, 17.576070149739586, + 13.773396809895834, 23.392476399739586, 21.698954264322914, 16.89788818359375, + 16.623575846354164, 18.61572265625, 16.48248291015625, 94.59653727213542, + 95.46160888671875, 94.34566243489583, 94.51621500651041, 95.24173990885416, + 94.54276529947917, 94.79123942057292, 94.33780924479167, 95.09541829427083, 94.982421875, + 94.46492513020833, 94.31852213541667, 94.00128173828126, 93.99658203125, + 93.63149007161459, 92.56136067708331, 94.15450032552083, 94.1595458984375, + 93.42360432942708, 93.26098632812499, 94.01092529296875, 93.97393798828126, + 93.47247314453125, 93.31376139322917, 93.36985270182291, 93.36159261067709, + 93.01802571614583, 93.65464274088542 + ], + [ + 18.029215494791664, 16.791219075520836, 23.932556152343746, 23.75935872395833, + 17.552408854166668, 18.544392903645836, 17.740458170572918, 20.04150390625, + 19.83343505859375, 17.444681803385414, 15.716796875, 15.545267740885414, + 20.93963623046875, 22.347900390625, 13.129760742187502, 0.0, 15.684468587239584, + 16.488932291666668, 15.282552083333332, 16.357666015625, 13.842997233072916, + 15.0001220703125, 22.195251464843754, 20.123514811197918, 15.810892740885416, + 14.515828450520832, 16.813720703125, 16.929707845052082, 94.42730712890626, + 95.31195068359374, 94.14534505208334, 94.25103759765624, 95.10982259114583, + 94.29451497395833, 94.53538004557292, 94.18216959635417, 94.94291178385416, + 94.74027506510416, 94.26875813802083, 94.15047200520833, 93.80230712890626, + 93.79622395833333, 93.44203694661458, 92.39742024739584, 93.96492513020833, + 94.0174560546875, 93.22662353515626, 93.114990234375, 93.83888753255208, + 93.76352945963542, 93.28489176432292, 93.17643229166667, 93.12123616536458, + 93.08266194661458, 92.8416748046875, 93.45611572265625 + ], + [ + 17.43585205078125, 15.879862467447914, 18.189208984374996, 19.972839355468746, + 19.037007649739582, 17.498067220052086, 16.274251302083336, 16.906026204427086, + 22.970703125, 19.9749755859375, 16.247701009114586, 15.462361653645834, + 13.147013346354168, 17.36187744140625, 19.286519368489586, 15.684468587239584, 0.0, + 12.05828857421875, 19.761861165364586, 20.970560709635414, 12.263346354166666, + 13.897440592447918, 16.717244466145836, 14.407674153645834, 19.326253255208332, + 18.004862467447914, 14.69390869140625, 15.784505208333332, 93.77974446614583, + 94.66442871093749, 93.57517496744792, 93.76700846354166, 94.37001546223956, + 93.73557535807292, 93.95373535156251, 93.62396240234375, 94.22963460286459, + 94.05885823567708, 93.63828531901042, 93.45375569661458, 93.17451985677084, + 93.1231892903646, 92.80029296875, 91.74110921223959, 93.25229899088541, 93.24839274088541, + 92.56416829427083, 92.42738850911458, 93.06201171875, 93.043212890625, 92.72696940104167, + 92.56654866536459, 92.59981282552083, 92.57153320312499, 92.17429606119791, + 92.74507649739583 + ], + [ + 15.934326171874998, 15.563761393229168, 17.829121907552086, 19.474405924479168, + 18.921590169270832, 18.015462239583336, 15.158711751302082, 16.4783935546875, + 23.02252197265625, 21.972310384114582, 14.883219401041666, 16.213358561197914, + 15.410013834635416, 15.375000000000002, 18.1864013671875, 16.488932291666668, + 12.05828857421875, 0.0, 20.841064453125, 20.467610677083332, 14.67864990234375, + 13.657877604166666, 17.713846842447914, 15.561625162760413, 19.65350341796875, + 17.959187825520832, 17.052693684895832, 14.763732910156252, 93.41387939453124, + 94.23350016276042, 93.1575927734375, 93.34893798828125, 94.01871744791667, + 93.25911458333334, 93.55267333984375, 93.22025553385417, 93.78479003906251, + 93.62223307291669, 93.21114095052084, 93.08955891927084, 92.79103597005208, + 92.72025553385417, 92.33506266276042, 91.33500162760416, 92.86324055989583, + 92.84513346354167, 92.22515869140625, 92.03035481770834, 92.62778727213542, + 92.62465413411456, 92.26536051432292, 92.1815185546875, 92.15211995442708, + 92.18479410807292, 91.76672363281251, 92.34792073567708 + ], + [ + 21.419881184895832, 19.269490559895832, 26.399271647135414, 29.172648111979164, + 20.83793131510417, 16.336832682291664, 23.368591308593754, 22.765909830729168, + 19.80364990234375, 16.225362141927082, 18.236328125, 16.939432779947918, + 22.00372314453125, 27.376302083333332, 18.383138020833332, 15.282552083333332, + 19.761861165364586, 20.841064453125, 0.0, 13.986735026041664, 18.559102376302082, + 18.912516276041664, 25.567647298177086, 23.779154459635418, 18.69891357421875, + 17.282674153645832, 17.879516601562504, 18.692606608072914, 94.48899332682291, + 95.37843831380209, 94.1180419921875, 94.35479736328125, 95.25101725260416, + 94.45426432291667, 94.60886637369791, 94.24983723958333, 95.06510416666667, + 94.93330891927083, 94.37377929687499, 94.23482259114584, 93.93503824869792, + 93.89123535156251, 93.54400634765625, 92.50427246093749, 94.1314697265625, + 94.10371907552083, 93.29538981119792, 93.24955240885417, 93.98842366536459, + 93.91485595703126, 93.38458251953125, 93.23693847656249, 93.25213623046875, + 93.19187418619792, 92.947021484375, 93.59617106119791 + ], + [ + 20.605834960937504, 19.714599609374996, 25.352600097656246, 25.890624999999996, + 18.786092122395832, 17.562703450520836, 21.736551920572918, 22.38358561197917, + 17.675150553385414, 18.346089680989582, 15.052368164062498, 14.933573404947918, + 24.283345540364582, 23.922403971354164, 18.670898437500004, 16.357666015625, + 20.970560709635414, 20.467610677083332, 13.986735026041664, 0.0, 20.222920735677082, + 19.690470377604168, 21.831685384114582, 24.615824381510418, 16.427958170572918, + 17.667602539062504, 19.4322509765625, 19.23114013671875, 94.19895426432294, + 95.05792236328125, 93.738037109375, 93.97816975911458, 94.84993489583334, + 94.09895833333336, 94.27126057942708, 93.89412434895833, 94.7442626953125, + 94.66845703125001, 94.03812662760416, 93.97049967447917, 93.62314860026044, + 93.57674153645833, 93.14345296223958, 92.11755371093749, 93.76538085937499, + 93.77514648437499, 92.91269938151041, 92.82889811197917, 93.67128499348958, + 93.6004842122396, 93.00661214192706, 92.83955891927083, 92.79042561848956, + 92.77598063151042, 92.59004720052084, 93.26104736328125 + ], + [ + 19.556254069010418, 17.456807454427082, 20.075602213541668, 24.296081542968746, + 20.65777587890625, 18.101338704427086, 18.845621744791668, 16.543924967447918, + 23.853841145833332, 17.81494140625, 17.936421712239586, 17.308919270833332, + 17.824625651041664, 22.01312255859375, 17.576070149739586, 13.842997233072916, + 12.263346354166666, 14.67864990234375, 18.559102376302082, 20.222920735677082, 0.0, + 11.903666178385416, 19.220784505208332, 14.4884033203125, 19.554036458333336, + 16.99639892578125, 15.080301920572916, 17.246134440104168, 93.91182454427083, + 94.76757812499999, 93.72475179036458, 93.86722819010417, 94.58990478515625, + 93.86777750651041, 94.07474772135417, 93.75665283203125, 94.38763427734375, + 94.16839599609375, 93.79042561848958, 93.63559977213541, 93.28605143229166, + 93.26690673828125, 92.92537434895834, 91.90419514973959, 93.44691975911458, + 93.43768310546875, 92.74064127604167, 92.56382242838541, 93.27425130208333, + 93.20353190104167, 92.83479817708334, 92.69122314453125, 92.75948079427084, + 92.7406005859375, 92.36907958984375, 92.97810872395833 + ], + [ + 17.234781901041668, 16.742024739583332, 17.844217936197918, 22.316569010416668, + 18.451904296875, 17.351643880208336, 17.64361572265625, 14.885172526041666, + 22.281392415364582, 18.335835774739586, 15.709676106770832, 15.816874186197918, + 17.404439290364586, 19.098958333333336, 13.773396809895834, 15.0001220703125, + 13.897440592447918, 13.657877604166666, 18.912516276041664, 19.690470377604168, + 11.903666178385416, 0.0, 19.061055501302082, 15.789774576822916, 18.136332194010418, + 16.5096435546875, 15.293009440104168, 14.842875162760416, 93.80889892578126, + 94.65802001953124, 93.53499348958333, 93.70741780598956, 94.445556640625, + 93.75496419270833, 93.97686767578125, 93.58321126302083, 94.29972330729167, + 94.128662109375, 93.642578125, 93.53080240885417, 93.17873128255208, 93.15612792968749, + 92.72165934244792, 91.81473795572917, 93.28120930989583, 93.30310058593749, + 92.60955810546875, 92.4456787109375, 93.12990315755208, 93.05649820963542, + 92.63360595703125, 92.53560384114584, 92.58571370442709, 92.56060791015626, + 92.20857747395833, 92.81760660807292 + ], + [ + 22.228006998697914, 21.795308430989586, 20.01318359375, 20.299784342447914, + 21.650492350260418, 21.293233235677082, 19.869913736979168, 20.480041503906246, + 25.413777669270836, 26.1182861328125, 16.70184326171875, 16.5914306640625, + 17.391764322916668, 15.39536539713542, 23.392476399739586, 22.195251464843754, + 16.717244466145836, 17.713846842447914, 25.567647298177086, 21.831685384114582, + 19.220784505208332, 19.061055501302082, 0.0, 15.552449544270834, 20.668212890625, + 22.41107177734375, 16.456685384114582, 18.290974934895832, 92.86149088541667, + 93.74296061197917, 92.68760172526042, 92.840087890625, 93.42653401692709, + 92.81138102213542, 93.06514485677083, 92.66164143880208, 93.27866617838541, + 93.10113525390625, 92.68056233723959, 92.53981526692708, 92.32063802083334, + 92.29136149088542, 92.00789388020833, 91.01300048828126, 92.3852335611979, + 92.40976969401042, 91.75439453125001, 91.61317952473958, 92.19978841145834, + 92.189697265625, 91.89717610677081, 91.74766031901042, 91.82649739583334, + 91.84195963541669, 91.36606852213541, 91.89396158854167 + ], + [ + 21.51043701171875, 20.01434326171875, 20.5010986328125, 24.76861572265625, + 23.67596435546875, 21.127827962239586, 21.38134765625, 18.371968587239586, + 27.4002685546875, 23.308024088541668, 20.77154541015625, 20.373819986979168, + 17.027140299479164, 20.546407063802086, 21.698954264322914, 20.123514811197918, + 14.407674153645834, 15.561625162760413, 23.779154459635418, 24.615824381510418, + 14.4884033203125, 15.789774576822916, 15.552449544270834, 0.0, 22.580322265625, + 19.965596516927082, 15.95237223307292, 16.497233072916668, 92.88728841145834, + 93.8209228515625, 92.65423583984374, 92.94136555989584, 93.51861572265625, + 92.73704020182292, 93.08939615885416, 92.78163655598959, 93.32004801432292, + 93.11419677734375, 92.68259684244791, 92.61248779296876, 92.32332356770831, + 92.35260009765625, 92.0574951171875, 91.01654052734376, 92.46970621744792, + 92.44732666015625, 91.77335611979167, 91.66982014973958, 92.20914713541667, + 92.15694173177084, 91.91288248697914, 91.78407796223959, 91.83260091145834, + 91.88586425781251, 91.36037190755208, 91.99336751302086 + ], + [ + 21.246114095052082, 21.42645263671875, 25.257934570312504, 23.686299641927082, + 18.761250813802082, 22.029195149739582, 20.744913736979164, 23.857482910156254, + 20.160481770833332, 21.655883789062496, 16.343851725260418, 15.280965169270834, + 22.49495442708333, 21.69899495442708, 16.89788818359375, 15.810892740885416, + 19.326253255208332, 19.65350341796875, 18.69891357421875, 16.427958170572918, + 19.554036458333336, 18.136332194010418, 20.668212890625, 22.580322265625, 0.0, + 12.985941569010416, 15.617370605468748, 14.925699869791666, 93.28328450520833, + 94.1910400390625, 92.94260660807291, 93.17960611979167, 94.00510660807292, + 93.26320393880209, 93.431884765625, 93.04307047526044, 93.89593505859374, + 93.70086669921875, 93.19476318359375, 93.08017985026042, 92.78560384114584, + 92.80006917317708, 92.34842936197916, 91.33925374348959, 92.97340901692709, + 92.95253499348958, 92.21903483072916, 92.10398356119792, 92.90173339843753, + 92.83223470052083, 92.16560872395833, 92.08640543619794, 92.0472412109375, + 92.05989583333333, 91.86700439453125, 92.51920572916667 + ], + [ + 21.053670247395836, 19.749837239583332, 25.979227701822918, 26.085164388020832, + 21.0076904296875, 21.001627604166664, 20.99957275390625, 22.419352213541664, + 22.157816569010418, 20.456197102864582, 17.368082682291664, 18.269795735677082, + 23.225931803385414, 23.2156982421875, 16.623575846354164, 14.515828450520832, + 18.004862467447914, 17.959187825520832, 17.282674153645832, 17.667602539062504, + 16.99639892578125, 16.5096435546875, 22.41107177734375, 19.965596516927082, + 12.985941569010416, 0.0, 17.058512369791664, 14.814066569010416, 93.36277262369792, + 94.27081298828125, 93.06062825520834, 93.28163655598959, 94.13944498697917, + 93.40539550781249, 93.49790445963542, 93.11234537760417, 93.989501953125, 93.823974609375, + 93.29117838541667, 93.25134277343749, 92.94952392578125, 92.9307861328125, + 92.45709228515626, 91.44209798177083, 93.06856282552084, 93.06538899739583, + 92.30385335286459, 92.22176106770834, 93.02280680338542, 92.94724527994791, + 92.32899983723959, 92.21012369791666, 92.18963623046875, 92.18638102213541, + 91.93672688802083, 92.59242757161459 + ], + [ + 20.784505208333336, 20.335449218749996, 21.15093994140625, 24.2203369140625, + 20.833089192708332, 19.320638020833336, 20.796000162760414, 20.229573567708332, + 23.221211751302086, 20.195170084635414, 17.906819661458332, 16.038960774739582, + 15.466532389322916, 20.513305664062496, 18.61572265625, 16.813720703125, + 14.69390869140625, 17.052693684895832, 17.879516601562504, 19.4322509765625, + 15.080301920572916, 15.293009440104168, 16.456685384114582, 15.95237223307292, + 15.617370605468748, 17.058512369791664, 0.0, 12.74566650390625, 92.53912353515624, + 93.41082763671875, 92.23347981770833, 92.41351318359375, 93.18599446614583, + 92.51224772135416, 92.71364339192708, 92.26143391927083, 93.04882812500001, + 92.85449218750001, 92.38977050781249, 92.262939453125, 92.01987711588542, + 91.97688802083334, 91.62526448567708, 90.63566080729167, 92.14790852864584, + 92.13659667968751, 91.44390869140624, 91.26883951822917, 91.96820068359375, + 91.94960530598959, 91.46535237630209, 91.39583333333333, 91.34320068359375, + 91.30914306640625, 91.02083333333334, 91.60675048828125 + ], + [ + 19.583353678385418, 18.74859619140625, 20.975301106770836, 22.833964029947918, + 19.553487141927082, 20.55194091796875, 18.9688720703125, 20.065531412760418, + 22.40653483072917, 22.3101806640625, 16.419087727864586, 16.411702473958336, + 17.511922200520832, 17.834574381510418, 16.48248291015625, 16.929707845052082, + 15.784505208333332, 14.763732910156252, 18.692606608072914, 19.23114013671875, + 17.246134440104168, 14.842875162760416, 18.290974934895832, 16.497233072916668, + 14.925699869791666, 14.814066569010416, 12.74566650390625, 0.0, 92.65079752604167, + 93.49552408854167, 92.32582600911458, 92.52022298177083, 93.30055745442708, + 92.57619222005208, 92.76359049479167, 92.38820393880208, 93.09938557942708, + 92.98390706380208, 92.43784586588541, 92.37013753255206, 92.09346516927083, + 92.06178792317708, 91.73933919270834, 90.67201741536458, 92.19826253255208, + 92.20798746744792, 91.48502604166666, 91.28188069661458, 92.07722981770833, + 92.025146484375, 91.5174560546875, 91.41033935546875, 91.40108235677083, + 91.38891601562501, 91.12424723307294, 91.70467122395834 + ], + [ + 94.44472249348958, 94.86838785807292, 94.79313151041667, 94.77158610026044, + 94.78835042317709, 94.87738037109375, 94.87418619791666, 94.76357014973959, + 94.47855631510417, 94.6219482421875, 94.33367919921875, 94.52482096354166, + 93.99003092447916, 94.18654378255208, 94.59653727213542, 94.42730712890626, + 93.77974446614583, 93.41387939453124, 94.48899332682291, 94.19895426432294, + 93.91182454427083, 93.80889892578126, 92.86149088541667, 92.88728841145834, + 93.28328450520833, 93.36277262369792, 92.53912353515624, 92.65079752604167, 0.0, + 11.7171630859375, 18.124247233072914, 16.146728515625, 15.48663330078125, + 13.60308837890625, 15.539876302083332, 13.64556884765625, 17.650370279947914, + 20.030212402343754, 16.431864420572918, 21.799458821614586, 19.514119466145832, + 18.254414876302086, 18.002929687500004, 17.000467936197918, 18.813578287760418, + 18.364400227864586, 15.982503255208334, 15.944559733072918, 19.90478515625, + 22.076741536458332, 20.753173828125, 19.80474853515625, 23.071695963541668, + 20.155843098958332, 22.678812662760418, 22.610636393229168 + ], + [ + 95.28102620442708, 95.75356038411458, 95.69958496093751, 95.57720947265626, + 95.61765543619791, 95.70078531901042, 95.74727376302083, 95.58119710286459, + 95.35856119791667, 95.47041829427083, 95.16473388671874, 95.43229166666667, + 94.85750325520833, 95.09438069661456, 95.46160888671875, 95.31195068359374, + 94.66442871093749, 94.23350016276042, 95.37843831380209, 95.05792236328125, + 94.76757812499999, 94.65802001953124, 93.74296061197917, 93.8209228515625, + 94.1910400390625, 94.27081298828125, 93.41082763671875, 93.49552408854167, + 11.7171630859375, 0.0, 16.968404134114582, 14.097900390625, 13.53802490234375, + 13.824727376302086, 15.163370768229168, 13.75221761067708, 18.12579345703125, + 21.063822428385414, 14.434427897135418, 19.91998291015625, 17.928466796875, + 15.861592610677084, 17.5390625, 18.274149576822918, 19.639017740885414, 17.15936279296875, + 15.49462890625, 14.519673665364584, 20.117594401041668, 21.901896158854164, + 18.928629557291668, 18.134175618489582, 21.795328776041668, 20.250691731770836, + 22.53460693359375, 22.3251953125 + ], + [ + 94.16617838541667, 94.584716796875, 94.64837646484375, 94.69384765625, 94.47705078125001, + 94.52144368489583, 94.65565999348958, 94.5611572265625, 94.07423909505206, + 94.18194580078124, 94.02555338541667, 94.29201253255208, 93.72930908203125, + 94.10567220052083, 94.34566243489583, 94.14534505208334, 93.57517496744792, + 93.1575927734375, 94.1180419921875, 93.738037109375, 93.72475179036458, 93.53499348958333, + 92.68760172526042, 92.65423583984374, 92.94260660807291, 93.06062825520834, + 92.23347981770833, 92.32582600911458, 18.124247233072914, 16.968404134114582, 0.0, + 14.83465576171875, 16.5675048828125, 17.652099609375, 14.920715332031252, + 14.266194661458334, 24.409749348958336, 26.12691243489583, 23.469441731770832, + 19.3740234375, 18.215026855468746, 17.787027994791668, 15.192118326822918, + 17.416341145833332, 22.833658854166668, 22.088338216145832, 17.106180826822914, + 18.987386067708332, 27.870992024739586, 26.563822428385414, 18.98089599609375, + 17.676798502604164, 19.71099853515625, 19.83807373046875, 22.407389322916668, + 25.263488769531254 + ], + [ + 94.30828857421875, 94.73227945963541, 94.85892740885417, 94.90948486328125, + 94.62795003255208, 94.64975992838542, 94.83955891927084, 94.67429606119792, + 94.27559407552083, 94.38875325520833, 94.22674560546875, 94.48579915364583, + 93.95418294270833, 94.31557210286459, 94.51621500651041, 94.25103759765624, + 93.76700846354166, 93.34893798828125, 94.35479736328125, 93.97816975911458, + 93.86722819010417, 93.70741780598956, 92.840087890625, 92.94136555989584, + 93.17960611979167, 93.28163655598959, 92.41351318359375, 92.52022298177083, + 16.146728515625, 14.097900390625, 14.83465576171875, 0.0, 18.874125162760418, + 18.844177246093754, 14.970621744791668, 14.889343261718752, 24.238830566406246, + 25.477762858072918, 19.438944498697914, 25.27158610026042, 21.169718424479168, + 20.341166178385414, 18.145060221354164, 18.243794759114582, 24.350240071614586, + 22.408996582031254, 15.670572916666666, 15.45440673828125, 25.853556315104168, + 26.899454752604168, 21.567586263020836, 20.048604329427086, 22.229451497395832, + 19.673909505208336, 25.361877441406246, 25.0765380859375 + ], + [ + 95.12670898437501, 95.52347819010417, 95.36285400390624, 95.22155761718751, + 95.41271972656251, 95.51383463541667, 95.47784423828124, 95.35603841145834, + 95.18646240234375, 95.31960042317709, 94.9737548828125, 95.22751871744792, + 94.55006917317708, 94.82137044270834, 95.24173990885416, 95.10982259114583, + 94.37001546223956, 94.01871744791667, 95.25101725260416, 94.84993489583334, + 94.58990478515625, 94.445556640625, 93.42653401692709, 93.51861572265625, + 94.00510660807292, 94.13944498697917, 93.18599446614583, 93.30055745442708, + 15.48663330078125, 13.53802490234375, 16.5675048828125, 18.874125162760418, 0.0, + 10.266886393229166, 15.668233235677082, 15.024739583333332, 16.867024739583336, + 17.6138916015625, 15.2103271484375, 13.193603515624998, 13.407124837239582, + 12.331949869791666, 16.772481282552082, 17.180257161458336, 15.917887369791668, + 15.5726318359375, 15.909281412760418, 17.047566731770836, 19.675557454427082, + 18.275980631510414, 17.600199381510418, 17.3551025390625, 19.765726725260418, + 19.797017415364582, 19.055013020833336, 20.28155517578125 + ], + [ + 94.36861165364583, 94.77258300781249, 94.65948486328125, 94.54581705729167, + 94.63069661458333, 94.78470865885416, 94.75217692057291, 94.68172200520833, + 94.45542399088542, 94.60801188151042, 94.20796712239584, 94.46449788411459, + 93.77239990234376, 94.06591796875, 94.54276529947917, 94.29451497395833, + 93.73557535807292, 93.25911458333334, 94.45426432291667, 94.09895833333336, + 93.86777750651041, 93.75496419270833, 92.81138102213542, 92.73704020182292, + 93.26320393880209, 93.40539550781249, 92.51224772135416, 92.57619222005208, + 13.60308837890625, 13.824727376302086, 17.652099609375, 18.844177246093754, + 10.266886393229166, 0.0, 14.982198079427084, 13.557535807291666, 16.665079752604164, + 17.628173828125, 15.449137369791668, 14.641886393229164, 14.918680826822916, + 14.055948893229166, 16.969340006510414, 15.1634521484375, 15.884236653645832, + 16.209513346354164, 16.164082845052082, 16.272705078125, 19.46270751953125, + 18.486836751302082, 18.473531087239582, 18.130615234375, 20.263773600260418, + 20.17559814453125, 19.737589518229168, 20.620463053385414 + ], + [ + 94.56561279296876, 94.93585205078125, 94.98148600260416, 94.89495849609375, + 94.83034261067709, 94.88718668619792, 95.02551269531249, 94.91021728515625, + 94.50577799479166, 94.66845703125001, 94.46730550130209, 94.69828287760419, + 94.2244873046875, 94.51039632161458, 94.79123942057292, 94.53538004557292, + 93.95373535156251, 93.55267333984375, 94.60886637369791, 94.27126057942708, + 94.07474772135417, 93.97686767578125, 93.06514485677083, 93.08939615885416, + 93.431884765625, 93.49790445963542, 92.71364339192708, 92.76359049479167, + 15.539876302083332, 15.163370768229168, 14.920715332031252, 14.970621744791668, + 15.668233235677082, 14.982198079427084, 0.0, 12.25164794921875, 20.86785888671875, + 21.341817220052082, 19.313822428385414, 19.410380045572914, 16.885294596354164, + 17.688456217447914, 13.522542317708334, 16.376444498697918, 17.95599365234375, + 19.479838053385414, 15.17822265625, 17.065653483072914, 24.717325846354168, + 22.633585611979168, 20.075927734375, 18.685282389322918, 18.135579427083332, + 19.2568359375, 22.25177001953125, 22.316691080729164 + ], + [ + 94.11405436197916, 94.59973144531253, 94.64699300130208, 94.53670247395833, + 94.47806803385417, 94.49519856770831, 94.63393147786458, 94.49344889322917, + 94.13417561848959, 94.32586669921875, 94.05293782552083, 94.22959391276041, + 93.77968343098959, 94.06901041666667, 94.33780924479167, 94.18216959635417, + 93.62396240234375, 93.22025553385417, 94.24983723958333, 93.89412434895833, + 93.75665283203125, 93.58321126302083, 92.66164143880208, 92.78163655598959, + 93.04307047526044, 93.11234537760417, 92.26143391927083, 92.38820393880208, + 13.64556884765625, 13.75221761067708, 14.266194661458334, 14.889343261718752, + 15.024739583333332, 13.557535807291666, 12.25164794921875, 0.0, 20.458618164062496, + 22.856201171875, 18.135172526041668, 20.558430989583336, 18.088724772135414, 16.71484375, + 14.862894694010416, 14.865275065104168, 18.318562825520832, 18.338216145833336, + 15.95611572265625, 15.052775065104168, 22.773783365885418, 23.600199381510418, + 18.695943196614582, 17.896199544270836, 19.742899576822914, 19.043558756510418, + 22.732055664062504, 23.244527180989582 + ], + [ + 94.90852864583333, 95.3734130859375, 95.16864013671875, 94.91931152343751, + 95.27803548177083, 95.38297526041667, 95.26922607421875, 95.16971842447916, + 95.09210205078126, 95.21437581380209, 94.83247884114581, 95.03021240234375, + 94.31679280598958, 94.57137044270833, 95.09541829427083, 94.94291178385416, + 94.22963460286459, 93.78479003906251, 95.06510416666667, 94.7442626953125, + 94.38763427734375, 94.29972330729167, 93.27866617838541, 93.32004801432292, + 93.89593505859374, 93.989501953125, 93.04882812500001, 93.09938557942708, + 17.650370279947914, 18.12579345703125, 24.409749348958336, 24.238830566406246, + 16.867024739583336, 16.665079752604164, 20.86785888671875, 20.458618164062496, 0.0, + 13.209513346354168, 15.0872802734375, 19.239379882812504, 17.96124267578125, + 17.688883463541668, 22.42913818359375, 23.701171875, 15.493326822916666, + 13.407511393229168, 17.99603271484375, 19.565999348958332, 16.356384277343754, + 16.459004720052086, 22.032694498697918, 20.475789388020836, 24.31976318359375, + 22.799458821614586, 18.057779947916664, 18.14593505859375 + ], + [ + 94.75211588541667, 95.18953450520834, 94.91200764973959, 94.7156982421875, + 95.07149251302083, 95.19169108072917, 95.08465576171876, 94.96354166666669, + 94.96913655598958, 95.10764567057292, 94.63468424479167, 94.87424723307292, + 94.13531494140626, 94.37089029947919, 94.982421875, 94.74027506510416, 94.05885823567708, + 93.62223307291669, 94.93330891927083, 94.66845703125001, 94.16839599609375, + 94.128662109375, 93.10113525390625, 93.11419677734375, 93.70086669921875, 93.823974609375, + 92.85449218750001, 92.98390706380208, 20.030212402343754, 21.063822428385414, + 26.12691243489583, 25.477762858072918, 17.6138916015625, 17.628173828125, + 21.341817220052082, 22.856201171875, 13.209513346354168, 0.0, 16.6156005859375, + 19.010294596354164, 16.777364095052082, 19.14794921875, 23.868672688802086, + 22.8248291015625, 16.197347005208332, 15.600504557291668, 19.92449951171875, + 22.634928385416668, 20.865743001302086, 13.113993326822916, 22.620463053385418, + 23.364583333333332, 23.82122802734375, 22.44683837890625, 18.829833984375004, + 16.82635498046875 + ], + [ + 94.24149576822917, 94.71634928385417, 94.55690511067708, 94.35697428385416, + 94.57303873697917, 94.6611328125, 94.70688883463542, 94.53104654947917, 94.37375895182291, + 94.50657145182294, 94.15388997395834, 94.33929443359375, 93.65118408203125, + 94.000244140625, 94.46492513020833, 94.26875813802083, 93.63828531901042, + 93.21114095052084, 94.37377929687499, 94.03812662760416, 93.79042561848958, 93.642578125, + 92.68056233723959, 92.68259684244791, 93.19476318359375, 93.29117838541667, + 92.38977050781249, 92.43784586588541, 16.431864420572918, 14.434427897135418, + 23.469441731770832, 19.438944498697914, 15.2103271484375, 15.449137369791668, + 19.313822428385414, 18.135172526041668, 15.0872802734375, 16.6156005859375, 0.0, + 18.548502604166668, 18.251241048177082, 16.994140625000004, 21.657938639322918, + 21.662434895833332, 17.605183919270832, 15.525187174479168, 17.25897216796875, + 15.838297526041668, 16.06341552734375, 18.495096842447918, 20.943868001302086, + 19.924031575520836, 23.379781087239582, 21.296773274739582, 20.567708333333336, + 20.123026529947914 + ], + [ + 94.1085205078125, 94.55558268229167, 94.41737874348958, 94.22635904947917, + 94.43937174479167, 94.54182942708334, 94.50994873046875, 94.40869140625, + 94.20233154296874, 94.42645263671875, 93.97819010416666, 94.24200439453125, + 93.61647542317709, 93.88240559895833, 94.31852213541667, 94.15047200520833, + 93.45375569661458, 93.08955891927084, 94.23482259114584, 93.97049967447917, + 93.63559977213541, 93.53080240885417, 92.53981526692708, 92.61248779296876, + 93.08017985026042, 93.25134277343749, 92.262939453125, 92.37013753255206, + 21.799458821614586, 19.91998291015625, 19.3740234375, 25.27158610026042, + 13.193603515624998, 14.641886393229164, 19.410380045572914, 20.558430989583336, + 19.239379882812504, 19.010294596354164, 18.548502604166668, 0.0, 14.38800048828125, + 14.582112630208332, 19.977274576822914, 22.14599609375, 17.8834228515625, + 18.085896809895832, 19.384134928385414, 21.8304443359375, 23.091044108072914, + 19.407694498697918, 20.137837727864582, 20.00390625, 20.948465983072914, + 23.00823974609375, 18.931844075520832, 21.641133626302086 + ], + [ + 93.74505615234374, 94.25815836588542, 94.1212158203125, 93.93019612630208, + 94.13795979817708, 94.20652262369792, 94.2401123046875, 94.05885823567709, + 93.91031901041667, 94.0771484375, 93.74318440755209, 93.98905436197916, 93.32222493489584, + 93.55067952473959, 94.00128173828126, 93.80230712890626, 93.17451985677084, + 92.79103597005208, 93.93503824869792, 93.62314860026044, 93.28605143229166, + 93.17873128255208, 92.32063802083334, 92.32332356770831, 92.78560384114584, + 92.94952392578125, 92.01987711588542, 92.09346516927083, 19.514119466145832, + 17.928466796875, 18.215026855468746, 21.169718424479168, 13.407124837239582, + 14.918680826822916, 16.885294596354164, 18.088724772135414, 17.96124267578125, + 16.777364095052082, 18.251241048177082, 14.38800048828125, 0.0, 10.51861572265625, + 16.225667317708332, 17.26861572265625, 13.631368001302084, 13.468526204427084, + 14.405924479166668, 17.656473795572914, 21.075154622395836, 15.926432291666666, + 14.9322509765625, 15.63397216796875, 16.222452799479164, 17.404378255208336, + 15.391988118489582, 16.166666666666664 + ], + [ + 93.78169759114583, 94.1888427734375, 94.06272379557292, 93.8572998046875, + 94.08565266927084, 94.19160970052083, 94.19268798828126, 94.03369140625, + 93.85544840494791, 93.96596272786458, 93.66528320312499, 93.93267822265626, + 93.25087483723958, 93.52705891927083, 93.99658203125, 93.79622395833333, 93.1231892903646, + 92.72025553385417, 93.89123535156251, 93.57674153645833, 93.26690673828125, + 93.15612792968749, 92.29136149088542, 92.35260009765625, 92.80006917317708, + 92.9307861328125, 91.97688802083334, 92.06178792317708, 18.254414876302086, + 15.861592610677084, 17.787027994791668, 20.341166178385414, 12.331949869791666, + 14.055948893229166, 17.688456217447914, 16.71484375, 17.688883463541668, 19.14794921875, + 16.994140625000004, 14.582112630208332, 10.51861572265625, 0.0, 16.15362548828125, + 17.577718098958332, 14.190958658854166, 13.346761067708334, 14.392639160156248, + 15.431803385416668, 18.79030354817708, 17.775410970052086, 14.322855631510418, 14.3203125, + 17.150004069010418, 17.726826985677082, 15.663777669270834, 17.947733561197918 + ], + [ + 93.38283284505208, 93.82082112630208, 93.76053873697917, 93.60809326171875, + 93.67287190755208, 93.72833251953126, 93.8880615234375, 93.67417399088542, + 93.42403157552086, 93.56172688802084, 93.25136311848959, 93.49409993489583, + 92.94474283854167, 93.22532145182292, 93.63149007161459, 93.44203694661458, + 92.80029296875, 92.33506266276042, 93.54400634765625, 93.14345296223958, + 92.92537434895834, 92.72165934244792, 92.00789388020833, 92.0574951171875, + 92.34842936197916, 92.45709228515626, 91.62526448567708, 91.73933919270834, + 18.002929687500004, 17.5390625, 15.192118326822918, 18.145060221354164, + 16.772481282552082, 16.969340006510414, 13.522542317708334, 14.862894694010416, + 22.42913818359375, 23.868672688802086, 21.657938639322918, 19.977274576822914, + 16.225667317708332, 16.15362548828125, 0.0, 13.541890462239584, 18.951517740885414, + 19.38372802734375, 12.8707275390625, 15.048238118489586, 25.420369466145836, + 23.946207682291668, 16.654703776041668, 15.114929199218748, 15.113972981770834, + 16.429646809895832, 20.240783691406254, 21.603352864583336 + ], + [ + 92.34895833333333, 92.7725830078125, 92.80942789713542, 92.66060384114584, + 92.64762369791666, 92.77242024739583, 92.84474690755206, 92.66516113281249, + 92.39711507161459, 92.49281819661459, 92.29597981770833, 92.54933675130209, + 91.94309488932291, 92.25516764322916, 92.56136067708331, 92.39742024739584, + 91.74110921223959, 91.33500162760416, 92.50427246093749, 92.11755371093749, + 91.90419514973959, 91.81473795572917, 91.01300048828126, 91.01654052734376, + 91.33925374348959, 91.44209798177083, 90.63566080729167, 90.67201741536458, + 17.000467936197918, 18.274149576822918, 17.416341145833332, 18.243794759114582, + 17.180257161458336, 15.1634521484375, 16.376444498697918, 14.865275065104168, + 23.701171875, 22.8248291015625, 21.662434895833332, 22.14599609375, 17.26861572265625, + 17.577718098958332, 13.541890462239584, 0.0, 19.297810872395832, 20.083740234375, + 15.171000162760414, 15.780069986979168, 25.978535970052082, 22.665100097656246, + 15.61920166015625, 16.5738525390625, 16.360127766927086, 15.42596435546875, + 21.647989908854168, 21.75933837890625 + ], + [ + 93.88944498697917, 94.39428710937499, 94.20086669921875, 93.89188639322916, + 94.23482259114583, 94.3226318359375, 94.31760660807291, 94.15523274739584, + 94.01332600911458, 94.18174235026042, 93.8187255859375, 94.07716878255208, + 93.37497965494792, 93.63956705729166, 94.15450032552083, 93.96492513020833, + 93.25229899088541, 92.86324055989583, 94.1314697265625, 93.76538085937499, + 93.44691975911458, 93.28120930989583, 92.3852335611979, 92.46970621744792, + 92.97340901692709, 93.06856282552084, 92.14790852864584, 92.19826253255208, + 18.813578287760418, 19.639017740885414, 22.833658854166668, 24.350240071614586, + 15.917887369791668, 15.884236653645832, 17.95599365234375, 18.318562825520832, + 15.493326822916666, 16.197347005208332, 17.605183919270832, 17.8834228515625, + 13.631368001302084, 14.190958658854166, 18.951517740885414, 19.297810872395832, 0.0, + 12.1107177734375, 17.120707194010418, 18.90625, 16.427225748697914, 13.870422363281252, + 17.763081868489582, 18.204833984375, 19.56707763671875, 19.559753417968754, + 15.713256835937502, 15.619771321614584 + ], + [ + 93.94034830729166, 94.41259765625, 94.18821207682292, 93.91662597656249, + 94.30712890625001, 94.38671875000001, 94.32928466796876, 94.1231689453125, + 94.09206136067709, 94.22304280598958, 93.8427734375, 94.10337320963542, 93.40098063151042, + 93.62186686197917, 94.1595458984375, 94.0174560546875, 93.24839274088541, + 92.84513346354167, 94.10371907552083, 93.77514648437499, 93.43768310546875, + 93.30310058593749, 92.40976969401042, 92.44732666015625, 92.95253499348958, + 93.06538899739583, 92.13659667968751, 92.20798746744792, 18.364400227864586, + 17.15936279296875, 22.088338216145832, 22.408996582031254, 15.5726318359375, + 16.209513346354164, 19.479838053385414, 18.338216145833336, 13.407511393229168, + 15.600504557291668, 15.525187174479168, 18.085896809895832, 13.468526204427084, + 13.346761067708334, 19.38372802734375, 20.083740234375, 12.1107177734375, 0.0, + 15.266092936197916, 17.0679931640625, 15.563944498697916, 13.43609619140625, + 16.184956868489582, 16.592041015625, 19.90960693359375, 19.268086751302086, + 14.63028971354167, 14.921651204427084 + ], + [ + 93.16851806640625, 93.63136800130209, 93.50240071614583, 93.35797119140625, + 93.48862711588542, 93.60085042317709, 93.59098307291667, 93.45188395182291, + 93.24308268229167, 93.3829345703125, 93.11741129557291, 93.31722005208334, + 92.69954427083333, 92.89605712890624, 93.42360432942708, 93.22662353515626, + 92.56416829427083, 92.22515869140625, 93.29538981119792, 92.91269938151041, + 92.74064127604167, 92.60955810546875, 91.75439453125001, 91.77335611979167, + 92.21903483072916, 92.30385335286459, 91.44390869140624, 91.48502604166666, + 15.982503255208334, 15.49462890625, 17.106180826822914, 15.670572916666666, + 15.909281412760418, 16.164082845052082, 15.17822265625, 15.95611572265625, + 17.99603271484375, 19.92449951171875, 17.25897216796875, 19.384134928385414, + 14.405924479166668, 14.392639160156248, 12.8707275390625, 15.171000162760414, + 17.120707194010418, 15.266092936197916, 0.0, 11.427266438802082, 21.067952473958336, + 19.950439453125, 15.986897786458332, 14.287414550781252, 16.54296875, 15.026977539062498, + 17.32497151692708, 17.379475911458336 + ], + [ + 93.04101562500001, 93.55399576822917, 93.42392985026042, 93.25590006510417, + 93.39550781249999, 93.44962565104166, 93.55963134765624, 93.28792317708333, + 93.14739990234375, 93.26153564453125, 92.99580891927083, 93.23284912109375, + 92.56235758463542, 92.84077962239584, 93.26098632812499, 93.114990234375, + 92.42738850911458, 92.03035481770834, 93.24955240885417, 92.82889811197917, + 92.56382242838541, 92.4456787109375, 91.61317952473958, 91.66982014973958, + 92.10398356119792, 92.22176106770834, 91.26883951822917, 91.28188069661458, + 15.944559733072918, 14.519673665364584, 18.987386067708332, 15.45440673828125, + 17.047566731770836, 16.272705078125, 17.065653483072914, 15.052775065104168, + 19.565999348958332, 22.634928385416668, 15.838297526041668, 21.8304443359375, + 17.656473795572914, 15.431803385416668, 15.048238118489586, 15.780069986979168, 18.90625, + 17.0679931640625, 11.427266438802082, 0.0, 19.106302897135418, 22.793111165364586, + 17.657124837239586, 15.3951416015625, 19.180643717447914, 17.052591959635414, + 19.79638671875, 20.485453287760418 + ], + [ + 93.77386474609376, 94.26255289713542, 93.97147623697917, 93.75661214192708, + 94.12758382161458, 94.21506754557292, 94.1297607421875, 93.96962483723958, + 93.99430338541667, 94.1060791015625, 93.66257731119792, 93.88179524739584, + 93.112060546875, 93.35569254557292, 94.01092529296875, 93.83888753255208, 93.06201171875, + 92.62778727213542, 93.98842366536459, 93.67128499348958, 93.27425130208333, + 93.12990315755208, 92.19978841145834, 92.20914713541667, 92.90173339843753, + 93.02280680338542, 91.96820068359375, 92.07722981770833, 19.90478515625, + 20.117594401041668, 27.870992024739586, 25.853556315104168, 19.675557454427082, + 19.46270751953125, 24.717325846354168, 22.773783365885418, 16.356384277343754, + 20.865743001302086, 16.06341552734375, 23.091044108072914, 21.075154622395836, + 18.79030354817708, 25.420369466145836, 25.978535970052082, 16.427225748697914, + 15.563944498697916, 21.067952473958336, 19.106302897135418, 0.0, 17.993937174479168, + 23.500854492187504, 22.052347819010414, 27.450724283854164, 24.8564453125, + 18.60028076171875, 19.518513997395832 + ], + [ + 93.69598388671875, 94.20831298828125, 93.90604654947916, 93.63637288411458, + 94.04347737630208, 94.22308349609374, 94.08520507812499, 93.93206787109374, + 93.90848795572916, 94.037109375, 93.63714599609374, 93.86796061197916, 93.0968017578125, + 93.34438069661458, 93.97393798828126, 93.76352945963542, 93.043212890625, + 92.62465413411456, 93.91485595703126, 93.6004842122396, 93.20353190104167, + 93.05649820963542, 92.189697265625, 92.15694173177084, 92.83223470052083, + 92.94724527994791, 91.94960530598959, 92.025146484375, 22.076741536458332, + 21.901896158854164, 26.563822428385414, 26.899454752604168, 18.275980631510414, + 18.486836751302082, 22.633585611979168, 23.600199381510418, 16.459004720052086, + 13.113993326822916, 18.495096842447918, 19.407694498697918, 15.926432291666666, + 17.775410970052086, 23.946207682291668, 22.665100097656246, 13.870422363281252, + 13.43609619140625, 19.950439453125, 22.793111165364586, 17.993937174479168, 0.0, + 20.506551106770836, 21.958964029947918, 22.415323893229168, 22.365397135416664, + 15.539082845052082, 13.824218749999998 + ], + [ + 93.19500732421876, 93.64996337890625, 93.6387939453125, 93.46006266276042, + 93.54335530598958, 93.59678141276042, 93.69555664062499, 93.50095621744791, + 93.2200927734375, 93.38525390625, 93.13214111328125, 93.39147949218749, 92.93733723958334, + 93.17124430338544, 93.47247314453125, 93.28489176432292, 92.72696940104167, + 92.26536051432292, 93.38458251953125, 93.00661214192706, 92.83479817708334, + 92.63360595703125, 91.89717610677081, 91.91288248697914, 92.16560872395833, + 92.32899983723959, 91.46535237630209, 91.5174560546875, 20.753173828125, + 18.928629557291668, 18.98089599609375, 21.567586263020836, 17.600199381510418, + 18.473531087239582, 20.075927734375, 18.695943196614582, 22.032694498697918, + 22.620463053385418, 20.943868001302086, 20.137837727864582, 14.9322509765625, + 14.322855631510418, 16.654703776041668, 15.61920166015625, 17.763081868489582, + 16.184956868489582, 15.986897786458332, 17.657124837239586, 23.500854492187504, + 20.506551106770836, 0.0, 11.13165283203125, 13.33308919270833, 13.731160481770834, + 17.852152506510418, 18.709920247395832 + ], + [ + 93.06608072916666, 93.55977376302083, 93.44944254557292, 93.36629231770833, + 93.39815266927084, 93.42622884114583, 93.58880615234375, 93.42574055989584, + 93.10854085286459, 93.25913492838541, 93.03816731770831, 93.29290771484375, + 92.79665120442708, 93.04073079427083, 93.31376139322917, 93.17643229166667, + 92.56654866536459, 92.1815185546875, 93.23693847656249, 92.83955891927083, + 92.69122314453125, 92.53560384114584, 91.74766031901042, 91.78407796223959, + 92.08640543619794, 92.21012369791666, 91.39583333333333, 91.41033935546875, + 19.80474853515625, 18.134175618489582, 17.676798502604164, 20.048604329427086, + 17.3551025390625, 18.130615234375, 18.685282389322918, 17.896199544270836, + 20.475789388020836, 23.364583333333332, 19.924031575520836, 20.00390625, + 15.63397216796875, 14.3203125, 15.114929199218748, 16.5738525390625, 18.204833984375, + 16.592041015625, 14.287414550781252, 15.3951416015625, 22.052347819010414, + 21.958964029947918, 11.13165283203125, 0.0, 13.686055501302084, 14.32366943359375, + 17.029744466145836, 19.560892740885414 + ], + [ + 93.00933837890625, 93.47983805338544, 93.54781087239583, 93.43857828776042, + 93.33872477213541, 93.43410237630208, 93.55900065104166, 93.38051350911459, + 93.03666178385416, 93.16357421875, 93.05206298828126, 93.25004069010416, + 92.85668945312501, 93.16623942057292, 93.36985270182291, 93.12123616536458, + 92.59981282552083, 92.15211995442708, 93.25213623046875, 92.79042561848956, + 92.75948079427084, 92.58571370442709, 91.82649739583334, 91.83260091145834, + 92.0472412109375, 92.18963623046875, 91.34320068359375, 91.40108235677083, + 23.071695963541668, 21.795328776041668, 19.71099853515625, 22.229451497395832, + 19.765726725260418, 20.263773600260418, 18.135579427083332, 19.742899576822914, + 24.31976318359375, 23.82122802734375, 23.379781087239582, 20.948465983072914, + 16.222452799479164, 17.150004069010418, 15.113972981770834, 16.360127766927086, + 19.56707763671875, 19.90960693359375, 16.54296875, 19.180643717447914, 27.450724283854164, + 22.415323893229168, 13.33308919270833, 13.686055501302084, 0.0, 12.343505859375, + 20.189798990885418, 20.378987630208336 + ], + [ + 93.01247151692708, 93.40834554036458, 93.554443359375, 93.47458902994792, + 93.35935465494791, 93.39552815755209, 93.57666015625, 93.40757242838541, + 93.00728352864583, 93.12186686197916, 93.03774007161458, 93.2972412109375, + 92.87923177083334, 93.14577229817709, 93.36159261067709, 93.08266194661458, + 92.57153320312499, 92.18479410807292, 93.19187418619792, 92.77598063151042, + 92.7406005859375, 92.56060791015626, 91.84195963541669, 91.88586425781251, + 92.05989583333333, 92.18638102213541, 91.30914306640625, 91.38891601562501, + 20.155843098958332, 20.250691731770836, 19.83807373046875, 19.673909505208336, + 19.797017415364582, 20.17559814453125, 19.2568359375, 19.043558756510418, + 22.799458821614586, 22.44683837890625, 21.296773274739582, 23.00823974609375, + 17.404378255208336, 17.726826985677082, 16.429646809895832, 15.42596435546875, + 19.559753417968754, 19.268086751302086, 15.026977539062498, 17.052591959635414, + 24.8564453125, 22.365397135416664, 13.731160481770834, 14.32366943359375, 12.343505859375, + 0.0, 19.115702311197918, 18.824178059895836 + ], + [ + 92.75638834635416, 93.2069091796875, 93.08534749348958, 92.864013671875, + 93.14261881510419, 93.17846679687501, 93.21632893880208, 93.05338541666667, + 92.86875406901042, 93.04962158203126, 92.71858723958334, 92.89211018880208, + 92.26023356119792, 92.49552408854167, 93.01802571614583, 92.8416748046875, + 92.17429606119791, 91.76672363281251, 92.947021484375, 92.59004720052084, + 92.36907958984375, 92.20857747395833, 91.36606852213541, 91.36037190755208, + 91.86700439453125, 91.93672688802083, 91.02083333333334, 91.12424723307294, + 22.678812662760418, 22.53460693359375, 22.407389322916668, 25.361877441406246, + 19.055013020833336, 19.737589518229168, 22.25177001953125, 22.732055664062504, + 18.057779947916664, 18.829833984375004, 20.567708333333336, 18.931844075520832, + 15.391988118489582, 15.663777669270834, 20.240783691406254, 21.647989908854168, + 15.713256835937502, 14.63028971354167, 17.32497151692708, 19.79638671875, + 18.60028076171875, 15.539082845052082, 17.852152506510418, 17.029744466145836, + 20.189798990885418, 19.115702311197918, 0.0, 11.228169759114582 + ], + [ + 93.36850992838541, 93.83998616536459, 93.66516113281251, 93.39735921223959, + 93.71303304036458, 93.80499267578125, 93.80745442708333, 93.64621988932291, + 93.55135091145836, 93.62048339843751, 93.30653889973959, 93.56457519531249, + 92.85367838541667, 93.08237711588542, 93.65464274088542, 93.45611572265625, + 92.74507649739583, 92.34792073567708, 93.59617106119791, 93.26104736328125, + 92.97810872395833, 92.81760660807292, 91.89396158854167, 91.99336751302086, + 92.51920572916667, 92.59242757161459, 91.60675048828125, 91.70467122395834, + 22.610636393229168, 22.3251953125, 25.263488769531254, 25.0765380859375, + 20.28155517578125, 20.620463053385414, 22.316691080729164, 23.244527180989582, + 18.14593505859375, 16.82635498046875, 20.123026529947914, 21.641133626302086, + 16.166666666666664, 17.947733561197918, 21.603352864583336, 21.75933837890625, + 15.619771321614584, 14.921651204427084, 17.379475911458336, 20.485453287760418, + 19.518513997395832, 13.824218749999998, 18.709920247395832, 19.560892740885414, + 20.378987630208336, 18.824178059895836, 11.228169759114582, 0.0 + ] + ], + "units": "SYS_CNT ticks", + "source": { + "name": "scalar_128MiB_vector_isolated", + "matrices": { + "path": "benchmarks/ascend950pr_cube_vector_heatmaps_20261006/analysis/scalar_128MiB_vector_isolated.npz", + "sha256": "98ab4a82dab9516358857cb90ed0d463fefde5db89690a4842b6a234cc4fe067", + "bytes": 5105504 + }, + "statistics": { + "path": "benchmarks/ascend950pr_cube_vector_heatmaps_20261006/analysis/scalar_128MiB_vector_isolated.json", + "sha256": "c4e4a3f49be519d4d6456eff85a1cb7ddf5551bfb31cf5225b6cb3a10d118ab9", + "bytes": 55623 + } + }, + "pair_statistics": { + "all_unique_core_pairs": { + "count": 1540, + "mean": 56.73007554884081, + "std": 37.55932583033218, + "quantiles": { + "0.0": 10.266886393229166, + "0.01": 12.794440307617188, + "0.05": 14.760241699218751, + "0.25": 18.337621053059898, + "0.5": 91.37749226888022, + "0.75": 93.57668050130208, + "0.95": 94.7848907470703, + "0.99": 95.3764784749349, + "1.0": 95.75356038411458 + } + }, + "within_decoded_die": { + "count": 756, + "mean": 18.560057974786773, + "std": 3.286376466133168, + "quantiles": { + "0.0": 10.266886393229166, + "0.01": 11.819739786783854, + "0.05": 13.624298095703125, + "0.25": 16.19342549641927, + "0.5": 18.269012451171875, + "0.75": 20.60856628417969, + "0.95": 24.32738240559896, + "0.99": 26.71485697428387, + "1.0": 29.172648111979164 + } + }, + "between_decoded_die": { + "count": 784, + "mean": 93.53687820953577, + "std": 0.9757521993027309, + "quantiles": { + "0.0": 90.63566080729167, + "0.01": 91.30450846354167, + "0.05": 91.86983337402344, + "0.25": 92.87661234537761, + "0.5": 93.55672200520833, + "0.75": 94.23060099283855, + "0.95": 95.09526265462239, + "0.99": 95.51547403971355, + "1.0": 95.75356038411458 + } + } + }, + "dieGroups": [ + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B" + ] + }, + { + "condition": "scalar_128MiB_vector_concurrent", + "metric": "distance", + "coreids": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, + 45, 46, 47, 48, 49, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 96, 97, 98, 99, 100, 101 + ], + "matrix": [ + [ + 0.0, 38.559305826822914, 45.93680826822917, 43.5384521484375, 35.17413330078124, + 36.49820963541667, 27.312683105468746, 36.554728190104164, 38.26523844401042, + 36.549845377604164, 51.681559244791664, 34.02337646484375, 43.704549153645836, + 41.82739257812501, 41.706949869791664, 46.34318033854167, 34.56764729817708, + 44.23455810546874, 32.874165852864586, 46.96870930989583, 44.34065755208334, + 29.399190266927082, 34.17598470052083, 55.47621663411457, 30.839538574218754, + 41.77475992838542, 35.07790120442708, 35.81787109375001, 72.11383056640625, + 66.970947265625, 86.9696044921875, 74.93351236979169, 73.88014729817708, + 79.41554768880208, 97.35892740885416, 102.47133382161458, 77.45182291666667, + 87.77813720703125, 66.27581787109375, 64.3125, 66.29693603515625, 83.58766682942709, + 73.07511393229169, 76.015625, 69.94832356770833, 77.38962809244791, 83.38871256510417, + 66.82843017578125, 65.72416178385417, 67.26149495442709, 87.59427897135417, + 69.49810791015625, 85.29738362630208, 57.812845865885414, 79.28790283203125, + 57.90551757812501 + ], + [ + 38.559305826822914, 0.0, 36.26169840494792, 36.11899820963542, 38.30936686197917, + 30.521830240885418, 35.92903645833333, 33.462015787760414, 32.120157877604164, + 35.26397705078125, 35.17144775390625, 30.722086588541664, 32.06500244140625, + 31.89019775390625, 33.62587483723957, 33.613260904947914, 35.0267333984375, + 31.167236328125, 36.26285807291667, 36.697245279947914, 34.19944254557292, + 42.71704101562499, 37.801371256510414, 37.872355143229164, 37.92903645833333, + 32.1744384765625, 33.81746419270833, 35.513326009114586, 52.609903971354164, + 48.66343180338542, 63.69411214192709, 55.13262939453124, 53.564778645833336, + 57.7625732421875, 74.13861083984375, 78.598388671875, 57.25604248046875, + 65.81209309895833, 48.87040201822917, 48.16400146484375, 48.77974446614583, + 61.87076822916667, 52.50705973307291, 55.492451985677086, 50.11651611328125, + 56.7164306640625, 61.40793863932291, 47.43770345052083, 48.20318603515625, + 48.904866536458336, 64.28444417317708, 49.870035807291664, 62.5439453125, + 42.868855794270836, 57.52132161458333, 41.771097819010414 + ], + [ + 45.93680826822917, 36.26169840494792, 0.0, 34.886515299479164, 46.332539876302086, + 37.868001302083336, 47.64764404296875, 38.734456380208336, 36.450541178385414, + 39.39640299479167, 27.334065755208336, 44.59857177734374, 33.66158040364583, + 34.96476236979167, 36.144205729166664, 34.28523763020833, 39.489359537760414, + 33.56756591796875, 48.12717692057292, 35.796793619791664, 28.891357421875, + 53.55804443359375, 50.176798502604164, 33.214945475260414, 49.614278157552086, + 34.215677897135414, 35.30666097005208, 42.077189127604164, 42.988993326822914, + 40.97762044270833, 53.0816650390625, 46.682576497395836, 43.494242350260414, + 45.526835123697914, 59.0860595703125, 64.25689697265624, 45.319498697916664, + 53.161112467447914, 41.109151204427086, 38.91845703125, 42.62335205078125, + 51.06744384765626, 44.1038818359375, 43.321818033854164, 41.43977864583333, + 45.81199137369792, 48.0218505859375, 38.356221516927086, 36.442301432291664, + 41.04954020182292, 51.9554443359375, 42.05792236328125, 51.18145751953125, + 39.947408040364586, 45.67877197265625, 39.10432942708333 + ], + [ + 43.5384521484375, 36.11899820963542, 34.886515299479164, 0.0, 42.18809000651042, + 35.332194010416664, 42.63665771484375, 36.828857421875, 36.921854654947914, + 36.70621744791667, 36.559163411458336, 41.20513916015625, 33.755411783854164, + 34.9595947265625, 30.461140950520836, 31.794637044270836, 37.38824462890625, + 35.287862141927086, 41.90142822265625, 31.524943033854168, 29.204427083333336, + 47.06158447265625, 45.74580891927083, 38.47210693359375, 45.68947347005209, + 37.178731282552086, 37.40435791015625, 39.08882649739583, 49.59295654296875, + 45.323445638020836, 60.630371093750014, 53.270182291666664, 48.44647216796875, + 54.036112467447914, 67.82613118489583, 72.30902099609375, 51.451863606770836, + 59.05169677734376, 43.39019775390625, 45.17887369791667, 42.89809163411458, + 56.68129475911459, 48.57930501302083, 50.06490071614583, 46.54687499999999, + 51.84796142578124, 55.774251302083336, 46.51015218098959, 44.99353027343749, + 44.438130696614586, 58.985270182291664, 46.42327880859375, 59.25335693359375, + 40.84344482421876, 52.744120279947914, 40.45947265624999 + ], + [ + 35.17413330078124, 38.30936686197917, 46.332539876302086, 42.18809000651042, 0.0, + 36.64060465494792, 32.241943359375, 32.98333740234375, 36.270914713541664, + 35.032857259114586, 44.900492350260414, 32.22013346354167, 39.930318196614586, + 34.235575358072914, 36.061421712239586, 42.400370279947914, 32.6009521484375, + 39.864176432291664, 33.715576171875, 42.17555745442708, 41.330830891927086, + 35.371053059895836, 37.370015462239586, 49.4188232421875, 37.80053710937501, + 39.38704427083333, 37.522298177083336, 32.651346842447914, 64.69844563802083, + 58.91729736328125, 78.22076416015625, 67.57273356119791, 65.56917317708333, + 71.45947265625, 88.38157145182291, 93.26220703124999, 68.67132568359375, + 78.73437499999999, 58.116129557291664, 57.780253092447914, 58.251708984375, + 73.7606201171875, 64.64341227213542, 68.99367268880208, 60.34881591796875, + 69.6253662109375, 74.97206624348959, 61.392049153645836, 59.73008219401041, + 58.949544270833336, 78.91412353515625, 61.358154296875, 76.511474609375, + 52.36494954427083, 70.28120930989583, 52.61041259765625 + ], + [ + 36.49820963541667, 30.521830240885418, 37.868001302083336, 35.332194010416664, + 36.64060465494792, 0.0, 35.92572021484374, 32.657267252604164, 29.054585774739586, + 33.0281982421875, 38.55826822916667, 30.19679768880208, 35.717000325520836, + 36.4127197265625, 33.52779134114583, 38.328898111979164, 33.089090983072914, + 34.569356282552086, 32.67417399088542, 36.098592122395836, 32.13846842447917, + 39.02325439453125, 36.151407877604164, 39.93109130859375, 34.11944580078125, + 32.630269368489586, 31.96734619140625, 34.53080240885416, 54.771464029947914, + 51.4417724609375, 69.14851888020833, 59.0382080078125, 56.050313313802086, + 62.74652099609376, 79.08866373697917, 84.38332112630208, 60.35575358072917, + 70.82033284505209, 51.844258626302086, 50.1295166015625, 52.32326253255209, + 66.72357177734375, 55.0386962890625, 58.364664713541664, 54.227742513020836, + 61.14764404296875, 66.0185546875, 51.72955322265625, 50.98746744791668, 51.65224202473959, + 68.86637369791666, 53.87428792317708, 67.17860921223958, 43.89247639973958, + 61.954203287760414, 43.745890299479164 + ], + [ + 27.312683105468746, 35.92903645833333, 47.64764404296875, 42.63665771484375, + 32.241943359375, 35.92572021484374, 0.0, 34.964375813802086, 36.2220458984375, + 36.651590983072914, 50.32550048828125, 32.59549967447917, 41.012349446614586, + 39.126444498697914, 39.44651285807292, 44.392801920572914, 31.82666015625, + 41.314982096354164, 33.031209309895836, 45.26491292317708, 42.56626383463542, + 29.142049153645832, 31.701395670572918, 54.212646484375, 35.0169677734375, + 41.111287434895836, 32.562581380208336, 33.473653157552086, 71.13297526041667, + 64.21368408203125, 85.76027425130209, 74.08616129557291, 72.09757486979167, + 78.93660481770833, 96.49818929036458, 101.493896484375, 75.92864990234375, + 86.38484700520833, 64.19441731770833, 63.25250244140624, 63.920084635416664, + 81.97115071614583, 71.76536051432292, 75.07025146484376, 68.12009684244792, + 75.9593505859375, 82.61212158203125, 66.23848470052084, 65.28521728515625, + 65.33874511718749, 86.63417561848958, 67.8555908203125, 84.046630859375, + 55.862955729166664, 77.87931315104167, 56.32220458984375 + ], + [ + 36.554728190104164, 33.462015787760414, 38.734456380208336, 36.828857421875, + 32.98333740234375, 32.657267252604164, 34.964375813802086, 0.0, 33.10601806640625, + 34.13114420572917, 38.642985026041664, 32.13820393880208, 32.17529296875, + 33.294881184895836, 34.95751953125, 38.129353841145836, 29.426737467447918, + 33.63267008463542, 35.956685384114586, 38.509562174479164, 35.371826171875, + 36.468485514322914, 33.56815592447917, 41.414449055989586, 37.57415771484375, + 31.496236165364586, 32.805440266927086, 34.2606201171875, 56.18023681640625, + 53.24788411458333, 70.29101562499999, 58.3436279296875, 58.445414225260414, + 64.85007731119792, 80.50423177083334, 86.10902913411458, 62.282755533854164, + 72.06166585286458, 51.812032063802086, 50.377197265625, 52.659769694010414, + 67.93288167317708, 56.21586100260416, 61.5576171875, 55.0302734375, 61.68267822265625, + 67.78629557291666, 52.202128092447914, 51.63586425781251, 52.912455240885414, + 70.70849609375, 55.12176513671876, 69.04909261067709, 46.278299967447914, + 62.970723470052086, 46.828450520833336 + ], + [ + 38.26523844401042, 32.120157877604164, 36.450541178385414, 36.921854654947914, + 36.270914713541664, 29.054585774739586, 36.2220458984375, 33.10601806640625, 0.0, + 31.295430501302082, 33.177876790364586, 32.107950846354164, 34.28489176432292, + 33.003560384114586, 31.274393717447914, 34.44407145182291, 32.987101236979164, + 32.785603841145836, 34.425374348958336, 33.24928792317708, 31.833435058593743, + 40.97546386718749, 38.759908040364586, 40.142049153645836, 38.1375732421875, + 30.083048502604168, 31.76200358072917, 33.98996988932292, 51.46850585937501, + 45.83685302734376, 64.29555257161459, 51.861470540364586, 51.81424967447917, + 58.67708333333334, 74.30942789713542, 79.55362955729166, 55.717061360677086, + 66.08194986979167, 46.7060546875, 45.92710367838542, 48.406697591145836, + 61.72347005208334, 51.20989990234375, 54.88429768880208, 50.368021647135414, + 56.36279296875001, 61.41241455078125, 46.521321614583336, 45.740336100260414, + 49.62190755208333, 64.91151936848958, 47.814493815104164, 61.163818359375, + 41.330281575520836, 57.11918131510417, 41.36513264973958 + ], + [ + 36.549845377604164, 35.26397705078125, 39.39640299479167, 36.70621744791667, + 35.032857259114586, 33.0281982421875, 36.651590983072914, 34.13114420572917, + 31.295430501302082, 0.0, 39.358072916666664, 34.34295654296875, 37.203816731770836, + 37.30729166666667, 32.200032552083336, 38.24682617187499, 33.15675862630208, + 33.51059977213542, 35.16977945963542, 33.53287760416667, 36.16544596354167, + 37.98443603515625, 38.09033203125, 44.51926676432292, 37.974751790364586, + 33.71795654296875, 32.452412923177086, 29.498168945312496, 55.54376220703125, + 52.353312174479164, 69.27551269531249, 59.07706705729166, 55.79229736328126, + 63.93918863932292, 79.413330078125, 84.68654378255208, 61.63126627604167, + 71.27109781901041, 51.71453857421874, 49.376912434895836, 51.22760009765626, + 65.52142333984375, 56.04915364583333, 59.21516927083333, 54.6220703125, 60.87847900390625, + 65.8699951171875, 52.61627197265625, 51.17586263020833, 54.107442220052086, + 70.01371256510417, 53.398213704427086, 67.64512125651041, 44.82309977213542, + 62.829325358072914, 45.482381184895836 + ], + [ + 51.681559244791664, 35.17144775390625, 27.334065755208336, 36.559163411458336, + 44.900492350260414, 38.55826822916667, 50.32550048828125, 38.642985026041664, + 33.177876790364586, 39.358072916666664, 0.0, 45.17218017578125, 32.34411621093751, + 31.563680013020832, 34.715901692708336, 27.839274088541668, 40.18113199869792, + 32.677469889322914, 48.16237386067709, 32.7635498046875, 28.154174804687496, + 54.322652180989586, 51.73360188802082, 32.376932779947914, 51.158426920572914, + 30.823832194010418, 36.75868733723958, 41.20076497395833, 39.734517415364586, + 38.612019856770836, 48.978352864583336, 42.62381998697917, 39.76979573567708, + 44.419576009114586, 55.500813802083336, 60.538309733072914, 43.155192057291664, + 49.621602376302086, 37.543070475260414, 38.017171223958336, 40.54681396484375, + 47.358744303385414, 40.13716634114583, 41.73612467447917, 39.16670735677083, + 42.90940348307292, 45.59623209635417, 36.63063557942708, 36.1629638671875, + 40.60117594401042, 48.465372721354164, 38.882670084635414, 47.18487548828125, + 38.07318115234375, 44.08262125651042, 38.53434244791667 + ], + [ + 34.02337646484375, 30.722086588541664, 44.59857177734374, 41.20513916015625, + 32.22013346354167, 30.19679768880208, 32.59549967447917, 32.13820393880208, + 32.107950846354164, 34.34295654296875, 45.17218017578125, 0.0, 38.79099527994791, + 38.99265543619792, 36.189839680989586, 41.96071370442708, 32.65283203124999, + 38.5255126953125, 28.454427083333336, 38.979146321614586, 38.71380615234375, + 34.631144205729164, 28.254903157552082, 46.05997721354167, 29.962483723958336, + 36.282430013020836, 32.454915364583336, 32.82537841796875, 64.33341471354166, + 58.70522054036458, 78.91326904296875, 67.04351806640625, 65.21488444010417, + 71.05887858072917, 89.52288818359375, 94.5843505859375, 69.99131266276042, + 79.99829101562499, 58.86267089843749, 57.22532145182292, 58.81624348958333, + 75.22509765625, 64.31797281901041, 68.44765218098958, 62.01906331380209, + 69.46415201822916, 75.44142659505209, 59.72106933593751, 59.09889729817708, + 58.34716796875, 79.74733479817708, 60.97139485677083, 76.96907552083334, + 51.14786783854167, 71.241455078125, 49.562520345052086 + ], + [ + 43.704549153645836, 32.06500244140625, 33.66158040364583, 33.755411783854164, + 39.930318196614586, 35.717000325520836, 41.012349446614586, 32.17529296875, + 34.28489176432292, 37.203816731770836, 32.34411621093751, 38.79099527994791, 0.0, + 30.511881510416664, 32.717936197916664, 32.071044921875, 32.627909342447914, + 29.439880371093746, 40.078104654947914, 33.519246419270836, 29.895792643229164, + 46.06300862630208, 42.05753580729167, 35.49269612630208, 43.76625569661458, + 34.165751139322914, 34.19374593098958, 36.20947265625, 46.54010009765626, 43.456298828125, + 59.5826416015625, 50.225504557291664, 48.209126790364586, 53.35968017578126, + 67.21158854166667, 72.39548746744792, 49.788004557291664, 58.148783365885414, + 42.021870930989586, 41.72444661458333, 42.32208251953125, 55.59299723307292, + 48.005411783854164, 50.6915283203125, 43.19112141927083, 50.408793131510414, + 55.7652587890625, 43.23988850911459, 42.849446614583336, 42.78175862630208, + 59.42647298177083, 45.226826985677086, 58.416524251302086, 39.78098551432292, + 52.10748291015624, 39.715738932291664 + ], + [ + 41.82739257812501, 31.89019775390625, 34.96476236979167, 34.9595947265625, + 34.235575358072914, 36.4127197265625, 39.126444498697914, 33.294881184895836, + 33.003560384114586, 37.30729166666667, 31.563680013020832, 38.99265543619792, + 30.511881510416664, 0.0, 30.048990885416664, 32.394734700520836, 32.285054524739586, + 32.42881266276042, 41.84128824869792, 36.49983723958333, 32.32828776041667, + 43.62058512369792, 41.50040690104167, 36.622538248697914, 43.86029052734375, + 34.375834147135414, 34.87408447265624, 33.9193115234375, 49.08140055338542, + 44.3067626953125, 60.58410644531249, 50.39758300781251, 49.380594889322914, + 54.05621337890624, 68.78438313802083, 73.07769775390625, 51.939534505208336, + 59.76409912109375, 43.083964029947914, 44.52693684895833, 45.461690266927086, + 56.809916178385414, 49.85380045572916, 52.746012369791664, 45.15889485677083, + 52.23468017578125, 56.82698567708333, 44.25303141276042, 44.41072591145833, + 45.907694498697914, 60.067952473958336, 46.91668701171876, 59.002217610677086, + 43.57700602213542, 52.15081787109374, 41.75573730468749 + ], + [ + 41.706949869791664, 33.62587483723957, 36.144205729166664, 30.461140950520836, + 36.061421712239586, 33.52779134114583, 39.44651285807292, 34.95751953125, + 31.274393717447914, 32.200032552083336, 34.715901692708336, 36.189839680989586, + 32.717936197916664, 30.048990885416664, 0.0, 33.274820963541664, 33.88140869140625, + 33.17246500651042, 37.11309814453125, 24.3648681640625, 31.140096028645832, + 44.14959716796875, 41.35961914062501, 38.00396728515625, 41.14959716796874, + 31.882954915364586, 29.59726969401042, 34.53889973958333, 49.050272623697914, + 44.542277018229164, 61.21638997395833, 51.911946614583336, 50.16815185546875, + 55.50506591796875, 70.36385091145834, 75.10764567057292, 53.33447265625001, + 61.88441975911458, 44.36676025390624, 44.223795572916664, 44.17279052734375, + 58.45371500651042, 47.75032552083333, 51.186360677083336, 46.339640299479164, + 53.534159342447914, 56.72306315104167, 45.676981608072914, 46.231974283854164, + 46.741231282552086, 61.3125, 46.679219563802086, 60.14483642578125, 39.546895345052086, + 54.92336018880208, 41.60437011718749 + ], + [ + 46.34318033854167, 33.613260904947914, 34.28523763020833, 31.794637044270836, + 42.400370279947914, 38.328898111979164, 44.392801920572914, 38.129353841145836, + 34.44407145182291, 38.24682617187499, 27.839274088541668, 41.96071370442708, + 32.071044921875, 32.394734700520836, 33.274820963541664, 0.0, 38.85699462890625, + 34.11541748046875, 42.33164469401042, 33.719401041666664, 30.825642903645832, + 49.52695719401042, 47.56498209635417, 36.640116373697914, 45.187723795572914, + 33.449849446614586, 35.66021728515625, 38.8372802734375, 45.893819173177086, + 40.99239095052083, 55.14892578125001, 47.98726399739583, 46.400044759114586, + 51.19850667317708, 63.51171875, 68.11916097005209, 49.142985026041664, 56.00266520182292, + 43.345235188802086, 43.15531412760417, 43.61558024088542, 54.109842936197914, + 46.05362955729167, 48.25179036458333, 43.880615234375, 49.32175699869792, + 52.30570475260417, 42.59519449869792, 43.527872721354164, 44.599100748697914, + 54.15722656249999, 43.19647216796876, 54.321309407552086, 40.38787841796875, + 50.01788330078125, 41.98714192708333 + ], + [ + 34.56764729817708, 35.0267333984375, 39.489359537760414, 37.38824462890625, + 32.6009521484375, 33.089090983072914, 31.82666015625, 29.426737467447918, + 32.987101236979164, 33.15675862630208, 40.18113199869792, 32.65283203124999, + 32.627909342447914, 32.285054524739586, 33.88140869140625, 38.85699462890625, 0.0, + 34.16418457031249, 34.156778971354164, 35.579325358072914, 33.82875569661458, + 35.064127604166664, 32.93996175130208, 40.0826416015625, 36.326904296875, + 33.934041341145836, 31.360392252604168, 30.273742675781246, 57.0501708984375, + 52.32749430338542, 71.46946207682294, 60.29380289713542, 58.984700520833336, + 65.36478678385417, 82.00722249348959, 87.06388346354167, 62.19004313151042, + 71.95288085937501, 52.443644205729164, 50.703592936197914, 53.025716145833336, + 68.20125325520833, 58.878560384114586, 62.34783935546875, 55.40753173828125, + 62.70267740885417, 68.83087158203125, 54.434244791666664, 52.39919026692708, + 52.902669270833336, 72.19960530598959, 54.980550130208336, 69.88659667968749, + 47.480183919270836, 63.86279296875, 46.55206298828126 + ], + [ + 44.23455810546874, 31.167236328125, 33.56756591796875, 35.287862141927086, + 39.864176432291664, 34.569356282552086, 41.314982096354164, 33.63267008463542, + 32.785603841145836, 33.51059977213542, 32.677469889322914, 38.5255126953125, + 29.439880371093746, 32.42881266276042, 33.17246500651042, 34.11541748046875, + 34.16418457031249, 0.0, 40.642903645833336, 34.93516031901042, 31.825378417968746, + 45.938273111979164, 41.223286946614586, 35.4906005859375, 42.834187825520836, + 31.91719563802083, 34.007527669270836, 34.721089680989586, 43.38350423177083, + 43.499409993489586, 56.715108235677086, 49.09670003255208, 45.854410807291664, + 53.00048828125, 67.12705485026042, 72.5589599609375, 49.04172770182293, 58.46504720052083, + 42.22412109375, 42.89023844401042, 41.452921549479164, 54.227132161458336, + 46.835184733072914, 50.14394124348959, 43.522440592447914, 47.85839843750001, + 55.49782307942708, 43.657389322916664, 37.792948404947914, 44.3724365234375, + 58.20855712890625, 45.215779622395836, 56.164713541666664, 39.033406575520836, + 50.58121744791667, 40.46429443359375 + ], + [ + 32.874165852864586, 36.26285807291667, 48.12717692057292, 41.90142822265625, + 33.715576171875, 32.67417399088542, 33.031209309895836, 35.956685384114586, + 34.425374348958336, 35.16977945963542, 48.16237386067709, 28.454427083333336, + 40.078104654947914, 41.84128824869792, 37.11309814453125, 42.33164469401042, + 34.156778971354164, 40.642903645833336, 0.0, 42.245707194010414, 41.13360595703125, + 33.14599609375, 34.936665852864586, 50.321451822916664, 26.453165690104168, + 38.066813151041664, 34.251546223958336, 33.753804524739586, 67.58951822916667, + 61.41562906901042, 81.68076578776042, 69.82464599609375, 68.4075927734375, + 74.9713134765625, 92.51812744140625, 97.5799560546875, 72.08839925130208, + 82.33882649739584, 61.13309733072916, 58.78082275390625, 60.86250813802084, + 78.199951171875, 66.88348388671875, 71.37078857421875, 64.82855224609375, + 72.9293212890625, 78.77199300130208, 62.04500325520833, 62.44488525390625, + 60.505818684895836, 82.99110921223958, 63.95552571614583, 80.44917805989583, + 52.905721028645836, 73.82588704427083, 53.36216227213542 + ], + [ + 46.96870930989583, 36.697245279947914, 35.796793619791664, 31.524943033854168, + 42.17555745442708, 36.098592122395836, 45.26491292317708, 38.509562174479164, + 33.24928792317708, 33.53287760416667, 32.7635498046875, 38.979146321614586, + 33.519246419270836, 36.49983723958333, 24.3648681640625, 33.719401041666664, + 35.579325358072914, 34.93516031901042, 42.245707194010414, 0.0, 30.850423177083332, + 49.81687418619791, 46.30517578125, 35.744038899739586, 46.357889811197914, + 32.761983235677086, 33.753804524739586, 36.9644775390625, 45.36541748046875, + 41.876749674479164, 55.567057291666664, 48.123331705729164, 46.42364501953125, + 50.43927001953126, 63.491943359375, 68.58774820963541, 48.54003906249999, + 56.98341878255208, 41.67193603515625, 41.005940755208336, 42.14385986328125, + 53.78704833984374, 43.700032552083336, 45.91149902343749, 44.24210611979167, + 48.97296142578126, 49.75488281250001, 42.176534016927086, 43.020345052083336, + 44.694844563802086, 55.639119466145836, 42.76153564453126, 54.52394612630208, + 38.144673665364586, 50.77284749348959, 41.11376953125 + ], + [ + 44.34065755208334, 34.19944254557292, 28.891357421875, 29.204427083333336, + 41.330830891927086, 32.13846842447917, 42.56626383463542, 35.371826171875, + 31.833435058593743, 36.16544596354167, 28.154174804687496, 38.71380615234375, + 29.895792643229164, 32.32828776041667, 31.140096028645832, 30.825642903645832, + 33.82875569661458, 31.825378417968746, 41.13360595703125, 30.850423177083332, 0.0, + 47.14638264973959, 43.818888346354164, 33.96099853515625, 44.17535400390625, + 28.420186360677082, 31.140889485677082, 36.68509928385416, 44.96632893880208, + 42.1646728515625, 56.797403971354164, 47.356974283854164, 44.44891357421874, + 49.48541259765625, 64.87760416666667, 70.19529215494792, 48.274210611979164, + 57.56842041015625, 41.62599690755208, 40.576416015625, 43.031107584635414, + 53.58538818359375, 45.8658447265625, 48.00939941406249, 44.07421875, 48.22585042317708, + 52.21024576822917, 41.651265462239586, 41.118733723958336, 42.53582763671876, + 56.510498046875, 41.89308675130208, 55.16937255859374, 39.06064860026042, + 50.520121256510414, 36.4952392578125 + ], + [ + 29.399190266927082, 42.71704101562499, 53.55804443359375, 47.06158447265625, + 35.371053059895836, 39.02325439453125, 29.142049153645832, 36.468485514322914, + 40.97546386718749, 37.98443603515625, 54.322652180989586, 34.631144205729164, + 46.06300862630208, 43.62058512369792, 44.14959716796875, 49.52695719401042, + 35.064127604166664, 45.938273111979164, 33.14599609375, 49.81687418619791, + 47.14638264973959, 0.0, 30.63995361328125, 59.319661458333336, 30.535196940104164, + 42.187093098958336, 32.66084798177083, 31.808573404947918, 75.793212890625, + 70.18650309244792, 91.60732014973959, 78.68137613932292, 77.81949869791666, + 85.1016845703125, 102.75876871744792, 108.00260416666667, 81.71942138671875, + 92.60811360677083, 68.286376953125, 68.48996988932291, 69.59785970052083, + 88.10982259114583, 76.92946370442709, 80.87762451171875, 73.91900634765625, + 82.11588541666666, 88.78000895182291, 71.68339029947916, 70.00860595703125, + 71.25785319010416, 92.59560139973959, 73.38387044270833, 89.8748779296875, + 60.45483398437501, 83.58675130208333, 61.663920084635414 + ], + [ + 34.17598470052083, 37.801371256510414, 50.176798502604164, 45.74580891927083, + 37.370015462239586, 36.151407877604164, 31.701395670572918, 33.56815592447917, + 38.759908040364586, 38.09033203125, 51.73360188802082, 28.254903157552082, + 42.05753580729167, 41.50040690104167, 41.35961914062501, 47.56498209635417, + 32.93996175130208, 41.223286946614586, 34.936665852864586, 46.30517578125, + 43.818888346354164, 30.63995361328125, 0.0, 54.902933756510414, 30.710225423177086, + 39.018900553385414, 32.39556884765624, 32.4981689453125, 71.68674723307291, + 67.06502278645833, 87.86173502604166, 74.87109375, 73.82285563151042, 81.49131266276042, + 99.51029459635416, 104.87379964192709, 78.13138834635417, 89.53033447265626, + 65.08518473307292, 64.30192057291667, 65.91709391276041, 84.46242268880208, + 72.42529296875, 77.603271484375, 69.79772949218751, 78.00453694661456, 85.1429443359375, + 68.11305745442709, 65.85164388020834, 67.68039957682291, 89.096923828125, + 69.03981526692709, 86.16656494140625, 57.28037516276041, 79.47589111328125, + 57.68489583333333 + ], + [ + 55.47621663411457, 37.872355143229164, 33.214945475260414, 38.47210693359375, + 49.4188232421875, 39.93109130859375, 54.212646484375, 41.414449055989586, + 40.142049153645836, 44.51926676432292, 32.376932779947914, 46.05997721354167, + 35.49269612630208, 36.622538248697914, 38.00396728515625, 36.640116373697914, + 40.0826416015625, 35.4906005859375, 50.321451822916664, 35.744038899739586, + 33.96099853515625, 59.319661458333336, 54.902933756510414, 0.0, 53.888712565104164, + 37.797810872395836, 41.620157877604164, 43.662333170572914, 40.25602213541667, + 38.23960367838542, 47.67388916015625, 43.58294677734374, 39.14949544270833, + 40.67578125000001, 53.719258626302086, 58.9322509765625, 41.99017333984374, + 46.8433837890625, 39.719767252604164, 38.55442301432292, 41.280476888020836, + 46.70031738281251, 39.612162272135414, 41.90374755859375, 37.94529215494792, + 41.15970865885417, 44.865580240885414, 38.7596435546875, 37.12314860026042, + 34.310587565104164, 48.288431803385414, 39.77587890625, 46.372477213541664, + 41.649658203125, 41.318562825520836, 38.171610514322914 + ], + [ + 30.839538574218754, 37.92903645833333, 49.614278157552086, 45.68947347005209, + 37.80053710937501, 34.11944580078125, 35.0169677734375, 37.57415771484375, + 38.1375732421875, 37.974751790364586, 51.158426920572914, 29.962483723958336, + 43.76625569661458, 43.86029052734375, 41.14959716796874, 45.187723795572914, + 36.326904296875, 42.834187825520836, 26.453165690104168, 46.357889811197914, + 44.17535400390625, 30.535196940104164, 30.710225423177086, 53.888712565104164, 0.0, + 38.169840494791664, 34.16784667968749, 32.621683756510414, 71.35009765625, + 66.23219807942708, 86.45062255859375, 73.96934000651042, 73.32861328124999, + 79.5765380859375, 97.81752522786458, 102.96162923177084, 77.45302327473958, + 87.73811848958333, 65.35555013020833, 64.74713134765625, 65.1314697265625, + 83.54756673177084, 72.22711181640626, 76.36391194661458, 68.94138590494792, + 77.48266601562499, 83.96156819661459, 67.3680419921875, 65.46661376953125, + 66.60648600260416, 87.79083251953125, 68.52461751302084, 85.17138671875, + 55.98811848958333, 79.12483723958333, 57.85032145182291 + ], + [ + 41.77475992838542, 32.1744384765625, 34.215677897135414, 37.178731282552086, + 39.38704427083333, 32.630269368489586, 41.111287434895836, 31.496236165364586, + 30.083048502604168, 33.71795654296875, 30.823832194010418, 36.282430013020836, + 34.165751139322914, 34.375834147135414, 31.882954915364586, 33.449849446614586, + 33.934041341145836, 31.91719563802083, 38.066813151041664, 32.761983235677086, + 28.420186360677082, 42.187093098958336, 39.018900553385414, 37.797810872395836, + 38.169840494791664, 0.0, 30.98872884114583, 34.065083821614586, 49.0931396484375, + 46.715922037760414, 60.299173990885414, 51.16758219401042, 51.22668457031251, + 56.5906982421875, 71.02052815755208, 76.45414225260416, 54.76991780598959, + 64.41365559895834, 46.53828938802083, 43.63783772786458, 48.144002278645836, + 59.86104329427084, 50.09991455078125, 53.53387451171875, 48.99884033203125, + 54.11258951822917, 59.235249837239586, 45.41739908854167, 45.09405517578125, + 49.55387369791666, 61.88494873046875, 48.03865559895833, 60.421712239583336, + 41.90966796875, 56.258097330729164, 42.645894368489586 + ], + [ + 35.07790120442708, 33.81746419270833, 35.30666097005208, 37.40435791015625, + 37.522298177083336, 31.96734619140625, 32.562581380208336, 32.805440266927086, + 31.76200358072917, 32.452412923177086, 36.75868733723958, 32.454915364583336, + 34.19374593098958, 34.87408447265624, 29.59726969401042, 35.66021728515625, + 31.360392252604168, 34.007527669270836, 34.251546223958336, 33.753804524739586, + 31.140889485677082, 32.66084798177083, 32.39556884765624, 41.620157877604164, + 34.16784667968749, 30.98872884114583, 0.0, 29.149556477864582, 56.43607584635417, + 52.584370930989586, 71.15541585286459, 60.13267008463542, 57.836832682291664, + 64.68164062500001, 81.23691813151041, 86.43379720052083, 61.97479248046874, + 72.08931477864583, 51.73486328125, 51.164164225260414, 53.491617838541664, + 68.30135091145834, 58.10614013671875, 60.80893961588542, 55.58579508463542, + 62.3670654296875, 67.36016845703125, 52.323323567708336, 51.73366292317708, + 54.045043945312514, 71.81479899088542, 55.244181315104164, 69.78666178385417, + 46.760579427083336, 64.2587890625, 46.87078857421876 + ], + [ + 35.81787109375001, 35.513326009114586, 42.077189127604164, 39.08882649739583, + 32.651346842447914, 34.53080240885416, 33.473653157552086, 34.2606201171875, + 33.98996988932292, 29.498168945312496, 41.20076497395833, 32.82537841796875, + 36.20947265625, 33.9193115234375, 34.53889973958333, 38.8372802734375, 30.273742675781246, + 34.721089680989586, 33.753804524739586, 36.9644775390625, 36.68509928385416, + 31.808573404947918, 32.4981689453125, 43.662333170572914, 32.621683756510414, + 34.065083821614586, 29.149556477864582, 0.0, 59.69036865234375, 53.793294270833336, + 73.42549641927084, 62.59570312500001, 60.19451904296875, 66.92852783203125, + 83.668212890625, 88.60093180338542, 64.00362141927083, 74.03525797526042, + 53.643208821614586, 53.540242513020836, 53.44399007161458, 69.55080159505208, + 60.448445638020836, 64.15079752604166, 56.718017578125, 64.10036214192708, + 70.47029622395833, 56.50315348307291, 54.21948242187501, 55.92356363932292, + 74.31180826822916, 57.02410888671874, 72.16440836588542, 47.74582926432292, + 65.93902587890626, 48.50162760416667 + ], + [ + 72.11383056640625, 52.609903971354164, 42.988993326822914, 49.59295654296875, + 64.69844563802083, 54.771464029947914, 71.13297526041667, 56.18023681640625, + 51.46850585937501, 55.54376220703125, 39.734517415364586, 64.33341471354166, + 46.54010009765626, 49.08140055338542, 49.050272623697914, 45.893819173177086, + 57.0501708984375, 43.38350423177083, 67.58951822916667, 45.36541748046875, + 44.96632893880208, 75.793212890625, 71.68674723307291, 40.25602213541667, 71.35009765625, + 49.0931396484375, 56.43607584635417, 59.69036865234375, 0.0, 33.039164225260414, + 35.33819580078125, 32.47239176432291, 29.81013997395833, 33.94921875, 38.41107177734375, + 42.802815755208336, 34.013448079427086, 37.33500162760417, 35.138916015625, + 34.91766357421875, 35.2674560546875, 35.297403971354164, 33.36383056640625, + 30.64931233723959, 32.394185384114586, 31.582071940104168, 33.23610432942708, + 33.3050537109375, 31.155537923177086, 37.514607747395836, 29.586893717447918, + 32.9400634765625, 34.896158854166664, 40.124471028645836, 34.26379394531249, + 38.43829345703125 + ], + [ + 66.970947265625, 48.66343180338542, 40.97762044270833, 45.323445638020836, + 58.91729736328125, 51.4417724609375, 64.21368408203125, 53.24788411458333, + 45.83685302734376, 52.353312174479164, 38.612019856770836, 58.70522054036458, + 43.456298828125, 44.3067626953125, 44.542277018229164, 40.99239095052083, + 52.32749430338542, 43.499409993489586, 61.41562906901042, 41.876749674479164, + 42.1646728515625, 70.18650309244792, 67.06502278645833, 38.23960367838542, + 66.23219807942708, 46.715922037760414, 52.584370930989586, 53.793294270833336, + 33.039164225260414, 0.0, 38.273640950520836, 36.14510091145833, 30.239278157552082, + 35.289774576822914, 43.022501627604164, 46.595845540364586, 34.48307291666667, + 37.51593017578125, 33.74953206380208, 30.991373697916668, 34.746439615885414, + 37.04473876953125, 34.4114990234375, 31.344319661458336, 32.2308349609375, + 35.562154134114586, 34.459716796875, 33.272359212239586, 34.8402099609375, + 34.00657145182292, 38.162801106770836, 29.612284342447918, 35.68292236328125, + 37.467142740885414, 35.00136311848958, 35.524698893229164 + ], + [ + 86.9696044921875, 63.69411214192709, 53.0816650390625, 60.630371093750014, + 78.22076416015625, 69.14851888020833, 85.76027425130209, 70.29101562499999, + 64.29555257161459, 69.27551269531249, 48.978352864583336, 78.91326904296875, + 59.5826416015625, 60.58410644531249, 61.21638997395833, 55.14892578125001, + 71.46946207682294, 56.715108235677086, 81.68076578776042, 55.567057291666664, + 56.797403971354164, 91.60732014973959, 87.86173502604166, 47.67388916015625, + 86.45062255859375, 60.299173990885414, 71.15541585286459, 73.42549641927084, + 35.33819580078125, 38.273640950520836, 0.0, 35.1629638671875, 36.29404703776042, + 35.246724446614586, 27.394205729166668, 30.727844238281254, 34.42655436197917, + 33.74794514973958, 42.196797688802086, 38.94002278645833, 43.60272216796876, + 35.89227294921875, 35.506388346354164, 33.43461100260417, 39.029947916666664, + 36.709615071614586, 31.36181640625, 35.591776529947914, 38.53515624999999, + 43.60048421223958, 29.126017252604168, 36.913350423177086, 25.662089029947914, + 48.12261962890625, 32.96063232421875, 49.229736328125 + ], + [ + 74.93351236979169, 55.13262939453124, 46.682576497395836, 53.270182291666664, + 67.57273356119791, 59.0382080078125, 74.08616129557291, 58.3436279296875, + 51.861470540364586, 59.07706705729166, 42.62381998697917, 67.04351806640625, + 50.225504557291664, 50.39758300781251, 51.911946614583336, 47.98726399739583, + 60.29380289713542, 49.09670003255208, 69.82464599609375, 48.123331705729164, + 47.356974283854164, 78.68137613932292, 74.87109375, 43.58294677734374, 73.96934000651042, + 51.16758219401042, 60.13267008463542, 62.59570312500001, 32.47239176432291, + 36.14510091145833, 35.1629638671875, 0.0, 35.16510009765625, 32.691385904947914, + 38.989705403645836, 41.676411946614586, 35.0555419921875, 39.040913899739586, + 35.89304606119792, 37.337239583333336, 40.22125244140625, 35.898295084635414, + 32.14619954427083, 34.9779052734375, 37.306640625, 35.34425862630208, 34.86368815104167, + 30.66058349609375, 35.07820638020833, 41.25819905598958, 33.232747395833336, + 34.335225423177086, 31.68182373046875, 42.25067138671875, 33.61053466796875, + 40.9339599609375 + ], + [ + 73.88014729817708, 53.564778645833336, 43.494242350260414, 48.44647216796875, + 65.56917317708333, 56.050313313802086, 72.09757486979167, 58.445414225260414, + 51.81424967447917, 55.79229736328126, 39.76979573567708, 65.21488444010417, + 48.209126790364586, 49.380594889322914, 50.16815185546875, 46.400044759114586, + 58.984700520833336, 45.854410807291664, 68.4075927734375, 46.42364501953125, + 44.44891357421874, 77.81949869791666, 73.82285563151042, 39.14949544270833, + 73.32861328124999, 51.22668457031251, 57.836832682291664, 60.19451904296875, + 29.81013997395833, 30.239278157552082, 36.29404703776042, 35.16510009765625, 0.0, + 32.883544921875, 37.939229329427086, 41.82820638020833, 33.461039225260414, + 35.78771972656249, 35.17073567708333, 32.721171061197914, 34.34993489583333, + 31.120564778645836, 32.960957845052086, 32.301859537760414, 31.68080647786459, + 29.695719401041668, 32.748921712239586, 34.1715087890625, 31.62908935546875, + 36.136759440104164, 35.17022705078125, 32.948649088541664, 35.1724853515625, + 38.424560546875, 33.515421549479164, 34.60614013671874 + ], + [ + 79.41554768880208, 57.7625732421875, 45.526835123697914, 54.036112467447914, + 71.45947265625, 62.74652099609376, 78.93660481770833, 64.85007731119792, + 58.67708333333334, 63.93918863932292, 44.419576009114586, 71.05887858072917, + 53.35968017578126, 54.05621337890624, 55.50506591796875, 51.19850667317708, + 65.36478678385417, 53.00048828125, 74.9713134765625, 50.43927001953126, 49.48541259765625, + 85.1016845703125, 81.49131266276042, 40.67578125000001, 79.5765380859375, + 56.5906982421875, 64.68164062500001, 66.92852783203125, 33.94921875, 35.289774576822914, + 35.246724446614586, 32.691385904947914, 32.883544921875, 0.0, 34.053731282552086, + 37.574055989583336, 33.428934733072914, 33.949991861979164, 38.0577392578125, + 37.36098225911458, 39.3798828125, 31.535685221354164, 33.249125162760414, + 33.84328206380208, 35.402811686197914, 30.604288736979164, 31.53159586588542, + 34.8922119140625, 33.68202718098958, 34.20735677083333, 34.02764892578125, 33.68212890625, + 34.20284016927084, 45.9046630859375, 32.86983235677083, 38.07391357421874 + ], + [ + 97.35892740885416, 74.13861083984375, 59.0860595703125, 67.82613118489583, + 88.38157145182291, 79.08866373697917, 96.49818929036458, 80.50423177083334, + 74.30942789713542, 79.413330078125, 55.500813802083336, 89.52288818359375, + 67.21158854166667, 68.78438313802083, 70.36385091145834, 63.51171875, 82.00722249348959, + 67.12705485026042, 92.51812744140625, 63.491943359375, 64.87760416666667, + 102.75876871744792, 99.51029459635416, 53.719258626302086, 97.81752522786458, + 71.02052815755208, 81.23691813151041, 83.668212890625, 38.41107177734375, + 43.022501627604164, 27.394205729166668, 38.989705403645836, 37.939229329427086, + 34.053731282552086, 0.0, 21.95041910807292, 36.78959147135417, 33.301859537760414, + 46.10504150390625, 43.96919759114583, 47.82358805338541, 35.098368326822914, + 39.062906901041664, 35.538289388020836, 42.370768229166664, 37.06854248046875, + 30.468098958333332, 39.68719482421875, 43.096842447916664, 44.40679931640625, + 30.429199218749996, 40.89508056640624, 30.875752766927086, 55.633687337239586, + 36.647196451822914, 54.8240966796875 + ], + [ + 102.47133382161458, 78.598388671875, 64.25689697265624, 72.30902099609375, + 93.26220703124999, 84.38332112630208, 101.493896484375, 86.10902913411458, + 79.55362955729166, 84.68654378255208, 60.538309733072914, 94.5843505859375, + 72.39548746744792, 73.07769775390625, 75.10764567057292, 68.11916097005209, + 87.06388346354167, 72.5589599609375, 97.5799560546875, 68.58774820963541, + 70.19529215494792, 108.00260416666667, 104.87379964192709, 58.9322509765625, + 102.96162923177084, 76.45414225260416, 86.43379720052083, 88.60093180338542, + 42.802815755208336, 46.595845540364586, 30.727844238281254, 41.676411946614586, + 41.82820638020833, 37.574055989583336, 21.95041910807292, 0.0, 40.045145670572914, + 34.199422200520836, 50.11751302083334, 49.69691975911458, 51.02530924479167, 37.5625, + 43.223246256510414, 39.242411295572914, 45.90456136067708, 40.50671386718751, + 33.60866292317708, 45.789021809895836, 48.186014811197914, 48.28511555989583, + 30.20672607421875, 44.74462890625, 34.5582275390625, 59.74092610677084, 40.1729736328125, + 58.78151448567708 + ], + [ + 77.45182291666667, 57.25604248046875, 45.319498697916664, 51.451863606770836, + 68.67132568359375, 60.35575358072917, 75.92864990234375, 62.282755533854164, + 55.717061360677086, 61.63126627604167, 43.155192057291664, 69.99131266276042, + 49.788004557291664, 51.939534505208336, 53.33447265625001, 49.142985026041664, + 62.19004313151042, 49.04172770182293, 72.08839925130208, 48.54003906249999, + 48.274210611979164, 81.71942138671875, 78.13138834635417, 41.99017333984374, + 77.45302327473958, 54.76991780598959, 61.97479248046874, 64.00362141927083, + 34.013448079427086, 34.48307291666667, 34.42655436197917, 35.0555419921875, + 33.461039225260414, 33.428934733072914, 36.78959147135417, 40.045145670572914, 0.0, + 33.458882649739586, 35.696797688802086, 34.079996744791664, 37.699117024739586, + 35.74688720703125, 33.970784505208336, 34.70458984375, 33.80810546875, 34.270406087239586, + 32.466064453125, 36.79844156901042, 27.004150390625, 33.10337320963542, + 35.851765950520836, 32.546366373697914, 33.35850016276042, 44.321512858072914, + 30.296407063802082, 41.66906738281249 + ], + [ + 87.77813720703125, 65.81209309895833, 53.161112467447914, 59.05169677734376, + 78.73437499999999, 70.82033284505209, 86.38484700520833, 72.06166585286458, + 66.08194986979167, 71.27109781901041, 49.621602376302086, 79.99829101562499, + 58.148783365885414, 59.76409912109375, 61.88441975911458, 56.00266520182292, + 71.95288085937501, 58.46504720052083, 82.33882649739584, 56.98341878255208, + 57.56842041015625, 92.60811360677083, 89.53033447265626, 46.8433837890625, + 87.73811848958333, 64.41365559895834, 72.08931477864583, 74.03525797526042, + 37.33500162760417, 37.51593017578125, 33.74794514973958, 39.040913899739586, + 35.78771972656249, 33.949991861979164, 33.301859537760414, 34.199422200520836, + 33.458882649739586, 0.0, 38.45723470052083, 41.68792724609375, 38.97790527343751, + 31.307657877604164, 39.56077067057292, 36.61484781901042, 34.66986083984375, + 31.894816080729168, 33.368672688802086, 40.740478515625, 39.968404134114586, + 40.36649576822917, 33.057108561197914, 38.64034016927083, 34.58984375, 48.970865885416664, + 31.893676757812504, 48.34084065755208 + ], + [ + 66.27581787109375, 48.87040201822917, 41.109151204427086, 43.39019775390625, + 58.116129557291664, 51.844258626302086, 64.19441731770833, 51.812032063802086, + 46.7060546875, 51.71453857421874, 37.543070475260414, 58.86267089843749, + 42.021870930989586, 43.083964029947914, 44.36676025390624, 43.345235188802086, + 52.443644205729164, 42.22412109375, 61.13309733072916, 41.67193603515625, + 41.62599690755208, 68.286376953125, 65.08518473307292, 39.719767252604164, + 65.35555013020833, 46.53828938802083, 51.73486328125, 53.643208821614586, 35.138916015625, + 33.74953206380208, 42.196797688802086, 35.89304606119792, 35.17073567708333, + 38.0577392578125, 46.10504150390625, 50.11751302083334, 35.696797688802086, + 38.45723470052083, 0.0, 35.543680826822914, 28.904988606770836, 37.982177734375, + 34.53147379557292, 37.53668212890626, 30.735819498697918, 35.53100585937499, + 36.546651204427086, 34.04923502604167, 35.20347086588542, 34.522623697916664, + 41.070332845052086, 33.6051025390625, 40.8319091796875, 33.2647705078125, + 34.759684244791664, 38.373881022135414 + ], + [ + 64.3125, 48.16400146484375, 38.91845703125, 45.17887369791667, 57.780253092447914, + 50.1295166015625, 63.25250244140624, 50.377197265625, 45.92710367838542, + 49.376912434895836, 38.017171223958336, 57.22532145182292, 41.72444661458333, + 44.52693684895833, 44.223795572916664, 43.15531412760417, 50.703592936197914, + 42.89023844401042, 58.78082275390625, 41.005940755208336, 40.576416015625, + 68.48996988932291, 64.30192057291667, 38.55442301432292, 64.74713134765625, + 43.63783772786458, 51.164164225260414, 53.540242513020836, 34.91766357421875, + 30.991373697916668, 38.94002278645833, 37.337239583333336, 32.721171061197914, + 37.36098225911458, 43.96919759114583, 49.69691975911458, 34.079996744791664, + 41.68792724609375, 35.543680826822914, 0.0, 37.57387288411458, 39.87957763671875, + 33.484212239583336, 36.947672526041664, 34.960693359375, 37.49757893880208, + 35.87430826822917, 27.51849365234375, 34.34623209635417, 36.06561279296875, + 41.796061197916664, 31.891866048177086, 39.69561767578125, 40.139180501302086, + 37.406880696614586, 36.509684244791664 + ], + [ + 66.29693603515625, 48.77974446614583, 42.62335205078125, 42.89809163411458, + 58.251708984375, 52.32326253255209, 63.920084635416664, 52.659769694010414, + 48.406697591145836, 51.22760009765626, 40.54681396484375, 58.81624348958333, + 42.32208251953125, 45.461690266927086, 44.17279052734375, 43.61558024088542, + 53.025716145833336, 41.452921549479164, 60.86250813802084, 42.14385986328125, + 43.031107584635414, 69.59785970052083, 65.91709391276041, 41.280476888020836, + 65.1314697265625, 48.144002278645836, 53.491617838541664, 53.44399007161458, + 35.2674560546875, 34.746439615885414, 43.60272216796876, 40.22125244140625, + 34.34993489583333, 39.3798828125, 47.82358805338541, 51.02530924479167, + 37.699117024739586, 38.97790527343751, 28.904988606770836, 37.57387288411458, 0.0, + 34.992919921875, 34.80393473307292, 38.49322509765624, 29.36928304036458, + 31.325398763020836, 38.145121256510414, 37.6641845703125, 37.71514892578125, + 35.4307861328125, 41.84307861328125, 31.818318684895832, 42.243611653645836, + 29.461588541666664, 37.72949218749999, 36.20485432942708 + ], + [ + 83.58766682942709, 61.87076822916667, 51.06744384765626, 56.68129475911459, + 73.7606201171875, 66.72357177734375, 81.97115071614583, 67.93288167317708, + 61.72347005208334, 65.52142333984375, 47.358744303385414, 75.22509765625, + 55.59299723307292, 56.809916178385414, 58.45371500651042, 54.109842936197914, + 68.20125325520833, 54.227132161458336, 78.199951171875, 53.78704833984374, + 53.58538818359375, 88.10982259114583, 84.46242268880208, 46.70031738281251, + 83.54756673177084, 59.86104329427084, 68.30135091145834, 69.55080159505208, + 35.297403971354164, 37.04473876953125, 35.89227294921875, 35.898295084635414, + 31.120564778645836, 31.535685221354164, 35.098368326822914, 37.5625, 35.74688720703125, + 31.307657877604164, 37.982177734375, 39.87957763671875, 34.992919921875, 0.0, + 36.16868082682292, 35.580301920572914, 31.45033772786458, 25.819173177083336, + 32.55950927734375, 37.785807291666664, 38.499369303385414, 39.3543701171875, + 33.389912923177086, 35.0596923828125, 34.0902099609375, 43.98124186197917, + 33.870361328125, 39.53155517578125 + ], + [ + 73.07511393229169, 52.50705973307291, 44.1038818359375, 48.57930501302083, + 64.64341227213542, 55.0386962890625, 71.76536051432292, 56.21586100260416, + 51.20989990234375, 56.04915364583333, 40.13716634114583, 64.31797281901041, + 48.005411783854164, 49.85380045572916, 47.75032552083333, 46.05362955729167, + 58.878560384114586, 46.835184733072914, 66.88348388671875, 43.700032552083336, + 45.8658447265625, 76.92946370442709, 72.42529296875, 39.612162272135414, + 72.22711181640626, 50.09991455078125, 58.10614013671875, 60.448445638020836, + 33.36383056640625, 34.4114990234375, 35.506388346354164, 32.14619954427083, + 32.960957845052086, 33.249125162760414, 39.062906901041664, 43.223246256510414, + 33.970784505208336, 39.56077067057292, 34.53147379557292, 33.484212239583336, + 34.80393473307292, 36.16868082682292, 0.0, 32.85876464843749, 35.315511067708336, + 35.273417154947914, 32.046630859375, 30.338073730468754, 35.35050455729167, + 35.86456298828125, 34.97493489583333, 30.010681152343746, 33.07598876953125, + 37.32212320963542, 31.575907389322918, 39.56058756510417 + ], + [ + 76.015625, 55.492451985677086, 43.321818033854164, 50.06490071614583, 68.99367268880208, + 58.364664713541664, 75.07025146484376, 61.5576171875, 54.88429768880208, + 59.21516927083333, 41.73612467447917, 68.44765218098958, 50.6915283203125, + 52.746012369791664, 51.186360677083336, 48.25179036458333, 62.34783935546875, + 50.14394124348959, 71.37078857421875, 45.91149902343749, 48.00939941406249, + 80.87762451171875, 77.603271484375, 41.90374755859375, 76.36391194661458, + 53.53387451171875, 60.80893961588542, 64.15079752604166, 30.64931233723959, + 31.344319661458336, 33.43461100260417, 34.9779052734375, 32.301859537760414, + 33.84328206380208, 35.538289388020836, 39.242411295572914, 34.70458984375, + 36.61484781901042, 37.53668212890626, 36.947672526041664, 38.49322509765624, + 35.580301920572914, 32.85876464843749, 0.0, 34.07076009114583, 32.814717610677086, + 30.681722005208332, 29.798767089843746, 36.433675130208336, 37.57863362630208, + 29.523274739583336, 32.69728597005208, 32.429789225260414, 39.502298990885414, + 33.907246907552086, 42.13566080729167 + ], + [ + 69.94832356770833, 50.11651611328125, 41.43977864583333, 46.54687499999999, + 60.34881591796875, 54.227742513020836, 68.12009684244792, 55.0302734375, + 50.368021647135414, 54.6220703125, 39.16670735677083, 62.01906331380209, + 43.19112141927083, 45.15889485677083, 46.339640299479164, 43.880615234375, + 55.40753173828125, 43.522440592447914, 64.82855224609375, 44.24210611979167, 44.07421875, + 73.91900634765625, 69.79772949218751, 37.94529215494792, 68.94138590494792, + 48.99884033203125, 55.58579508463542, 56.718017578125, 32.394185384114586, + 32.2308349609375, 39.029947916666664, 37.306640625, 31.68080647786459, 35.402811686197914, + 42.370768229166664, 45.90456136067708, 33.80810546875, 34.66986083984375, + 30.735819498697918, 34.960693359375, 29.36928304036458, 31.45033772786458, + 35.315511067708336, 34.07076009114583, 0.0, 30.49566650390625, 34.51912434895833, + 34.892354329427086, 34.03609212239583, 34.13783772786458, 36.57450358072917, + 30.766906738281254, 37.557271321614586, 34.194478352864586, 33.23122151692708, + 36.992919921875 + ], + [ + 77.38962809244791, 56.7164306640625, 45.81199137369792, 51.84796142578124, + 69.6253662109375, 61.14764404296875, 75.9593505859375, 61.68267822265625, + 56.36279296875001, 60.87847900390625, 42.90940348307292, 69.46415201822916, + 50.408793131510414, 52.23468017578125, 53.534159342447914, 49.32175699869792, + 62.70267740885417, 47.85839843750001, 72.9293212890625, 48.97296142578126, + 48.22585042317708, 82.11588541666666, 78.00453694661456, 41.15970865885417, + 77.48266601562499, 54.11258951822917, 62.3670654296875, 64.10036214192708, + 31.582071940104168, 35.562154134114586, 36.709615071614586, 35.34425862630208, + 29.695719401041668, 30.604288736979164, 37.06854248046875, 40.50671386718751, + 34.270406087239586, 31.894816080729168, 35.53100585937499, 37.49757893880208, + 31.325398763020836, 25.819173177083336, 35.273417154947914, 32.814717610677086, + 30.49566650390625, 0.0, 33.42132568359375, 35.81884765625, 34.85105387369791, + 37.44384765625, 33.87469482421875, 34.5244140625, 35.417317708333336, 40.286946614583336, + 32.899739583333336, 38.76186116536458 + ], + [ + 83.38871256510417, 61.40793863932291, 48.0218505859375, 55.774251302083336, + 74.97206624348959, 66.0185546875, 82.61212158203125, 67.78629557291666, 61.41241455078125, + 65.8699951171875, 45.59623209635417, 75.44142659505209, 55.7652587890625, + 56.82698567708333, 56.72306315104167, 52.30570475260417, 68.83087158203125, + 55.49782307942708, 78.77199300130208, 49.75488281250001, 52.21024576822917, + 88.78000895182291, 85.1429443359375, 44.865580240885414, 83.96156819661459, + 59.235249837239586, 67.36016845703125, 70.47029622395833, 33.23610432942708, + 34.459716796875, 31.36181640625, 34.86368815104167, 32.748921712239586, 31.53159586588542, + 30.468098958333332, 33.60866292317708, 32.466064453125, 33.368672688802086, + 36.546651204427086, 35.87430826822917, 38.145121256510414, 32.55950927734375, + 32.046630859375, 30.681722005208332, 34.51912434895833, 33.42132568359375, 0.0, + 34.22625732421875, 37.12280273437501, 36.32464599609375, 29.5322265625, + 31.644266764322918, 29.908955891927082, 44.88755289713542, 32.253560384114586, + 44.374715169270836 + ], + [ + 66.82843017578125, 47.43770345052083, 38.356221516927086, 46.51015218098959, + 61.392049153645836, 51.72955322265625, 66.23848470052084, 52.202128092447914, + 46.521321614583336, 52.61627197265625, 36.63063557942708, 59.72106933593751, + 43.23988850911459, 44.25303141276042, 45.676981608072914, 42.59519449869792, + 54.434244791666664, 43.657389322916664, 62.04500325520833, 42.176534016927086, + 41.651265462239586, 71.68339029947916, 68.11305745442709, 38.7596435546875, + 67.3680419921875, 45.41739908854167, 52.323323567708336, 56.50315348307291, + 33.3050537109375, 33.272359212239586, 35.591776529947914, 30.66058349609375, + 34.1715087890625, 34.8922119140625, 39.68719482421875, 45.789021809895836, + 36.79844156901042, 40.740478515625, 34.04923502604167, 27.51849365234375, + 37.6641845703125, 37.785807291666664, 30.338073730468754, 29.798767089843746, + 34.892354329427086, 35.81884765625, 34.22625732421875, 0.0, 33.809834798177086, + 36.756429036458336, 36.492899576822914, 32.530354817708336, 35.60725911458333, + 36.62886555989583, 32.96439615885417, 37.12921142578125 + ], + [ + 65.72416178385417, 48.20318603515625, 36.442301432291664, 44.99353027343749, + 59.73008219401041, 50.98746744791668, 65.28521728515625, 51.63586425781251, + 45.740336100260414, 51.17586263020833, 36.1629638671875, 59.09889729817708, + 42.849446614583336, 44.41072591145833, 46.231974283854164, 43.527872721354164, + 52.39919026692708, 37.792948404947914, 62.44488525390625, 43.020345052083336, + 41.118733723958336, 70.00860595703125, 65.85164388020834, 37.12314860026042, + 65.46661376953125, 45.09405517578125, 51.73366292317708, 54.21948242187501, + 31.155537923177086, 34.8402099609375, 38.53515624999999, 35.07820638020833, + 31.62908935546875, 33.68202718098958, 43.096842447916664, 48.186014811197914, + 27.004150390625, 39.968404134114586, 35.20347086588542, 34.34623209635417, + 37.71514892578125, 38.499369303385414, 35.35050455729167, 36.433675130208336, + 34.03609212239583, 34.85105387369791, 37.12280273437501, 33.809834798177086, 0.0, + 33.79514567057292, 39.09643554687499, 34.039815266927086, 36.39626057942708, + 40.239237467447914, 33.059183756510414, 37.137288411458336 + ], + [ + 67.26149495442709, 48.904866536458336, 41.04954020182292, 44.438130696614586, + 58.949544270833336, 51.65224202473959, 65.33874511718749, 52.912455240885414, + 49.62190755208333, 54.107442220052086, 40.60117594401042, 58.34716796875, + 42.78175862630208, 45.907694498697914, 46.741231282552086, 44.599100748697914, + 52.902669270833336, 44.3724365234375, 60.505818684895836, 44.694844563802086, + 42.53582763671876, 71.25785319010416, 67.68039957682291, 34.310587565104164, + 66.60648600260416, 49.55387369791666, 54.045043945312514, 55.92356363932292, + 37.514607747395836, 34.00657145182292, 43.60048421223958, 41.25819905598958, + 36.136759440104164, 34.20735677083333, 44.40679931640625, 48.28511555989583, + 33.10337320963542, 40.36649576822917, 34.522623697916664, 36.06561279296875, + 35.4307861328125, 39.3543701171875, 35.86456298828125, 37.57863362630208, + 34.13783772786458, 37.44384765625, 36.32464599609375, 36.756429036458336, + 33.79514567057292, 0.0, 42.28489176432292, 33.27400716145833, 41.83642578125001, + 41.585652669270836, 33.629353841145836, 36.31353759765625 + ], + [ + 87.59427897135417, 64.28444417317708, 51.9554443359375, 58.985270182291664, + 78.91412353515625, 68.86637369791666, 86.63417561848958, 70.70849609375, + 64.91151936848958, 70.01371256510417, 48.465372721354164, 79.74733479817708, + 59.42647298177083, 60.067952473958336, 61.3125, 54.15722656249999, 72.19960530598959, + 58.20855712890625, 82.99110921223958, 55.639119466145836, 56.510498046875, + 92.59560139973959, 89.096923828125, 48.288431803385414, 87.79083251953125, + 61.88494873046875, 71.81479899088542, 74.31180826822916, 29.586893717447918, + 38.162801106770836, 29.126017252604168, 33.232747395833336, 35.17022705078125, + 34.02764892578125, 30.429199218749996, 30.20672607421875, 35.851765950520836, + 33.057108561197914, 41.070332845052086, 41.796061197916664, 41.84307861328125, + 33.389912923177086, 34.97493489583333, 29.523274739583336, 36.57450358072917, + 33.87469482421875, 29.5322265625, 36.492899576822914, 39.09643554687499, + 42.28489176432292, 0.0, 35.36907958984376, 29.74298095703125, 47.01320393880208, + 32.91526285807292, 47.80920410156251 + ], + [ + 69.49810791015625, 49.870035807291664, 42.05792236328125, 46.42327880859375, + 61.358154296875, 53.87428792317708, 67.8555908203125, 55.12176513671876, + 47.814493815104164, 53.398213704427086, 38.882670084635414, 60.97139485677083, + 45.226826985677086, 46.91668701171876, 46.679219563802086, 43.19647216796876, + 54.980550130208336, 45.215779622395836, 63.95552571614583, 42.76153564453126, + 41.89308675130208, 73.38387044270833, 69.03981526692709, 39.77587890625, + 68.52461751302084, 48.03865559895833, 55.244181315104164, 57.02410888671874, + 32.9400634765625, 29.612284342447918, 36.913350423177086, 34.335225423177086, + 32.948649088541664, 33.68212890625, 40.89508056640624, 44.74462890625, 32.546366373697914, + 38.64034016927083, 33.6051025390625, 31.891866048177086, 31.818318684895832, + 35.0596923828125, 30.010681152343746, 32.69728597005208, 30.766906738281254, + 34.5244140625, 31.644266764322918, 32.530354817708336, 34.039815266927086, + 33.27400716145833, 35.36907958984376, 0.0, 30.719645182291668, 35.459187825520836, + 29.951497395833332, 34.17926025390625 + ], + [ + 85.29738362630208, 62.5439453125, 51.18145751953125, 59.25335693359375, 76.511474609375, + 67.17860921223958, 84.046630859375, 69.04909261067709, 61.163818359375, 67.64512125651041, + 47.18487548828125, 76.96907552083334, 58.416524251302086, 59.002217610677086, + 60.14483642578125, 54.321309407552086, 69.88659667968749, 56.164713541666664, + 80.44917805989583, 54.52394612630208, 55.16937255859374, 89.8748779296875, + 86.16656494140625, 46.372477213541664, 85.17138671875, 60.421712239583336, + 69.78666178385417, 72.16440836588542, 34.896158854166664, 35.68292236328125, + 25.662089029947914, 31.68182373046875, 35.1724853515625, 34.20284016927084, + 30.875752766927086, 34.5582275390625, 33.35850016276042, 34.58984375, 40.8319091796875, + 39.69561767578125, 42.243611653645836, 34.0902099609375, 33.07598876953125, + 32.429789225260414, 37.557271321614586, 35.417317708333336, 29.908955891927082, + 35.60725911458333, 36.39626057942708, 41.83642578125001, 29.74298095703125, + 30.719645182291668, 0.0, 45.262491861979164, 30.260782877604168, 44.78074137369792 + ], + [ + 57.812845865885414, 42.868855794270836, 39.947408040364586, 40.84344482421876, + 52.36494954427083, 43.89247639973958, 55.862955729166664, 46.278299967447914, + 41.330281575520836, 44.82309977213542, 38.07318115234375, 51.14786783854167, + 39.78098551432292, 43.57700602213542, 39.546895345052086, 40.38787841796875, + 47.480183919270836, 39.033406575520836, 52.905721028645836, 38.144673665364586, + 39.06064860026042, 60.45483398437501, 57.28037516276041, 41.649658203125, + 55.98811848958333, 41.90966796875, 46.760579427083336, 47.74582926432292, + 40.124471028645836, 37.467142740885414, 48.12261962890625, 42.25067138671875, + 38.424560546875, 45.9046630859375, 55.633687337239586, 59.74092610677084, + 44.321512858072914, 48.970865885416664, 33.2647705078125, 40.139180501302086, + 29.461588541666664, 43.98124186197917, 37.32212320963542, 39.502298990885414, + 34.194478352864586, 40.286946614583336, 44.88755289713542, 36.62886555989583, + 40.239237467447914, 41.585652669270836, 47.01320393880208, 35.459187825520836, + 45.262491861979164, 0.0, 43.399658203125, 34.97780354817708 + ], + [ + 79.28790283203125, 57.52132161458333, 45.67877197265625, 52.744120279947914, + 70.28120930989583, 61.954203287760414, 77.87931315104167, 62.970723470052086, + 57.11918131510417, 62.829325358072914, 44.08262125651042, 71.241455078125, + 52.10748291015624, 52.15081787109374, 54.92336018880208, 50.01788330078125, + 63.86279296875, 50.58121744791667, 73.82588704427083, 50.77284749348959, + 50.520121256510414, 83.58675130208333, 79.47589111328125, 41.318562825520836, + 79.12483723958333, 56.258097330729164, 64.2587890625, 65.93902587890626, + 34.26379394531249, 35.00136311848958, 32.96063232421875, 33.61053466796875, + 33.515421549479164, 32.86983235677083, 36.647196451822914, 40.1729736328125, + 30.296407063802082, 31.893676757812504, 34.759684244791664, 37.406880696614586, + 37.72949218749999, 33.870361328125, 31.575907389322918, 33.907246907552086, + 33.23122151692708, 32.899739583333336, 32.253560384114586, 32.96439615885417, + 33.059183756510414, 33.629353841145836, 32.91526285807292, 29.951497395833332, + 30.260782877604168, 43.399658203125, 0.0, 41.911356608072914 + ], + [ + 57.90551757812501, 41.771097819010414, 39.10432942708333, 40.45947265624999, + 52.61041259765625, 43.745890299479164, 56.32220458984375, 46.828450520833336, + 41.36513264973958, 45.482381184895836, 38.53434244791667, 49.562520345052086, + 39.715738932291664, 41.75573730468749, 41.60437011718749, 41.98714192708333, + 46.55206298828126, 40.46429443359375, 53.36216227213542, 41.11376953125, 36.4952392578125, + 61.663920084635414, 57.68489583333333, 38.171610514322914, 57.85032145182291, + 42.645894368489586, 46.87078857421876, 48.50162760416667, 38.43829345703125, + 35.524698893229164, 49.229736328125, 40.9339599609375, 34.60614013671874, + 38.07391357421874, 54.8240966796875, 58.78151448567708, 41.66906738281249, + 48.34084065755208, 38.373881022135414, 36.509684244791664, 36.20485432942708, + 39.53155517578125, 39.56058756510417, 42.13566080729167, 36.992919921875, + 38.76186116536458, 44.374715169270836, 37.12921142578125, 37.137288411458336, + 36.31353759765625, 47.80920410156251, 34.17926025390625, 44.78074137369792, + 34.97780354817708, 41.911356608072914, 0.0 + ] + ], + "units": "SYS_CNT ticks", + "source": { + "name": "scalar_128MiB_vector_concurrent", + "matrices": { + "path": "benchmarks/ascend950pr_cube_vector_heatmaps_20261006/analysis/scalar_128MiB_vector_concurrent.npz", + "sha256": "c089ba65f70bbab83ba96de0c21a74196fe23fee0ea9b69f0ea334ab890bc8c1", + "bytes": 6480794 + }, + "statistics": { + "path": "benchmarks/ascend950pr_cube_vector_heatmaps_20261006/analysis/scalar_128MiB_vector_concurrent.json", + "sha256": "a1d98ed9f67c83af66c56773f06131adbc5468e770ec003bb13cae810610357a", + "bytes": 55726 + } + }, + "pair_statistics": { + "all_unique_core_pairs": { + "count": 1540, + "mean": 47.85145842316863, + "std": 15.462931483075401, + "quantiles": { + "0.0": 21.95041910807292, + "0.01": 28.896673583984377, + "0.05": 31.139119466145832, + "0.25": 35.31329854329427, + "0.5": 43.193796793619796, + "0.75": 56.741648356119796, + "0.95": 78.91524759928386, + "0.99": 92.16291259765616, + "1.0": 108.00260416666667 + } + }, + "within_decoded_die": { + "count": 756, + "mean": 36.511118947723766, + "std": 5.3322432933774175, + "quantiles": { + "0.0": 21.95041910807292, + "0.01": 27.36714274088542, + "0.05": 29.905665079752602, + "0.25": 33.05262247721354, + "0.5": 35.265716552734375, + "0.75": 38.84220886230469, + "0.95": 47.025299072265625, + "0.99": 54.262149047851565, + "1.0": 59.74092610677084 + } + }, + "between_decoded_die": { + "count": 784, + "mean": 58.78678577449046, + "std": 14.094540239855059, + "quantiles": { + "0.0": 34.310587565104164, + "0.01": 37.91939371744792, + "0.05": 40.47667236328125, + "0.25": 47.469563802083336, + "0.5": 56.342498779296875, + "0.75": 68.11939493815105, + "0.95": 85.27848409016926, + "0.99": 97.6203428141276, + "1.0": 108.00260416666667 + } + } + }, + "dieGroups": [ + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "A", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B", + "B" + ] + } + ], + "color_limits": [0, 113.63708496093749], + "note": "Sorted actual physical IDs; lines mark decoded dies. Matrix entries are access-profile differences, not core-to-core latency or geometric distance.", + "sourceSha256": "851e29c2228e2d93dfda8128e36a3e46bb1f9b1e43410e9a6d6d6708f147b3bf", + "metadata": { + "device": "Ascend950PR_9579", + "footprintBytes": 134217728, + "timer": "SYS_CNT", + "passes": 6, + "coreCounts": { + "cube": 28, + "vector": 56 + }, + "source": "128 MiB scalar controller experiment; full displayed matrices retained without rounding.", + "captureDates": { + "from": "2026-10-06", + "to": "2026-10-07", + "timezone": "Asia/Singapore" + }, + "cann": "9.1.0", + "driver": "25.7.rc1.10" + } +} From 5ed2628799f775aa44ecc093f85b994180b2057a Mon Sep 17 00:00:00 2001 From: Oseltamivir <58582368+Oseltamivir@users.noreply.github.com> Date: Mon, 26 Oct 2026 20:38:09 +0800 Subject: [PATCH 2/4] feat(ubenchx): add Ascend core memory-profile heatmaps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 Cube 与 Vector 的独立和并发访存特征页面,保留 SYS_CNT 单位与解释限制,并同步中英文页面、API 和技能文档。 --- docs/ubenchx-ascend-core-profiles.md | 11 + packages/app/cypress/e2e/ubenchx.cy.ts | 40 +++ .../app/api/v1/views/ubenchx/route.test.ts | 26 +- .../app/src/app/api/v1/views/ubenchx/route.ts | 55 +++- .../app/ubenchx/core-memory-profiles/page.tsx | 36 +++ .../zh/ubenchx/core-memory-profiles/page.tsx | 37 +++ .../ubenchx/CoreMemoryProfilesContent.tsx | 253 ++++++++++++++++++ .../app/src/components/ubenchx/UbenchxHub.tsx | 8 +- .../ubenchx/core-memory-profiles.test.ts | 49 ++++ .../ubenchx/core-memory-profiles.ts | 69 +++++ packages/app/src/lib/api/api-route-catalog.ts | 11 +- .../app/src/lib/views-api/docs/extensions.ts | 21 +- .../skills/inferencex-api/integrity.json | 2 +- .../references/dashboard-views.md | 46 ++-- 14 files changed, 616 insertions(+), 48 deletions(-) create mode 100644 docs/ubenchx-ascend-core-profiles.md create mode 100644 packages/app/src/app/ubenchx/core-memory-profiles/page.tsx create mode 100644 packages/app/src/app/zh/ubenchx/core-memory-profiles/page.tsx create mode 100644 packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx create mode 100644 packages/app/src/components/ubenchx/core-memory-profiles.test.ts create mode 100644 packages/app/src/components/ubenchx/core-memory-profiles.ts diff --git a/docs/ubenchx-ascend-core-profiles.md b/docs/ubenchx-ascend-core-profiles.md new file mode 100644 index 000000000..5ea7b9ce1 --- /dev/null +++ b/docs/ubenchx-ascend-core-profiles.md @@ -0,0 +1,11 @@ +# Ascend scalar-controller memory profiles + +The `core-memory-profiles` view preserves the four 128 MiB matrices from the 6–7 October 2026 (Singapore time) Cube/Vector locality rerun: 28 Cube scalar controllers and 56 Vector scalar controllers, each tested with one active core and with concurrent launches. Both core types use identical scalar pointer-chase instructions on the same allocation. Each address is averaged over six passes before computing the mean absolute difference between two cores' address profiles. + +The data file contains every displayed matrix entry without rounding, the actual physical core-ID lists, the original pair statistics and source hashes. The arrays preserve ID gaps. Runtime-ID die groups divide IDs below 54 from those at or above 54; they do not assign physical coordinates. The frontend and API recompute within/between-group means from unique off-diagonal pairs using the same pure function. A shared 0–113.63708496093749 SYS_CNT-tick color domain applies to all four panels. + +The unit is raw `SYS_CNT ticks`, not `clock64` cycles or nanoseconds. These are profile differences, not direct core-to-core latency, cache-controller distance or a recovered floorplan. The 128 MiB pattern is separate from the smaller-footprint profile classes and independent contention experiments; those extra inferences are not added here. Concurrent launches lack a grid-wide start barrier, and their fine structure is less repeatable than the broad grouping. No cache-sharing claim follows solely from these positive distances. + +The complete displayed data is in `ascend-core-profiles.json`. Its `sourceSha256` identifies the original plotted-data JSON; each panel also retains the hashes of its archived analysis inputs. This publication contains the displayed matrices and aggregate statistics, not every original per-load observation. + +Coverage: `/ubenchx/core-memory-profiles` and its `/zh` sibling show all four panels. Hover, keyboard arrows and pinning only inspect already-returned cells; they do not change data. The hub's new test is available through `/api/v1/views/ubenchx?test=core-memory-profiles`, with `gpu=all` or `gpu=Ascend 950PR_9579`, and as `coreMemoryProfiles` in `test=all`. Explicit device selections leave other unavailable test sections empty. API `unit`, `metric`, `limitations`, `coreIds`, `dieGroups` and `colorLimits` preserve the measurement interpretation. diff --git a/packages/app/cypress/e2e/ubenchx.cy.ts b/packages/app/cypress/e2e/ubenchx.cy.ts index 9a6b5103e..9cddbfbfb 100644 --- a/packages/app/cypress/e2e/ubenchx.cy.ts +++ b/packages/app/cypress/e2e/ubenchx.cy.ts @@ -125,3 +125,43 @@ describe('ubenchX hub and test routes', () => { cy.get('meta[name="robots"]').should('have.attr', 'content').and('contain', 'noindex'); }); }); + +const dismiss = { + onBeforeLoad(win: Cypress.AUTWindow) { + win.localStorage.setItem('inferencex-star-modal-dismissed', String(Date.now())); + }, +}; + +describe('Ascend core memory-access profiles', () => { + it('navigates to all four profiles and inspects actual core IDs by keyboard', () => { + cy.visit('/ubenchx/mem-bw', dismiss); + cy.get('[data-testid="ubenchx-test-select"]').click(); + cy.contains('[role="option"]', 'Core memory-access profiles').click(); + cy.url().should('include', '/ubenchx/core-memory-profiles'); + cy.contains('SYS_CNT ticks are not clock64 cycles').should('be.visible'); + cy.get('[data-testid="profile-scalar_128MiB_cube_isolated"] svg') + .focus() + .trigger('keydown', { key: 'ArrowRight' }); + cy.get('[data-testid="profile-scalar_128MiB_cube_isolated-value"]').should( + 'contain', + '0 ↔ 2: 15.30 SYS_CNT ticks', + ); + cy.get('[data-testid="profile-scalar_128MiB_vector_concurrent"] svg').should('exist'); + cy.screenshot('ascend-core-profiles-en', { capture: 'fullPage' }); + cy.visit('/zh/ubenchx/core-memory-profiles', dismiss); + cy.contains('h2', '核心访存特征').should('be.visible'); + cy.get('[data-testid="ubenchx-test-select"]').should('contain', '核心访存特征'); + cy.contains('不是核心间通信延迟').should('be.visible'); + cy.contains('没有网格级起始同步屏障').should('be.visible'); + cy.screenshot('ascend-core-profiles-zh', { capture: 'fullPage' }); + }); + it('returns the displayed matrix values and preserves absent GPU measurements', () => { + cy.request('/api/v1/views/ubenchx?test=all&gpu=Ascend%20950PR_9579').then(({ body }) => { + const panel = body.coreMemoryProfiles.gpus[0].panels[0]; + expect(panel.coreIds.slice(12, 16)).to.deep.equal([14, 15, 54, 55]); + expect(panel.matrix[0][14]).to.be.closeTo(96.70648193359, 1e-8); + expect(panel.unit).to.equal('SYS_CNT ticks'); + expect(body.smL2Distance.gpus).to.deep.equal([]); + }); + }); +}); diff --git a/packages/app/src/app/api/v1/views/ubenchx/route.test.ts b/packages/app/src/app/api/v1/views/ubenchx/route.test.ts index bd0032b5f..e7872e6eb 100644 --- a/packages/app/src/app/api/v1/views/ubenchx/route.test.ts +++ b/packages/app/src/app/api/v1/views/ubenchx/route.test.ts @@ -24,7 +24,7 @@ describe('ubenchx view', () => { expect(body.view).toBe('ubenchx'); expect(body.apiVersion).toBe('v1'); expect(body.test).toBe('all'); - expect(body.tests).toEqual(['mem-bw', 'sm-l2-distance', 'tpc-skyline']); + expect(body.tests).toEqual(['mem-bw', 'sm-l2-distance', 'tpc-skyline', 'core-memory-profiles']); expect(body.memBw.gpus).toHaveLength(1); expect(body.smL2Distance.gpus.length).toBeGreaterThanOrEqual(1); expect(body.tpcSkyline.gpus).toHaveLength(Object.keys(TPC_SKYLINE_RUNS).length); @@ -158,3 +158,27 @@ describe('ubenchx view', () => { expect(h200Last.mbuPercent).toBeCloseTo((4305.39 / 4800) * 100, 4); }); }); + +it('returns the Ascend core profiles with raw timer units and leaves unavailable tests empty', async () => { + const response = await GET(request({ test: 'all', gpu: 'ascend 950pr_9579' })); + expect(response.status).toBe(200); + const body = await response.json(); + expect(body.memBw.gpus).toEqual([]); + expect(body.smL2Distance.gpus).toEqual([]); + expect(body.tpcSkyline.gpus).toEqual([]); + const run = body.coreMemoryProfiles.gpus[0]; + expect(run.gpu).toBe('Ascend 950PR_9579'); + expect(run.panels.map((panel: { coreIds: number[] }) => panel.coreIds.length)).toEqual([ + 28, 28, 56, 56, + ]); + expect(run.panels[0].unit).toBe('SYS_CNT ticks'); + expect(run.panels[0].coreIds.slice(12, 16)).toEqual([14, 15, 54, 55]); + expect(run.panels[0].stats.withinDieGroupMean).toBeCloseTo(18.55499211685, 8); + expect(run.panels[0].stats.betweenDieGroupMean).toBeCloseTo(93.12987720723, 8); + expect(run.panels[0].matrix[0][14]).toBeCloseTo(96.70648193359, 8); + const onlyResponse = await GET(request({ test: 'core-memory-profiles' })); + const only = await onlyResponse.json(); + expect(only.gpus).toEqual(body.coreMemoryProfiles.gpus); + const missing = await GET(request({ test: 'core-memory-profiles', gpu: 'H100 SXM' })); + expect(missing.status).toBe(400); +}); diff --git a/packages/app/src/app/api/v1/views/ubenchx/route.ts b/packages/app/src/app/api/v1/views/ubenchx/route.ts index 22b6fff9a..29ef2b8ad 100644 --- a/packages/app/src/app/api/v1/views/ubenchx/route.ts +++ b/packages/app/src/app/api/v1/views/ubenchx/route.ts @@ -1,3 +1,4 @@ +import { CORE_PROFILE_GPU, coreMemoryProfiles } from '@/components/ubenchx/core-memory-profiles'; import { SM_L2_RUNS } from '@/components/ubenchx/sm-l2-data'; import { transformSmL2Run } from '@/components/ubenchx/sm-l2-transform'; import { TPC_SKYLINE_RUNS } from '@/components/ubenchx/tpc-skyline-data'; @@ -12,7 +13,12 @@ import type { NextRequest } from 'next/server'; export const dynamic = 'force-dynamic'; -const AVAILABLE_TESTS = ['mem-bw', 'sm-l2-distance', 'tpc-skyline'] as const; +const AVAILABLE_TESTS = [ + 'mem-bw', + 'sm-l2-distance', + 'tpc-skyline', + 'core-memory-profiles', +] as const; /** TPC per GPC groupings for every GPU (`gpu=all`, the default) or one GPU. */ function tpcSkylineResults(gpu: string) { @@ -28,6 +34,19 @@ export function GET(request: NextRequest) { const test = parseEnumParam(s.get('test'), 'test', ['all', ...AVAILABLE_TESTS], 'all'); const rawGpu = s.get('gpu'); + if (test === 'core-memory-profiles') { + const gpu = parseEnumParam(rawGpu, 'gpu', ['all', CORE_PROFILE_GPU], CORE_PROFILE_GPU); + return Promise.resolve( + cachedJson({ + apiVersion: 'v1', + view: 'ubenchx', + test, + params: { test, gpu }, + gpus: [coreMemoryProfiles()], + }), + ); + } + if (test === 'tpc-skyline') { const gpuKeys = Object.keys(TPC_SKYLINE_RUNS); const gpu = parseEnumParam(s.get('gpu'), 'gpu', ['all', ...gpuKeys], 'all'); @@ -43,13 +62,18 @@ export function GET(request: NextRequest) { } if (test === 'mem-bw' || test === 'all') { - const gpuKeys = Object.keys(UBENCHX_RUNS); + const gpuKeys = + test === 'all' + ? [...Object.keys(UBENCHX_RUNS), CORE_PROFILE_GPU] + : Object.keys(UBENCHX_RUNS); const gpu = parseEnumParam(s.get('gpu'), 'gpu', ['all', ...gpuKeys], gpuKeys[0]); const memBwResults = gpu === 'all' ? Object.entries(UBENCHX_RUNS).map(([key, run]) => transformUbenchxRun(key, run)) - : [transformUbenchxRun(gpu, UBENCHX_RUNS[gpu])]; + : UBENCHX_RUNS[gpu] + ? [transformUbenchxRun(gpu, UBENCHX_RUNS[gpu])] + : []; if (test === 'mem-bw') { return Promise.resolve( @@ -64,13 +88,11 @@ export function GET(request: NextRequest) { } // test === 'all': return every test - const smL2GpuKeys = Object.keys(SM_L2_RUNS); - const smL2Gpu = parseEnumParam(s.get('gpu'), 'gpu', ['all', ...smL2GpuKeys], 'all'); const smL2Results = - smL2Gpu === 'all' + rawGpu === null || gpu === 'all' ? Object.entries(SM_L2_RUNS).map(([key, run]) => transformSmL2Run(key, run)) - : SM_L2_RUNS[smL2Gpu] - ? [transformSmL2Run(smL2Gpu, SM_L2_RUNS[smL2Gpu])] + : SM_L2_RUNS[gpu] + ? [transformSmL2Run(gpu, SM_L2_RUNS[gpu])] : []; return Promise.resolve( @@ -82,14 +104,21 @@ export function GET(request: NextRequest) { tests: AVAILABLE_TESTS, memBw: { gpus: memBwResults }, smL2Distance: { gpus: smL2Results }, + coreMemoryProfiles: { + gpus: + rawGpu === null || gpu === 'all' || gpu === CORE_PROFILE_GPU + ? [coreMemoryProfiles()] + : [], + }, // Like smL2Distance, default to every GPU rather than mem-bw's first one, and // match the GPU key case-insensitively as parseEnumParam does for the others. tpcSkyline: { - gpus: tpcSkylineResults( - Object.keys(TPC_SKYLINE_RUNS).find( - (key) => key.toLowerCase() === rawGpu?.toLowerCase(), - ) ?? 'all', - ), + gpus: + rawGpu === null || gpu === 'all' + ? tpcSkylineResults('all') + : TPC_SKYLINE_RUNS[gpu] + ? tpcSkylineResults(gpu) + : [], }, }), ); diff --git a/packages/app/src/app/ubenchx/core-memory-profiles/page.tsx b/packages/app/src/app/ubenchx/core-memory-profiles/page.tsx new file mode 100644 index 000000000..76835194f --- /dev/null +++ b/packages/app/src/app/ubenchx/core-memory-profiles/page.tsx @@ -0,0 +1,36 @@ +import type { Metadata } from 'next'; + +import { CoreMemoryProfilesContent } from '@/components/ubenchx/CoreMemoryProfilesContent'; +import { UbenchxHub } from '@/components/ubenchx/UbenchxHub'; +import { enAlternates } from '@/lib/i18n/i18n'; +import { SITE_URL } from '@semianalysisai/inferencex-constants'; + +const TITLE = 'ubenchX: Core memory-access profiles'; +const DESCRIPTION = + 'Measured 128 MiB memory-access profile differences for Ascend 950PR Cube and Vector scalar controllers, with isolated and concurrent launches.'; + +export const metadata: Metadata = { + title: TITLE, + description: DESCRIPTION, + alternates: enAlternates('/ubenchx/core-memory-profiles'), + robots: { index: false, follow: false }, + openGraph: { + title: `${TITLE} | InferenceX`, + description: DESCRIPTION, + url: `${SITE_URL}/ubenchx/core-memory-profiles`, + }, + twitter: { title: `${TITLE} | InferenceX`, description: DESCRIPTION }, +}; + +export default function UbenchxCoreMemoryProfilesPage() { + return ( +
+
+
+ + +
+
+
+ ); +} diff --git a/packages/app/src/app/zh/ubenchx/core-memory-profiles/page.tsx b/packages/app/src/app/zh/ubenchx/core-memory-profiles/page.tsx new file mode 100644 index 000000000..aa5b423b2 --- /dev/null +++ b/packages/app/src/app/zh/ubenchx/core-memory-profiles/page.tsx @@ -0,0 +1,37 @@ +import type { Metadata } from 'next'; + +import { CoreMemoryProfilesContent } from '@/components/ubenchx/CoreMemoryProfilesContent'; +import { UbenchxHub } from '@/components/ubenchx/UbenchxHub'; +import { zhAlternates, ZH_OG_LOCALE } from '@/lib/i18n/i18n'; +import { SITE_URL } from '@semianalysisai/inferencex-constants'; + +const TITLE = 'ubenchX:核心访存特征'; +const DESCRIPTION = + '展示 Ascend 950PR 的 Cube 与 Vector 标量控制器在 128 MiB 内存上的访存特征差异,包含单核执行与并发启动结果。'; + +export const metadata: Metadata = { + title: TITLE, + description: DESCRIPTION, + alternates: zhAlternates('/ubenchx/core-memory-profiles'), + robots: { index: false, follow: false }, + openGraph: { + title: `${TITLE} | InferenceX`, + description: DESCRIPTION, + url: `${SITE_URL}/zh/ubenchx/core-memory-profiles`, + locale: ZH_OG_LOCALE, + }, + twitter: { title: `${TITLE} | InferenceX`, description: DESCRIPTION }, +}; + +export default function UbenchxCoreMemoryProfilesPageZh() { + return ( +
+
+
+ + +
+
+
+ ); +} diff --git a/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx b/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx new file mode 100644 index 000000000..0d1749b29 --- /dev/null +++ b/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx @@ -0,0 +1,253 @@ +'use client'; + +import * as d3 from 'd3'; +import { useMemo, useState } from 'react'; +import { track } from '@/lib/analytics/analytics'; +import { useLocale } from '@/lib/i18n/use-locale'; +import { coreMemoryProfiles, type CoreProfilePanel } from './core-memory-profiles'; + +const STRINGS = { + en: { + noPairs: 'No pairs', + title: 'Core memory-access profiles', + subtitle: 'Ascend 950PR_9579 · 128 MiB · Cube and Vector scalar controllers', + isolated: 'One active core', + concurrent: 'Concurrent launch', + core: 'Physical core ID', + units: 'Mean absolute difference (SYS_CNT ticks)', + within: 'Within decoded die group', + between: 'Between decoded die groups', + instructions: + 'Hover or focus a heatmap; use arrow keys to inspect core pairs. Click or press Enter to pin, Escape to clear.', + method: + 'Both core types execute the same scalar pointer chase on one allocation. Six passes are averaged at each matched address, then the mean absolute difference between each pair of core profiles is computed.', + limits: + 'These values are differences between memory-access profiles, not core-to-core latency, wire distance or physical coordinates. SYS_CNT ticks are not clock64 cycles or nanoseconds. Runtime IDs contain gaps; their numeric spacing is not geometric spacing.', + concurrentLimit: + 'Concurrent launches have no grid-wide starting barrier. Their fine structure is less repeatable than the broad grouping; these panels do not establish which cores physically share a cache.', + source: 'Source data', + methodology: 'Methodology', + selected: 'Selected core pair', + sharedScale: 'All four panels use the same color scale.', + }, + zh: { + noPairs: '无核心对', + title: '核心访存特征', + subtitle: 'Ascend 950PR_9579 · 128 MiB · Cube 与 Vector 标量控制器', + isolated: '单个核心执行', + concurrent: '并发启动', + core: '物理核心 ID', + units: '平均绝对差(SYS_CNT ticks)', + within: '解码出的同一 die 分组内', + between: '解码出的不同 die 分组间', + instructions: '悬停或聚焦热力图,用方向键查看核心对;点击或按 Enter 固定,按 Escape 清除。', + method: + '两类核心在同一块分配的内存上执行相同的标量指针追踪。先在每个对应地址上对六次遍历取平均,再计算每对核心访存特征之间的平均绝对差。', + limits: + '数值表示访存特征之间的差异,不是核心间通信延迟、连线距离或物理坐标。SYS_CNT ticks 不等同于 clock64 周期或纳秒。运行时 ID 存在空缺,数值间距不代表空间距离。', + concurrentLimit: + '并发启动没有网格级起始同步屏障。相比整体分组,细节模式的可重复性较弱;这些图不能确定哪些核心在物理上共享缓存。', + source: '数据来源', + methodology: '测试方法', + selected: '选中的核心对', + sharedScale: '四幅图使用相同的色标范围。', + }, +} as const; + +type Copy = (typeof STRINGS)[keyof typeof STRINGS]; +function Panel({ panel, max, text }: { panel: CoreProfilePanel; max: number; text: Copy }) { + const [cell, setCell] = useState<[number, number] | null>(null); + const [pinned, setPinned] = useState(false); + const n = panel.coreIds.length, + extent = 320, + start = 54, + top = 22, + step = extent / n; + const colors = useMemo(() => d3.scaleSequential(d3.interpolateReds).domain([0, max]), [max]); + const ticks = [ + ...new Set([0, Math.floor(n / 4), Math.floor(n / 2), Math.floor((3 * n) / 4), n - 1]), + ]; + const id = `profile-${panel.condition}`; + const choose = (pair: [number, number]) => { + setCell(pair); + setPinned(true); + track('ubenchx_core_profile_cell_selected', { + condition: panel.condition, + row: panel.coreIds[pair[0]], + column: panel.coreIds[pair[1]], + }); + }; + return ( +
+

+ {panel.coreType === 'cube' ? 'Cube' : 'Vector'} · {text[panel.launchMode]} +

+ { + if (!cell) setCell([0, 1]); + }} + onPointerMove={(event) => { + if (pinned) return; + const box = event.currentTarget.getBoundingClientRect(); + const j = Math.floor((((event.clientX - box.left) * 420) / box.width - start) / step); + const i = Math.floor((((event.clientY - box.top) * 420) / box.height - top) / step); + if (i >= 0 && j >= 0 && i < n && j < n) setCell([i, j]); + }} + onClick={() => { + if (cell) choose(cell); + }} + onKeyDown={(event) => { + if (event.key === 'Escape') { + setPinned(false); + setCell(null); + return; + } + if (event.key === 'Enter' && cell) { + choose(cell); + return; + } + const delta: Record = { + ArrowUp: [-1, 0], + ArrowDown: [1, 0], + ArrowLeft: [0, -1], + ArrowRight: [0, 1], + }; + if (delta[event.key]) { + event.preventDefault(); + const [i, j] = cell ?? [0, 0]; + const [di, dj] = delta[event.key]; + setPinned(false); + setCell([Math.max(0, Math.min(n - 1, i + di)), Math.max(0, Math.min(n - 1, j + dj))]); + } + }} + > + {`${panel.coreType} ${text[panel.launchMode]}`} + {panel.matrix.flatMap((row, i) => + row.map((value, j) => ( + + )), + )} + + + {ticks.map((i) => ( + + + {panel.coreIds[i]} + + + {panel.coreIds[i]} + + + ))} + + {text.core} + + + {text.core} + + {cell && ( + + )} + + + {cell + ? `${text.selected}: ${panel.coreIds[cell[0]]} ↔ ${panel.coreIds[cell[1]]}: ${panel.matrix[cell[0]][cell[1]].toFixed(2)} SYS_CNT ticks` + : text.instructions} + +

+ {text.within}: {panel.stats.withinDieGroupMean?.toFixed(2) ?? text.noPairs} · {text.between} + : {panel.stats.betweenDieGroupMean?.toFixed(2) ?? text.noPairs} SYS_CNT ticks +

+
+ ); +} + +export function CoreMemoryProfilesContent() { + const locale = useLocale(), + t = STRINGS[locale]; + const result = useMemo(coreMemoryProfiles, []); + return ( +
+
+

{t.title}

+

{t.subtitle}

+
+

{t.limits}

+
+

{t.units}

+
`${d3.interpolateReds(i / 10)} ${i * 10}%`).join(', ')})`, + }} + /> +
+ 0 + {result.colorLimits[1].toFixed(2)} +
+

{t.sharedScale}

+
+
+ {result.panels.map((panel) => ( + + ))} +
+
+

{t.methodology}

+

{t.method}

+

{t.concurrentLimit}

+ + {t.source} + +
+
+ ); +} diff --git a/packages/app/src/components/ubenchx/UbenchxHub.tsx b/packages/app/src/components/ubenchx/UbenchxHub.tsx index 1b21c350e..e8269169d 100644 --- a/packages/app/src/components/ubenchx/UbenchxHub.tsx +++ b/packages/app/src/components/ubenchx/UbenchxHub.tsx @@ -16,21 +16,24 @@ import { useLocale } from '@/lib/i18n/use-locale'; const STRINGS = { en: { title: 'ubenchX Microbenchmarks (Beta)', - subtitle: 'Low-level GPU microbenchmarks measuring fundamental hardware characteristics.', + subtitle: + 'Low-level accelerator microbenchmarks measuring fundamental hardware characteristics.', test: 'Microbenchmark', testTooltip: 'The ubenchX microbenchmark to display.', memBwTitle: 'HBM Bandwidth', smL2Title: 'SM-SM L2 Latency Difference', tpcSkylineTitle: 'TPC Skyline', + coreProfilesTitle: 'Core memory-access profiles', }, zh: { title: 'ubenchX 微基准测试(Beta)', - subtitle: '底层 GPU 微基准测试,测量基础硬件特性。', + subtitle: '底层加速器微基准测试,测量基础硬件特性。', test: '微基准测试', testTooltip: '要显示的 ubenchX 微基准测试。', memBwTitle: 'HBM 带宽', smL2Title: 'SM 间 L2 延迟差异', tpcSkylineTitle: 'TPC Skyline', + coreProfilesTitle: '核心访存特征', }, } as const; @@ -38,6 +41,7 @@ export const UBENCHX_TESTS = [ { slug: 'mem-bw', titleKey: 'memBwTitle' }, { slug: 'sm-l2-distance', titleKey: 'smL2Title' }, { slug: 'tpc-skyline', titleKey: 'tpcSkylineTitle' }, + { slug: 'core-memory-profiles', titleKey: 'coreProfilesTitle' }, ] as const; export type UbenchxTestSlug = (typeof UBENCHX_TESTS)[number]['slug']; diff --git a/packages/app/src/components/ubenchx/core-memory-profiles.test.ts b/packages/app/src/components/ubenchx/core-memory-profiles.test.ts new file mode 100644 index 000000000..d63e2276b --- /dev/null +++ b/packages/app/src/components/ubenchx/core-memory-profiles.test.ts @@ -0,0 +1,49 @@ +import { describe, expect, it } from 'vitest'; +import { summarizeCoreProfile } from './core-memory-profiles'; + +describe('core profile pair statistics', () => { + it('averages unique off-diagonal pairs in their decoded groups', () => { + const result = summarizeCoreProfile( + [ + [0, 2, 8], + [2, 0, 10], + [8, 10, 0], + ], + ['A', 'A', 'B'], + ); + expect(result).toEqual({ withinDieGroupMean: 2, betweenDieGroupMean: 9 }); + }); + it('rejects malformed, asymmetric and nonfinite measurements', () => { + expect(() => summarizeCoreProfile([[0, 2]], ['A'])).toThrow('dimensions'); + expect(() => + summarizeCoreProfile( + [ + [0, 2], + [3, 0], + ], + ['A', 'B'], + ), + ).toThrow('symmetric'); + expect(() => + summarizeCoreProfile( + [ + [0, NaN], + [NaN, 0], + ], + ['A', 'B'], + ), + ).toThrow('Invalid'); + }); +}); + +it('preserves an absent pair class instead of inventing a zero measurement', () => { + expect( + summarizeCoreProfile( + [ + [0, 8], + [8, 0], + ], + ['A', 'B'], + ), + ).toEqual({ withinDieGroupMean: null, betweenDieGroupMean: 8 }); +}); diff --git a/packages/app/src/components/ubenchx/core-memory-profiles.ts b/packages/app/src/components/ubenchx/core-memory-profiles.ts new file mode 100644 index 000000000..c083f383d --- /dev/null +++ b/packages/app/src/components/ubenchx/core-memory-profiles.ts @@ -0,0 +1,69 @@ +import data from './data/ascend-core-profiles.json'; + +export const CORE_PROFILE_GPU = 'Ascend 950PR_9579'; +export interface CoreProfilePanel { + readonly condition: string; + readonly coreType: 'cube' | 'vector'; + readonly launchMode: 'isolated' | 'concurrent'; + readonly coreIds: readonly number[]; + readonly dieGroups: readonly string[]; + readonly matrix: readonly (readonly number[])[]; + readonly unit: 'SYS_CNT ticks'; + readonly stats: { + readonly withinDieGroupMean: number | null; + readonly betweenDieGroupMean: number | null; + }; +} + +const mean = (xs: number[]) => (xs.length > 0 ? xs.reduce((a, b) => a + b, 0) / xs.length : null); + +export function summarizeCoreProfile( + matrix: readonly (readonly number[])[], + groups: readonly string[], +) { + if (matrix.length !== groups.length || matrix.some((row) => row.length !== groups.length)) { + throw new Error('Core profile dimensions do not match the ID groups'); + } + const within: number[] = [], + between: number[] = []; + matrix.forEach((row, i) => + row.forEach((value, j) => { + if (!Number.isFinite(value) || value < 0 || (i === j && value !== 0)) + throw new Error('Invalid profile distance'); + if (Math.abs(value - matrix[j][i]) > 1e-8) + throw new Error('Profile matrix must be symmetric'); + if (i < j) (groups[i] === groups[j] ? within : between).push(value); + }), + ); + return { withinDieGroupMean: mean(within), betweenDieGroupMean: mean(between) }; +} + +export function coreMemoryProfiles() { + const panels: CoreProfilePanel[] = data.panels.map((panel) => ({ + condition: panel.condition, + coreType: panel.condition.includes('_cube_') ? 'cube' : 'vector', + launchMode: panel.condition.endsWith('_isolated') ? 'isolated' : 'concurrent', + coreIds: panel.coreids, + dieGroups: panel.dieGroups, + matrix: panel.matrix, + unit: 'SYS_CNT ticks', + stats: summarizeCoreProfile(panel.matrix, panel.dieGroups), + })); + return { + gpu: CORE_PROFILE_GPU, + metadata: data.metadata, + panels, + colorLimits: data.color_limits, + sourceSha256: data.sourceSha256, + sourceUrl: + 'https://github.com/SemiAnalysisAI/InferenceX-app/blob/1de1fe014f05cdfb4fd029f5bd6d547a0ffbbdc7/packages/app/src/components/ubenchx/data/ascend-core-profiles.json', + metric: + 'Mean absolute difference between matched-address latency profiles after averaging six passes per address', + limitations: [ + 'Not core-to-core communication latency or geometric distance', + 'SYS_CNT ticks are not calibrated to clock64 cycles or nanoseconds', + 'Concurrent launches have no grid-wide starting barrier; their fine structure is less repeatable', + 'Runtime-ID die groups are not a recovered physical floorplan', + ], + }; +} diff --git a/packages/app/src/lib/api/api-route-catalog.ts b/packages/app/src/lib/api/api-route-catalog.ts index 96a7d18d8..9bdd1acba 100644 --- a/packages/app/src/lib/api/api-route-catalog.ts +++ b/packages/app/src/lib/api/api-route-catalog.ts @@ -518,7 +518,7 @@ export const apiRouteCatalog = [ method: 'GET', classification: 'published-read', operationId: 'get-ubenchx-view', - sourceSha256: '237d7b2f095786cea52f8d65eaed73a4f091fa880803809271e2542b0d62b4d9', + sourceSha256: '9ecf85848715cddf23b32f74d2f6ede9ee1f33a87e95447d2898532c2f1ac60a', }, { source: 'src/app/api/v1/operatorx/runs/route.ts', @@ -1158,6 +1158,15 @@ export interface ApiContractSourceDigest { * touching a route module. Digest changes require an explicit documentation review. */ export const apiContractSourceDigests = [ + { + source: 'src/components/ubenchx/core-memory-profiles.ts', + sourceSha256: '33e66e68f44e8382bc3b09f33c89f96caeaa011d5171958c4c0f9c1cd98178fb', + reviewArea: { + en: 'ubenchX Huawei measurement units, protocol metadata and shared UI/API calculations.', + zh: 'ubenchX Huawei 测量单位、协议元数据及界面与 API 共用的计算。', + }, + }, + { source: 'src/lib/catalog/gpu-specs.ts', sourceSha256: 'fb9dc719f347fb5b73ea73cf35a19d12c640b34a284f31cd70a8b9b2df76b4fd', diff --git a/packages/app/src/lib/views-api/docs/extensions.ts b/packages/app/src/lib/views-api/docs/extensions.ts index 8866d32e6..888724956 100644 --- a/packages/app/src/lib/views-api/docs/extensions.ts +++ b/packages/app/src/lib/views-api/docs/extensions.ts @@ -361,8 +361,8 @@ const PARAMETER_NOTES: Record = { 'GPU 键,如 "H100 SXM";默认首个可用 GPU。设为 "all" 返回全部 GPU。', ], test: [ - 'ubenchX test selector: mem-bw, sm-l2-distance, tpc-skyline, or all (default). Determines which benchmark data is returned.', - 'ubenchX 测试选择:mem-bw、sm-l2-distance、tpc-skyline 或 all(默认),决定返回哪种基准测试数据。', + 'ubenchX test selector: mem-bw, sm-l2-distance, tpc-skyline, core-memory-profiles, or all (default). Determines which benchmark data is returned.', + 'ubenchX 测试选择:mem-bw、sm-l2-distance、tpc-skyline、core-memory-profiles 或 all(默认),决定返回哪种基准测试数据。', ], view: ['Video results (default) or tradeoff.', '视频 results(默认)或 tradeoff。'], }; @@ -503,9 +503,16 @@ const NEW_VIEWS = { }, ], ubenchx: [ - 'ubenchX microbenchmarks (mem-bw, sm-l2-distance, and tpc-skyline)', - 'ubenchX 微基准测试(mem-bw、sm-l2-distance 和 tpc-skyline)', - { gpus: objects, tests: strings, memBw: object, smL2Distance: object, tpcSkyline: object }, + 'ubenchX microbenchmarks (mem-bw, sm-l2-distance, tpc-skyline, and core-memory-profiles)', + 'ubenchX 微基准测试(mem-bw、sm-l2-distance、tpc-skyline 和 core-memory-profiles)', + { + gpus: objects, + tests: strings, + memBw: object, + smL2Distance: object, + tpcSkyline: object, + coreMemoryProfiles: object, + }, ], } as const; @@ -519,7 +526,7 @@ export const operations: ApiOperation[] = Object.entries(NEW_VIEWS).map( path: `/api/v1/views/${view}`, summary: text(en, zh), description: text( - `Read-only ${en.toLowerCase()} using the dashboard's source handlers and calculation helpers. Unknown and repeated query keys return 400. The response includes resolved params and preserves missing evidence. Renderer-only styling is not an API parameter.${ + `Read-only ${en.toLowerCase()} using the dashboard's source handlers and calculation helpers. Unknown and repeated query keys return 400. The response includes resolved params and preserves missing evidence. Renderer-only styling is not an API parameter.${view === 'ubenchx' ? ' core-memory-profiles returns panels with actual coreIds, dieGroups, full matrices, raw SYS_CNT tick units and unique-pair within/between-group statistics; a missing pair class is null. Shared colorLimits and limitations preserve the interpretation. These are profile differences, not core-to-core latency or a floorplan.' : ''}${ view === 'video' ? ' Only already published artifacts are read. Cell, phase, slot and GPU-basis choices select result evidence and normalized serving rates; x/y/cost/workload filters produce computed tradeoff points. Local bundles and arbitrary URLs are excluded. Responses are no-store.' : view === 'current-inferencex-image' @@ -528,7 +535,7 @@ export const operations: ApiOperation[] = Object.entries(NEW_VIEWS).map( ? ' Telemetry comes from one source per run: its stored DB series once the run is ingested, otherwise its GitHub artifacts. Stored coverage describes the entire run: complete means the recorded artifact/file inventory is present, partial means recorded telemetry is missing, and unknown means no complete inventory was retained; missingArtifacts names entirely missing artifacts and may be empty when only a file is incomplete. GitHub coverage is null (unassessed). Responses use private, no-store; an upstream database failure remains HTTP 503 rather than an empty dataset. File/host series retain separate identities. Raw rows and charts respect selected GPU indices. Statistics cover every chip of the selected file/host series, including startup and warmup, and are computed from its samples on each read; a stored series whose samples do not match its recorded sample count returns none. Mean is sample-weighted, P50/P95/P99 interpolate linearly at p*(N-1), and standard deviation divides by N. These statistics are not serving-window power or J/token. Line time remains relative to the first sample across all chips; missing metric readings are omitted rather than zero-filled. Correlations require both readings. This endpoint projects the raw GPU-metrics explorer, not the inference Power Timeline. Timeline role/window evidence comes from its existing series=power read plus benchmark power_audit. Timeline i_ptaxis, i_ptlines, i_ptwindow, i_ptfocus, i_ptutility and i_ptconc share fields control client rendering only and are not accepted here; they do not change raw telemetry or full-record statistics.' : '' }`, - `只读${zh},使用仪表板的数据读取和计算函数。未知或重复查询键返回 400;响应包含解析后的参数,保留缺失数据。仅影响样式的控件不作为 API 参数。${ + `只读${zh},使用仪表板的数据读取和计算函数。未知或重复查询键返回 400;响应包含解析后的参数,保留缺失数据。仅影响样式的控件不作为 API 参数。${view === 'ubenchx' ? ' core-memory-profiles 返回各面板的实际 coreIds、dieGroups、完整矩阵、原始 SYS_CNT tick 单位及去重核心对的组内和组间统计;没有对应核心对时为 null。colorLimits 和 limitations 保留统一色标及解释限制。这些数据是访存特征差异,不是核心间通信延迟或物理布局图。' : ''}${ view === 'video' ? ' 仅读取已发布产物。cell、阶段、slot 和 GPU 口径选择对应结果证据,并计算 serving 归一化速率;x/y、成本及工作负载筛选生成权衡图数据点。不读取本地数据包或任意 URL。响应不缓存。' : view === 'current-inferencex-image' diff --git a/packages/skills/skills/inferencex-api/integrity.json b/packages/skills/skills/inferencex-api/integrity.json index 8f9eddf82..353016035 100644 --- a/packages/skills/skills/inferencex-api/integrity.json +++ b/packages/skills/skills/inferencex-api/integrity.json @@ -9,7 +9,7 @@ "references/cli-contract.md": "4f070877eeefffad2860c58f79f68432fbe27aa21fc578a1c696f0309a3d7d7b", "references/cli.md": "11e1183f7ed70d669019e8435ac16a6a9f873de027507b8850a9943f6659bfd9", "references/collectivex.md": "f79cf8e2779a9289ab69f79f4a4b338e0b9a5f76a3750a3e969f33a744e726a1", - "references/dashboard-views.md": "db9ba48896f75acf6531bd49d26062ee09307c6348f1e10b055cf62e093df85d", + "references/dashboard-views.md": "1b8a0d95588d173b47aa3de1cde80700370cf82b66b73a1780bc0a1d0c2df86e", "references/offline-exports.md": "95aa565dcd4c9e592159baa560a9a58217bc61e395de1c6daf0576795c7f4ec9", "references/pareto.md": "1b4d2d163f982e3f2d97addce310789eae9c1e5badd82dd7501708c9e0385027", "references/powerx.md": "5af5527d54a7e6191a5769080c122638b333b1ceb59e19fdee7df662a5cd3c8f", diff --git a/packages/skills/skills/inferencex-api/references/dashboard-views.md b/packages/skills/skills/inferencex-api/references/dashboard-views.md index 6515340c6..acb9313fc 100644 --- a/packages/skills/skills/inferencex-api/references/dashboard-views.md +++ b/packages/skills/skills/inferencex-api/references/dashboard-views.md @@ -172,29 +172,29 @@ All paths below are relative to `/api/v1/views/`. The maintained exhaustive query-key list is in the app's OpenAPI contract. The following groups explain which API selectors belong together. -| View | Selection and calculation | -| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `options` | Static registries and defaults, JSON only. Data-dependent run/config choices come from their own views. | -| `inference` | Model, sequence, precisions, date/exact run, GPU/vendor/framework/deployment/spec/power filters; metric, xmode, xstat, xmetric, percentile, optimal/best/allPoints; API-only equal-service sources/target; roleShare and powerFit panels; TCO, custom costs/powers, pricing, unofficial runs, comparison dates/endpoints. JSON or CSV. | -| `historical` | Model, sequence, target, metric, precisions, GPUs/vendors/frameworks/deployment, start/end, TCO and pricing. `extendToDate` labels synthetic extension, defaults to current UTC date. JSON or CSV. | -| `calculator` | Model/sequence/run/date, precisions/GPUs, percentile, target/mode, token type, owning/renting cost, TCO, power budget, cost cap, hide-above-limit and public unofficial runs. JSON or CSV. | -| `first-token` | Benchmark selection plus 1–8 positive TTFT caps in seconds, minimum interactivity, cost provider and token type. Shared dashboard winner selection. | -| `cache-reuse` | AgentX selection plus exact `config` from returned configurations and `recipe` from data.recipes. Cache-reuse curves retain official versus unofficial evidence. | -| `profit-estimator` | AgentX selection, comparison dates/runs, target, utilization, lab revenue share, list/OpenRouter/custom token prices, own/rent/custom chip costs, TCO, actual/theoretical cache-hit mode and provisioned/modeled/compare power. USD/chip-hour. | -| `profit-estimator-per-gigawatt` | Same selectors; USD/GW-year basis and owning-cost default. | -| `fleet` | Model/sequence/precision/GPUs, target/percentile, TCO/token type/cost provider, MW, input/output prices, ramp, cache discount, MTBI, recovery, horizon and metric. JSON or CSV. | -| `evaluation` | Model, task, date, precision and GPU selection; public unofficial runs remain separately labeled and independent of the official date cutoff. JSON or CSV. | -| `reliability` | Rolling range, GPU selection and optional `asOf` date for reproducibility. JSON or CSV. | -| `gpu-specs` | Full hardware properties or selected metric ranking; table/radar/bar are renderings of these values. JSON or CSV. | -| `overview` | Models, model/hardware row limits, hardware tier, engine, comparison mode and reference. JSON or CSV. | -| `rankings` | Ranking kind (model or chip), selected model/scenario and format. Use the exact values in OpenAPI. | -| `compare` | GPU pairs, model/slug, scenario, tier selection and variant. JSON or CSV. | -| `collectivex` | Ordered run selection and suite; EP size/phase/modes/precision/operation/percentile/axis/SKU/backend/series; KV page size/x/y/pull/push/overlap ISL/series; swap direction/layout/metric/percentile/series. | -| `submissions` | Search, table sort/direction/offset/limit, weekly/cumulative chart, on-change cutoff and NVIDIA/AMD/total lines. Table search does not filter the independent submission-volume chart. | -| `current-inferencex-image` | Model, sequence, hardware, precision, speculation, node type, framework families, `asOf` for image age/release status, and `includeHistory` for daily age history. | -| `gpu-metrics` | Required run, file/host artifact, GPU indices, metric or correlation axes, statistics sorting, chart mode and interactive downsampling preference. One telemetry source per run; full-record statistics computed on read. Not a serving-window/role-pool projection. Responses are no-store. | -| `ubenchx` | Test selector (`test`: `mem-bw`, `sm-l2-distance`, `tpc-skyline`, or `all`) plus GPU selector (`all` or one GPU). `mem-bw` returns static device-memory copy bandwidth rows with derived MBU and latency. `sm-l2-distance` returns SM-to-SM L2 latency difference matrix with GPC/die topology and summary statistics. `tpc-skyline` returns measured TPCs per GPC (sorted descending) with GPC, TPC, and SM counts, defaulting to every GPU. `all` (default) returns every test. The Y-axis selector on `/ubenchx/mem-bw` is presentation-only. | -| `video` | CI run/artifact discovery; only already-published artifact reads; source, serving cell, media/fidelity slot, power phase and GPU denominator; same-workload comparisons, axes, deployment costs and selected tradeoff point. No-store. | +| View | Selection and calculation | +| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `options` | Static registries and defaults, JSON only. Data-dependent run/config choices come from their own views. | +| `inference` | Model, sequence, precisions, date/exact run, GPU/vendor/framework/deployment/spec/power filters; metric, xmode, xstat, xmetric, percentile, optimal/best/allPoints; API-only equal-service sources/target; roleShare and powerFit panels; TCO, custom costs/powers, pricing, unofficial runs, comparison dates/endpoints. JSON or CSV. | +| `historical` | Model, sequence, target, metric, precisions, GPUs/vendors/frameworks/deployment, start/end, TCO and pricing. `extendToDate` labels synthetic extension, defaults to current UTC date. JSON or CSV. | +| `calculator` | Model/sequence/run/date, precisions/GPUs, percentile, target/mode, token type, owning/renting cost, TCO, power budget, cost cap, hide-above-limit and public unofficial runs. JSON or CSV. | +| `first-token` | Benchmark selection plus 1–8 positive TTFT caps in seconds, minimum interactivity, cost provider and token type. Shared dashboard winner selection. | +| `cache-reuse` | AgentX selection plus exact `config` from returned configurations and `recipe` from data.recipes. Cache-reuse curves retain official versus unofficial evidence. | +| `profit-estimator` | AgentX selection, comparison dates/runs, target, utilization, lab revenue share, list/OpenRouter/custom token prices, own/rent/custom chip costs, TCO, actual/theoretical cache-hit mode and provisioned/modeled/compare power. USD/chip-hour. | +| `profit-estimator-per-gigawatt` | Same selectors; USD/GW-year basis and owning-cost default. | +| `fleet` | Model/sequence/precision/GPUs, target/percentile, TCO/token type/cost provider, MW, input/output prices, ramp, cache discount, MTBI, recovery, horizon and metric. JSON or CSV. | +| `evaluation` | Model, task, date, precision and GPU selection; public unofficial runs remain separately labeled and independent of the official date cutoff. JSON or CSV. | +| `reliability` | Rolling range, GPU selection and optional `asOf` date for reproducibility. JSON or CSV. | +| `gpu-specs` | Full hardware properties or selected metric ranking; table/radar/bar are renderings of these values. JSON or CSV. | +| `overview` | Models, model/hardware row limits, hardware tier, engine, comparison mode and reference. JSON or CSV. | +| `rankings` | Ranking kind (model or chip), selected model/scenario and format. Use the exact values in OpenAPI. | +| `compare` | GPU pairs, model/slug, scenario, tier selection and variant. JSON or CSV. | +| `collectivex` | Ordered run selection and suite; EP size/phase/modes/precision/operation/percentile/axis/SKU/backend/series; KV page size/x/y/pull/push/overlap ISL/series; swap direction/layout/metric/percentile/series. | +| `submissions` | Search, table sort/direction/offset/limit, weekly/cumulative chart, on-change cutoff and NVIDIA/AMD/total lines. Table search does not filter the independent submission-volume chart. | +| `current-inferencex-image` | Model, sequence, hardware, precision, speculation, node type, framework families, `asOf` for image age/release status, and `includeHistory` for daily age history. | +| `gpu-metrics` | Required run, file/host artifact, GPU indices, metric or correlation axes, statistics sorting, chart mode and interactive downsampling preference. One telemetry source per run; full-record statistics computed on read. Not a serving-window/role-pool projection. Responses are no-store. | +| `ubenchx` | Test selector (`test`: `mem-bw`, `sm-l2-distance`, `tpc-skyline`, `core-memory-profiles`, or `all`) plus GPU selector (`all` or one GPU). `mem-bw` returns static device-memory copy bandwidth rows with derived MBU and latency. `sm-l2-distance` returns SM-to-SM L2 latency difference matrix with GPC/die topology and summary statistics. `tpc-skyline` returns measured TPCs per GPC (sorted descending) with GPC, TPC, and SM counts, defaulting to every GPU. `core-memory-profiles` returns all four Ascend 950PR_9579 scalar-controller matrices (Cube/Vector, isolated/concurrent), actual core IDs, shared color limits, per-die-group means and provenance. Values are mean absolute differences between matched-address profiles in raw `SYS_CNT ticks`, not core-to-core latency or calibrated cycles. No grid-wide barrier is used in concurrent launches. `all` (default) returns every test. Explicit device filters leave unavailable test sections empty. The Y-axis selector on `/ubenchx/mem-bw` is presentation-only. | +| `video` | CI run/artifact discovery; only already-published artifact reads; source, serving cell, media/fidelity slot, power phase and GPU denominator; same-workload comparisons, axes, deployment costs and selected tradeoff point. No-store. | ## Interpretation and maintenance From d2a9db47527617790d497d5418e66fa5260e8146 Mon Sep 17 00:00:00 2001 From: Oseltamivir <58582368+Oseltamivir@users.noreply.github.com> Date: Mon, 26 Oct 2026 21:47:48 +0800 Subject: [PATCH 3/4] fix(ubenchx): allow clearing pinned core-profile cells MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持再次点击或按 Enter 取消固定,并通过图外点击、Escape 或清除按钮清空核心对选择。 --- docs/ubenchx-ascend-core-profiles.md | 2 +- packages/app/cypress/e2e/ubenchx.cy.ts | 29 ++++++ .../ubenchx/CoreMemoryProfilesContent.tsx | 96 +++++++++++++++---- .../skills/inferencex-api/integrity.json | 2 +- .../references/dashboard-views.md | 46 ++++----- 5 files changed, 131 insertions(+), 44 deletions(-) diff --git a/docs/ubenchx-ascend-core-profiles.md b/docs/ubenchx-ascend-core-profiles.md index 5ea7b9ce1..0df8f2c85 100644 --- a/docs/ubenchx-ascend-core-profiles.md +++ b/docs/ubenchx-ascend-core-profiles.md @@ -8,4 +8,4 @@ The unit is raw `SYS_CNT ticks`, not `clock64` cycles or nanoseconds. These are The complete displayed data is in `ascend-core-profiles.json`. Its `sourceSha256` identifies the original plotted-data JSON; each panel also retains the hashes of its archived analysis inputs. This publication contains the displayed matrices and aggregate statistics, not every original per-load observation. -Coverage: `/ubenchx/core-memory-profiles` and its `/zh` sibling show all four panels. Hover, keyboard arrows and pinning only inspect already-returned cells; they do not change data. The hub's new test is available through `/api/v1/views/ubenchx?test=core-memory-profiles`, with `gpu=all` or `gpu=Ascend 950PR_9579`, and as `coreMemoryProfiles` in `test=all`. Explicit device selections leave other unavailable test sections empty. API `unit`, `metric`, `limitations`, `coreIds`, `dieGroups` and `colorLimits` preserve the measurement interpretation. +Coverage: `/ubenchx/core-memory-profiles` and its `/zh` sibling show all four panels. Hover, keyboard arrows and pinning only inspect already-returned cells; they do not change data. A repeated click or Enter unpins the current cell. Clicking outside the panel, Escape, or Clear selection clears it. A click on a different cell changes the pin; pointer exit clears an unpinned hover preview. The hub's new test is available through `/api/v1/views/ubenchx?test=core-memory-profiles`, with `gpu=all` or `gpu=Ascend 950PR_9579`, and as `coreMemoryProfiles` in `test=all`. Explicit device selections leave other unavailable test sections empty. API `unit`, `metric`, `limitations`, `coreIds`, `dieGroups` and `colorLimits` preserve the measurement interpretation. diff --git a/packages/app/cypress/e2e/ubenchx.cy.ts b/packages/app/cypress/e2e/ubenchx.cy.ts index 9cddbfbfb..9ab9033fe 100644 --- a/packages/app/cypress/e2e/ubenchx.cy.ts +++ b/packages/app/cypress/e2e/ubenchx.cy.ts @@ -165,3 +165,32 @@ describe('Ascend core memory-access profiles', () => { }); }); }); + +it('unpins core-profile cells by repeated click or Enter and clears them outside or by button', () => { + cy.visit('/ubenchx/core-memory-profiles', dismiss); + const panel = '[data-testid="profile-scalar_128MiB_cube_isolated"]'; + const value = '[data-testid="profile-scalar_128MiB_cube_isolated-value"]'; + const clear = '[data-testid="profile-scalar_128MiB_cube_isolated-clear"]'; + cy.get(`${panel} svg rect`).eq(1).click(); + cy.get(value).should('contain', 'Pinned core pair: 0 ↔ 1: 19.03'); + cy.get(`${panel} svg rect`).eq(2).click(); + cy.get(value).should('contain', 'Pinned core pair: 0 ↔ 2: 15.30'); + cy.get(`${panel} svg rect`).eq(2).click(); + cy.get(value).should('not.contain', 'core pair:'); + cy.get(clear).should('be.disabled'); + cy.get(`${panel} svg`) + .trigger('keydown', { key: 'ArrowRight' }) + .trigger('keydown', { key: 'Enter' }); + cy.get(value).should('contain', 'Pinned core pair:'); + cy.get(`${panel} svg`).trigger('keydown', { key: 'Enter' }); + cy.get(clear).should('be.disabled'); + cy.get(`${panel} svg rect`).eq(1).click(); + cy.contains('h2', 'Core memory-access profiles').click(); + cy.get(clear).should('be.disabled'); + cy.get(`${panel} svg rect`).eq(1).click(); + cy.get(clear).click(); + cy.get(clear).should('be.disabled'); + cy.get(`${panel} svg rect`).eq(1).click(); + cy.get(`${panel} svg`).trigger('keydown', { key: 'Escape' }); + cy.get(clear).should('be.disabled'); +}); diff --git a/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx b/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx index 0d1749b29..b76ff0c7a 100644 --- a/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx +++ b/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx @@ -1,7 +1,7 @@ 'use client'; import * as d3 from 'd3'; -import { useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { track } from '@/lib/analytics/analytics'; import { useLocale } from '@/lib/i18n/use-locale'; import { coreMemoryProfiles, type CoreProfilePanel } from './core-memory-profiles'; @@ -18,7 +18,7 @@ const STRINGS = { within: 'Within decoded die group', between: 'Between decoded die groups', instructions: - 'Hover or focus a heatmap; use arrow keys to inspect core pairs. Click or press Enter to pin, Escape to clear.', + 'Hover or focus a heatmap; use arrow keys to inspect core pairs. Click or press Enter to pin; repeat to unpin. Click outside or press Escape to clear.', method: 'Both core types execute the same scalar pointer chase on one allocation. Six passes are averaged at each matched address, then the mean absolute difference between each pair of core profiles is computed.', limits: @@ -27,7 +27,9 @@ const STRINGS = { 'Concurrent launches have no grid-wide starting barrier. Their fine structure is less repeatable than the broad grouping; these panels do not establish which cores physically share a cache.', source: 'Source data', methodology: 'Methodology', - selected: 'Selected core pair', + selected: 'Core pair', + pinned: 'Pinned core pair', + clear: 'Clear selection', sharedScale: 'All four panels use the same color scale.', }, zh: { @@ -40,7 +42,8 @@ const STRINGS = { units: '平均绝对差(SYS_CNT ticks)', within: '解码出的同一 die 分组内', between: '解码出的不同 die 分组间', - instructions: '悬停或聚焦热力图,用方向键查看核心对;点击或按 Enter 固定,按 Escape 清除。', + instructions: + '悬停或聚焦热力图,用方向键查看核心对;点击或按 Enter 固定,再次操作可取消固定;点击图外或按 Escape 清除。', method: '两类核心在同一块分配的内存上执行相同的标量指针追踪。先在每个对应地址上对六次遍历取平均,再计算每对核心访存特征之间的平均绝对差。', limits: @@ -49,13 +52,17 @@ const STRINGS = { '并发启动没有网格级起始同步屏障。相比整体分组,细节模式的可重复性较弱;这些图不能确定哪些核心在物理上共享缓存。', source: '数据来源', methodology: '测试方法', - selected: '选中的核心对', + selected: '核心对', + pinned: '已固定的核心对', + clear: '清除选择', sharedScale: '四幅图使用相同的色标范围。', }, } as const; type Copy = (typeof STRINGS)[keyof typeof STRINGS]; function Panel({ panel, max, text }: { panel: CoreProfilePanel; max: number; text: Copy }) { + const panelRef = useRef(null); + const svgRef = useRef(null); const [cell, setCell] = useState<[number, number] | null>(null); const [pinned, setPinned] = useState(false); const n = panel.coreIds.length, @@ -68,6 +75,41 @@ function Panel({ panel, max, text }: { panel: CoreProfilePanel; max: number; tex ...new Set([0, Math.floor(n / 4), Math.floor(n / 2), Math.floor((3 * n) / 4), n - 1]), ]; const id = `profile-${panel.condition}`; + const clear = useCallback( + (reason: string) => { + setCell(null); + setPinned(false); + track('ubenchx_core_profile_cell_cleared', { condition: panel.condition, reason }); + }, + [panel.condition], + ); + const hasCell = cell !== null; + useEffect(() => { + if (!hasCell) return; + const outside = (event: PointerEvent) => { + if (event.target instanceof Node && !panelRef.current?.contains(event.target)) + clear('outside'); + }; + const escape = (event: KeyboardEvent) => { + if (event.key === 'Escape') clear('escape'); + }; + document.addEventListener('pointerdown', outside); + document.addEventListener('keydown', escape); + return () => { + document.removeEventListener('pointerdown', outside); + document.removeEventListener('keydown', escape); + }; + }, [hasCell, clear]); + const hitTest = (event: { + currentTarget: SVGSVGElement; + clientX: number; + clientY: number; + }): [number, number] | null => { + const box = event.currentTarget.getBoundingClientRect(); + const j = Math.floor((((event.clientX - box.left) * 420) / box.width - start) / step); + const i = Math.floor((((event.clientY - box.top) * 420) / box.height - top) / step); + return i >= 0 && j >= 0 && i < n && j < n ? [i, j] : null; + }; const choose = (pair: [number, number]) => { setCell(pair); setPinned(true); @@ -78,11 +120,12 @@ function Panel({ panel, max, text }: { panel: CoreProfilePanel; max: number; tex }); }; return ( -
+

{panel.coreType === 'cube' ? 'Cube' : 'Vector'} · {text[panel.launchMode]}

{ - if (pinned) return; - const box = event.currentTarget.getBoundingClientRect(); - const j = Math.floor((((event.clientX - box.left) * 420) / box.width - start) / step); - const i = Math.floor((((event.clientY - box.top) * 420) / box.height - top) / step); - if (i >= 0 && j >= 0 && i < n && j < n) setCell([i, j]); + if (!pinned) setCell(hitTest(event)); }} - onClick={() => { - if (cell) choose(cell); + onPointerLeave={() => { + if (!pinned) setCell(null); }} - onKeyDown={(event) => { - if (event.key === 'Escape') { - setPinned(false); - setCell(null); + onBlur={() => { + if (!pinned) setCell(null); + }} + onClick={(event) => { + const pair = hitTest(event); + svgRef.current?.focus({ preventScroll: true }); + if (!pair) { + clear('blank'); return; } + if (pinned && cell && cell[0] === pair[0] && cell[1] === pair[1]) clear('toggle'); + else choose(pair); + }} + onKeyDown={(event) => { if (event.key === 'Enter' && cell) { - choose(cell); + event.preventDefault(); + if (pinned) clear('toggle'); + else choose(cell); return; } const delta: Record = { @@ -199,9 +248,18 @@ function Panel({ panel, max, text }: { panel: CoreProfilePanel; max: number; tex {cell - ? `${text.selected}: ${panel.coreIds[cell[0]]} ↔ ${panel.coreIds[cell[1]]}: ${panel.matrix[cell[0]][cell[1]].toFixed(2)} SYS_CNT ticks` + ? `${pinned ? text.pinned : text.selected}: ${panel.coreIds[cell[0]]} ↔ ${panel.coreIds[cell[1]]}: ${panel.matrix[cell[0]][cell[1]].toFixed(2)} SYS_CNT ticks` : text.instructions} +

{text.within}: {panel.stats.withinDieGroupMean?.toFixed(2) ?? text.noPairs} · {text.between} : {panel.stats.betweenDieGroupMean?.toFixed(2) ?? text.noPairs} SYS_CNT ticks diff --git a/packages/skills/skills/inferencex-api/integrity.json b/packages/skills/skills/inferencex-api/integrity.json index 353016035..6bbf7dd79 100644 --- a/packages/skills/skills/inferencex-api/integrity.json +++ b/packages/skills/skills/inferencex-api/integrity.json @@ -9,7 +9,7 @@ "references/cli-contract.md": "4f070877eeefffad2860c58f79f68432fbe27aa21fc578a1c696f0309a3d7d7b", "references/cli.md": "11e1183f7ed70d669019e8435ac16a6a9f873de027507b8850a9943f6659bfd9", "references/collectivex.md": "f79cf8e2779a9289ab69f79f4a4b338e0b9a5f76a3750a3e969f33a744e726a1", - "references/dashboard-views.md": "1b8a0d95588d173b47aa3de1cde80700370cf82b66b73a1780bc0a1d0c2df86e", + "references/dashboard-views.md": "3e910feda374e564211bb5fdcb9660d98fa8e6eafcd0d7317c1b819b6f95baef", "references/offline-exports.md": "95aa565dcd4c9e592159baa560a9a58217bc61e395de1c6daf0576795c7f4ec9", "references/pareto.md": "1b4d2d163f982e3f2d97addce310789eae9c1e5badd82dd7501708c9e0385027", "references/powerx.md": "5af5527d54a7e6191a5769080c122638b333b1ceb59e19fdee7df662a5cd3c8f", diff --git a/packages/skills/skills/inferencex-api/references/dashboard-views.md b/packages/skills/skills/inferencex-api/references/dashboard-views.md index acb9313fc..4d66e3c6c 100644 --- a/packages/skills/skills/inferencex-api/references/dashboard-views.md +++ b/packages/skills/skills/inferencex-api/references/dashboard-views.md @@ -172,29 +172,29 @@ All paths below are relative to `/api/v1/views/`. The maintained exhaustive query-key list is in the app's OpenAPI contract. The following groups explain which API selectors belong together. -| View | Selection and calculation | -| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `options` | Static registries and defaults, JSON only. Data-dependent run/config choices come from their own views. | -| `inference` | Model, sequence, precisions, date/exact run, GPU/vendor/framework/deployment/spec/power filters; metric, xmode, xstat, xmetric, percentile, optimal/best/allPoints; API-only equal-service sources/target; roleShare and powerFit panels; TCO, custom costs/powers, pricing, unofficial runs, comparison dates/endpoints. JSON or CSV. | -| `historical` | Model, sequence, target, metric, precisions, GPUs/vendors/frameworks/deployment, start/end, TCO and pricing. `extendToDate` labels synthetic extension, defaults to current UTC date. JSON or CSV. | -| `calculator` | Model/sequence/run/date, precisions/GPUs, percentile, target/mode, token type, owning/renting cost, TCO, power budget, cost cap, hide-above-limit and public unofficial runs. JSON or CSV. | -| `first-token` | Benchmark selection plus 1–8 positive TTFT caps in seconds, minimum interactivity, cost provider and token type. Shared dashboard winner selection. | -| `cache-reuse` | AgentX selection plus exact `config` from returned configurations and `recipe` from data.recipes. Cache-reuse curves retain official versus unofficial evidence. | -| `profit-estimator` | AgentX selection, comparison dates/runs, target, utilization, lab revenue share, list/OpenRouter/custom token prices, own/rent/custom chip costs, TCO, actual/theoretical cache-hit mode and provisioned/modeled/compare power. USD/chip-hour. | -| `profit-estimator-per-gigawatt` | Same selectors; USD/GW-year basis and owning-cost default. | -| `fleet` | Model/sequence/precision/GPUs, target/percentile, TCO/token type/cost provider, MW, input/output prices, ramp, cache discount, MTBI, recovery, horizon and metric. JSON or CSV. | -| `evaluation` | Model, task, date, precision and GPU selection; public unofficial runs remain separately labeled and independent of the official date cutoff. JSON or CSV. | -| `reliability` | Rolling range, GPU selection and optional `asOf` date for reproducibility. JSON or CSV. | -| `gpu-specs` | Full hardware properties or selected metric ranking; table/radar/bar are renderings of these values. JSON or CSV. | -| `overview` | Models, model/hardware row limits, hardware tier, engine, comparison mode and reference. JSON or CSV. | -| `rankings` | Ranking kind (model or chip), selected model/scenario and format. Use the exact values in OpenAPI. | -| `compare` | GPU pairs, model/slug, scenario, tier selection and variant. JSON or CSV. | -| `collectivex` | Ordered run selection and suite; EP size/phase/modes/precision/operation/percentile/axis/SKU/backend/series; KV page size/x/y/pull/push/overlap ISL/series; swap direction/layout/metric/percentile/series. | -| `submissions` | Search, table sort/direction/offset/limit, weekly/cumulative chart, on-change cutoff and NVIDIA/AMD/total lines. Table search does not filter the independent submission-volume chart. | -| `current-inferencex-image` | Model, sequence, hardware, precision, speculation, node type, framework families, `asOf` for image age/release status, and `includeHistory` for daily age history. | -| `gpu-metrics` | Required run, file/host artifact, GPU indices, metric or correlation axes, statistics sorting, chart mode and interactive downsampling preference. One telemetry source per run; full-record statistics computed on read. Not a serving-window/role-pool projection. Responses are no-store. | -| `ubenchx` | Test selector (`test`: `mem-bw`, `sm-l2-distance`, `tpc-skyline`, `core-memory-profiles`, or `all`) plus GPU selector (`all` or one GPU). `mem-bw` returns static device-memory copy bandwidth rows with derived MBU and latency. `sm-l2-distance` returns SM-to-SM L2 latency difference matrix with GPC/die topology and summary statistics. `tpc-skyline` returns measured TPCs per GPC (sorted descending) with GPC, TPC, and SM counts, defaulting to every GPU. `core-memory-profiles` returns all four Ascend 950PR_9579 scalar-controller matrices (Cube/Vector, isolated/concurrent), actual core IDs, shared color limits, per-die-group means and provenance. Values are mean absolute differences between matched-address profiles in raw `SYS_CNT ticks`, not core-to-core latency or calibrated cycles. No grid-wide barrier is used in concurrent launches. `all` (default) returns every test. Explicit device filters leave unavailable test sections empty. The Y-axis selector on `/ubenchx/mem-bw` is presentation-only. | -| `video` | CI run/artifact discovery; only already-published artifact reads; source, serving cell, media/fidelity slot, power phase and GPU denominator; same-workload comparisons, axes, deployment costs and selected tradeoff point. No-store. | +| View | Selection and calculation | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `options` | Static registries and defaults, JSON only. Data-dependent run/config choices come from their own views. | +| `inference` | Model, sequence, precisions, date/exact run, GPU/vendor/framework/deployment/spec/power filters; metric, xmode, xstat, xmetric, percentile, optimal/best/allPoints; API-only equal-service sources/target; roleShare and powerFit panels; TCO, custom costs/powers, pricing, unofficial runs, comparison dates/endpoints. JSON or CSV. | +| `historical` | Model, sequence, target, metric, precisions, GPUs/vendors/frameworks/deployment, start/end, TCO and pricing. `extendToDate` labels synthetic extension, defaults to current UTC date. JSON or CSV. | +| `calculator` | Model/sequence/run/date, precisions/GPUs, percentile, target/mode, token type, owning/renting cost, TCO, power budget, cost cap, hide-above-limit and public unofficial runs. JSON or CSV. | +| `first-token` | Benchmark selection plus 1–8 positive TTFT caps in seconds, minimum interactivity, cost provider and token type. Shared dashboard winner selection. | +| `cache-reuse` | AgentX selection plus exact `config` from returned configurations and `recipe` from data.recipes. Cache-reuse curves retain official versus unofficial evidence. | +| `profit-estimator` | AgentX selection, comparison dates/runs, target, utilization, lab revenue share, list/OpenRouter/custom token prices, own/rent/custom chip costs, TCO, actual/theoretical cache-hit mode and provisioned/modeled/compare power. USD/chip-hour. | +| `profit-estimator-per-gigawatt` | Same selectors; USD/GW-year basis and owning-cost default. | +| `fleet` | Model/sequence/precision/GPUs, target/percentile, TCO/token type/cost provider, MW, input/output prices, ramp, cache discount, MTBI, recovery, horizon and metric. JSON or CSV. | +| `evaluation` | Model, task, date, precision and GPU selection; public unofficial runs remain separately labeled and independent of the official date cutoff. JSON or CSV. | +| `reliability` | Rolling range, GPU selection and optional `asOf` date for reproducibility. JSON or CSV. | +| `gpu-specs` | Full hardware properties or selected metric ranking; table/radar/bar are renderings of these values. JSON or CSV. | +| `overview` | Models, model/hardware row limits, hardware tier, engine, comparison mode and reference. JSON or CSV. | +| `rankings` | Ranking kind (model or chip), selected model/scenario and format. Use the exact values in OpenAPI. | +| `compare` | GPU pairs, model/slug, scenario, tier selection and variant. JSON or CSV. | +| `collectivex` | Ordered run selection and suite; EP size/phase/modes/precision/operation/percentile/axis/SKU/backend/series; KV page size/x/y/pull/push/overlap ISL/series; swap direction/layout/metric/percentile/series. | +| `submissions` | Search, table sort/direction/offset/limit, weekly/cumulative chart, on-change cutoff and NVIDIA/AMD/total lines. Table search does not filter the independent submission-volume chart. | +| `current-inferencex-image` | Model, sequence, hardware, precision, speculation, node type, framework families, `asOf` for image age/release status, and `includeHistory` for daily age history. | +| `gpu-metrics` | Required run, file/host artifact, GPU indices, metric or correlation axes, statistics sorting, chart mode and interactive downsampling preference. One telemetry source per run; full-record statistics computed on read. Not a serving-window/role-pool projection. Responses are no-store. | +| `ubenchx` | Test selector (`test`: `mem-bw`, `sm-l2-distance`, `tpc-skyline`, `core-memory-profiles`, or `all`) plus GPU selector (`all` or one GPU). `mem-bw` returns static device-memory copy bandwidth rows with derived MBU and latency. `sm-l2-distance` returns SM-to-SM L2 latency difference matrix with GPC/die topology and summary statistics. `tpc-skyline` returns measured TPCs per GPC (sorted descending) with GPC, TPC, and SM counts, defaulting to every GPU. `core-memory-profiles` returns all four Ascend 950PR_9579 scalar-controller matrices (Cube/Vector, isolated/concurrent), actual core IDs, shared color limits, per-die-group means and provenance. Values are mean absolute differences between matched-address profiles in raw `SYS_CNT ticks`, not core-to-core latency or calibrated cycles. No grid-wide barrier is used in concurrent launches. Cell hover, pinning and clear-selection controls are presentation-only; all matrix cells remain available in the API. `all` (default) returns every test. Explicit device filters leave unavailable test sections empty. The Y-axis selector on `/ubenchx/mem-bw` is presentation-only. | +| `video` | CI run/artifact discovery; only already-published artifact reads; source, serving cell, media/fidelity slot, power phase and GPU denominator; same-workload comparisons, axes, deployment costs and selected tradeoff point. No-store. | ## Interpretation and maintenance From bd805dc498686c112a8d81a82b7d8d12acb47c73 Mon Sep 17 00:00:00 2001 From: Oseltamivir <58582368+Oseltamivir@users.noreply.github.com> Date: Mon, 26 Oct 2026 23:40:15 +0800 Subject: [PATCH 4/4] feat(ubenchx): combine B200 and Huawei core profiles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:将 B200 与 Huawei 核心访存特征合并到同一页面,提供硬件筛选,保留独立单位与色标,并兼容旧页面链接和 API。 --- docs/ubenchx-ascend-core-profiles.md | 10 ++- packages/app/cypress/e2e/ubenchx.cy.ts | 46 ++++++++++-- .../app/api/v1/views/ubenchx/route.test.ts | 29 +++++++- .../app/src/app/api/v1/views/ubenchx/route.ts | 15 ++-- .../app/ubenchx/core-memory-profiles/page.tsx | 2 +- .../src/app/ubenchx/sm-l2-distance/page.tsx | 37 +--------- .../zh/ubenchx/core-memory-profiles/page.tsx | 2 +- .../app/zh/ubenchx/sm-l2-distance/page.tsx | 38 +--------- .../ubenchx/CoreMemoryProfilesContent.tsx | 71 ++++++++++++++++++- .../src/components/ubenchx/SmL2Heatmap.tsx | 32 ++++----- .../app/src/components/ubenchx/UbenchxHub.tsx | 3 - .../ubenchx/core-memory-profiles.test.ts | 10 ++- .../ubenchx/core-memory-profiles.ts | 24 +++++++ packages/app/src/lib/api/api-route-catalog.ts | 4 +- .../app/src/lib/views-api/docs/extensions.ts | 12 ++-- .../skills/inferencex-api/integrity.json | 2 +- .../references/dashboard-views.md | 48 +++++++------ 17 files changed, 239 insertions(+), 146 deletions(-) diff --git a/docs/ubenchx-ascend-core-profiles.md b/docs/ubenchx-ascend-core-profiles.md index 0df8f2c85..f80f0f0c1 100644 --- a/docs/ubenchx-ascend-core-profiles.md +++ b/docs/ubenchx-ascend-core-profiles.md @@ -1,6 +1,10 @@ -# Ascend scalar-controller memory profiles +# Core memory-access profiles: B200 and Huawei 950PR -The `core-memory-profiles` view preserves the four 128 MiB matrices from the 6–7 October 2026 (Singapore time) Cube/Vector locality rerun: 28 Cube scalar controllers and 56 Vector scalar controllers, each tested with one active core and with concurrent launches. Both core types use identical scalar pointer-chase instructions on the same allocation. Each address is averaged over six passes before computing the mean absolute difference between two cores' address profiles. +The `/ubenchx/core-memory-profiles` page combines B200 and Huawei 950PR, showing both by default. Its hardware selector can focus on either device. The B200 SM matrix keeps its `clock64` cycle units, GPC/die grouping, statistics and independent color domain; the 950PR retains SYS_CNT ticks and a shared scale across its four panels. Colors and values across devices are not comparable absolute latency. Both matrices measure differences between matched-address latency profiles, not direct core-to-core communication time. + +The legacy `/ubenchx/sm-l2-distance` page and its Chinese sibling redirect to the combined page; the existing `test=sm-l2-distance` API remains compatible. + +The Ascend portion of the `core-memory-profiles` view preserves the four 128 MiB matrices from the 6–7 October 2026 (Singapore time) Cube/Vector locality rerun: 28 Cube scalar controllers and 56 Vector scalar controllers, each tested with one active core and with concurrent launches. Both core types use identical scalar pointer-chase instructions on the same allocation. Each address is averaged over six passes before computing the mean absolute difference between two cores' address profiles. The data file contains every displayed matrix entry without rounding, the actual physical core-ID lists, the original pair statistics and source hashes. The arrays preserve ID gaps. Runtime-ID die groups divide IDs below 54 from those at or above 54; they do not assign physical coordinates. The frontend and API recompute within/between-group means from unique off-diagonal pairs using the same pure function. A shared 0–113.63708496093749 SYS_CNT-tick color domain applies to all four panels. @@ -8,4 +12,4 @@ The unit is raw `SYS_CNT ticks`, not `clock64` cycles or nanoseconds. These are The complete displayed data is in `ascend-core-profiles.json`. Its `sourceSha256` identifies the original plotted-data JSON; each panel also retains the hashes of its archived analysis inputs. This publication contains the displayed matrices and aggregate statistics, not every original per-load observation. -Coverage: `/ubenchx/core-memory-profiles` and its `/zh` sibling show all four panels. Hover, keyboard arrows and pinning only inspect already-returned cells; they do not change data. A repeated click or Enter unpins the current cell. Clicking outside the panel, Escape, or Clear selection clears it. A click on a different cell changes the pin; pointer exit clears an unpinned hover preview. The hub's new test is available through `/api/v1/views/ubenchx?test=core-memory-profiles`, with `gpu=all` or `gpu=Ascend 950PR_9579`, and as `coreMemoryProfiles` in `test=all`. Explicit device selections leave other unavailable test sections empty. API `unit`, `metric`, `limitations`, `coreIds`, `dieGroups` and `colorLimits` preserve the measurement interpretation. +Coverage: `/ubenchx/core-memory-profiles` and its `/zh` sibling show B200 and all four Ascend panels. Hover, keyboard arrows and pinning only inspect already-returned cells; they do not change data. A repeated click or Enter unpins the current cell. Clicking outside the panel, Escape, or Clear selection clears it. A click on a different cell changes the pin; pointer exit clears an unpinned hover preview. The hub's new test is available through `/api/v1/views/ubenchx?test=core-memory-profiles`, with `gpu=all` (default), `gpu=B200 SXM` or `gpu=Ascend 950PR_9579`, and as `coreMemoryProfiles` in `test=all`. Explicit device selections leave other unavailable test sections empty. B200 keeps its original transformed SM fields plus `unit`, `metric`, `limitations` and `colorLimits`; Ascend keeps its panel schema. API `unit`, `metric`, `limitations`, `coreIds`, `dieGroups` and `colorLimits` preserve the measurement interpretation. diff --git a/packages/app/cypress/e2e/ubenchx.cy.ts b/packages/app/cypress/e2e/ubenchx.cy.ts index 5637e2452..d5dd21703 100644 --- a/packages/app/cypress/e2e/ubenchx.cy.ts +++ b/packages/app/cypress/e2e/ubenchx.cy.ts @@ -26,7 +26,7 @@ describe('ubenchX hub and test routes', () => { cy.get('[data-testid="ubenchx-metric-select"]').should('contain', 'TB/s'); }); - it('switches to sm-l2-distance with the test selector', () => { + it('switches to the combined core profiles with the test selector', () => { cy.visit('/ubenchx/mem-bw', dismissModal); cy.contains('ubenchX').should('be.visible'); cy.get('[data-testid="ubenchx-metric-select"]').should('be.visible'); @@ -36,10 +36,10 @@ describe('ubenchX hub and test routes', () => { .should('include', '/zh/ubenchx/mem-bw'); cy.get('[data-testid="ubenchx-test-select"]').click(); - cy.contains('[role="option"]', 'SM-SM L2 Latency Difference').click(); - cy.url().should('include', '/ubenchx/sm-l2-distance'); + cy.contains('[role="option"]', 'Core memory-access profiles').click(); + cy.url().should('include', '/ubenchx/core-memory-profiles'); cy.get('[data-testid="sm-l2-heatmap"]').should('be.visible'); - cy.get('[data-testid="ubenchx-test-select"]').should('contain', 'SM-SM L2 Latency Difference'); + cy.get('[data-testid="ubenchx-test-select"]').should('contain', 'Core memory-access profiles'); }); it('switches to the TPC Skyline table with the test selector', () => { @@ -90,7 +90,7 @@ describe('ubenchX hub and test routes', () => { cy.get('meta[name="robots"]').should('have.attr', 'content').and('contain', 'noindex'); cy.get('link[rel="alternate"][hreflang="zh-CN"]') .invoke('attr', 'href') - .should('include', '/zh/ubenchx/sm-l2-distance'); + .should('include', '/zh/ubenchx/core-memory-profiles'); cy.get('[data-testid="sm-l2-heatmap"] svg rect').last().as('overlay'); cy.get('@overlay').click(520, 120, { force: true }); @@ -195,6 +195,42 @@ it('unpins core-profile cells by repeated click or Enter and clears them outside cy.get(clear).should('be.disabled'); }); +it('filters both devices on one page and preserves their API values and units', () => { + cy.visit('/ubenchx/core-memory-profiles', dismiss); + cy.get('[data-testid="sm-l2-heatmap"]').should('exist'); + cy.get('[data-testid="ascend-core-profiles"]').should('exist'); + cy.get('[data-testid="core-profile-hardware"]').should('contain', 'All hardware').click(); + cy.contains('[role="option"]', 'B200 SXM').click(); + cy.get('[data-testid="sm-l2-heatmap"]').should('be.visible'); + cy.get('[data-testid="ascend-core-profiles"]').should('not.exist'); + cy.request('/api/v1/views/ubenchx?test=core-memory-profiles&gpu=B200%20SXM').then(({ body }) => { + expect(body.gpus).to.have.length(1); + expect(body.gpus[0].unit).to.equal('clock64 cycles'); + cy.contains(`${body.gpus[0].stats.crossDieMean.toFixed(1)} cycles`).should('be.visible'); + }); + cy.get('[data-testid="core-profile-hardware"]').click(); + cy.contains('[role="option"]', 'Huawei 950PR').click(); + cy.get('[data-testid="sm-l2-heatmap"]').should('not.exist'); + cy.get('[data-testid="profile-scalar_128MiB_cube_isolated"] svg').focus(); + cy.get('[data-testid="profile-scalar_128MiB_cube_isolated-value"]').should( + 'contain', + '0 ↔ 1: 19.03 SYS_CNT ticks', + ); + cy.get('[data-testid="core-profile-hardware"]').click(); + cy.contains('[role="option"]', 'All hardware').click(); + cy.get('[data-testid="sm-l2-heatmap"]').should('exist'); + cy.get('[data-testid="ascend-core-profiles"]').should('exist'); + cy.screenshot('combined-core-profiles-desktop', { capture: 'fullPage' }); + cy.visit('/zh/ubenchx/sm-l2-distance', dismiss); + cy.location('pathname').should('equal', '/zh/ubenchx/core-memory-profiles'); + cy.viewport(390, 844); + cy.get('[data-testid="core-profile-hardware"]').should('contain', '全部硬件'); + cy.contains('不同设备上颜色或数值相同,并不代表延迟相同').should('be.visible'); + cy.get('[data-testid="sm-l2-heatmap"]').should('exist'); + cy.get('[data-testid="ascend-core-profiles"]').should('exist'); + cy.screenshot('combined-core-profiles-mobile-zh', { capture: 'fullPage' }); +}); + describe('Huawei copy-bandwidth evidence', () => { it('renders Huawei 950PR and qualifies the graph timing in English and Chinese', () => { cy.visit('/ubenchx/mem-bw', dismiss); diff --git a/packages/app/src/app/api/v1/views/ubenchx/route.test.ts b/packages/app/src/app/api/v1/views/ubenchx/route.test.ts index ae1816348..fd72b407d 100644 --- a/packages/app/src/app/api/v1/views/ubenchx/route.test.ts +++ b/packages/app/src/app/api/v1/views/ubenchx/route.test.ts @@ -176,13 +176,40 @@ it('returns the Ascend core profiles with raw timer units and leaves unavailable expect(run.panels[0].stats.withinDieGroupMean).toBeCloseTo(18.55499211685, 8); expect(run.panels[0].stats.betweenDieGroupMean).toBeCloseTo(93.12987720723, 8); expect(run.panels[0].matrix[0][14]).toBeCloseTo(96.70648193359, 8); - const onlyResponse = await GET(request({ test: 'core-memory-profiles' })); + const onlyResponse = await GET( + request({ test: 'core-memory-profiles', gpu: 'Ascend 950PR_9579' }), + ); const only = await onlyResponse.json(); expect(only.gpus).toEqual(body.coreMemoryProfiles.gpus); const missing = await GET(request({ test: 'core-memory-profiles', gpu: 'H100 SXM' })); expect(missing.status).toBe(400); }); +it('combines both hardware profiles without converting or pooling their units', async () => { + const response = await GET(request({ test: 'core-memory-profiles' })); + const body = await response.json(); + expect(body.params).toEqual({ test: 'core-memory-profiles', gpu: 'all' }); + expect(body.gpus.map((run: { gpu: string }) => run.gpu)).toEqual([ + 'B200 SXM', + 'Ascend 950PR_9579', + ]); + const b200 = body.gpus[0]; + expect(b200).toMatchObject(transformSmL2Run('B200 SXM', SM_L2_RUNS['B200 SXM'])); + expect(b200.unit).toBe('clock64 cycles'); + expect(b200.colorLimits).toEqual([0, b200.stats.max]); + expect(body.gpus[1].panels[0].unit).toBe('SYS_CNT ticks'); + const filteredResponse = await GET(request({ test: 'core-memory-profiles', gpu: 'b200 sxm' })); + const filtered = await filteredResponse.json(); + expect(filtered.params.gpu).toBe('B200 SXM'); + expect(filtered.gpus).toEqual([b200]); + const allResponse = await GET(request({ test: 'all', gpu: 'B200 SXM' })); + const all = await allResponse.json(); + expect(all.coreMemoryProfiles.gpus).toEqual([b200]); + const legacyResponse = await GET(request({ test: 'sm-l2-distance', gpu: 'B200 SXM' })); + const legacy = await legacyResponse.json(); + expect(legacy.gpus[0]).toEqual(transformSmL2Run('B200 SXM', SM_L2_RUNS['B200 SXM'])); +}); + it('exposes Huawei rotating-copy evidence without inventing missing tests or sizes', async () => { const response = await GET(request({ test: 'all', gpu: 'huawei 950pr' })); expect(response.status).toBe(200); diff --git a/packages/app/src/app/api/v1/views/ubenchx/route.ts b/packages/app/src/app/api/v1/views/ubenchx/route.ts index 29ef2b8ad..5ad92c5e3 100644 --- a/packages/app/src/app/api/v1/views/ubenchx/route.ts +++ b/packages/app/src/app/api/v1/views/ubenchx/route.ts @@ -1,4 +1,8 @@ -import { CORE_PROFILE_GPU, coreMemoryProfiles } from '@/components/ubenchx/core-memory-profiles'; +import { + CORE_PROFILE_GPU, + CORE_PROFILE_GPU_KEYS, + coreMemoryProfileResults, +} from '@/components/ubenchx/core-memory-profiles'; import { SM_L2_RUNS } from '@/components/ubenchx/sm-l2-data'; import { transformSmL2Run } from '@/components/ubenchx/sm-l2-transform'; import { TPC_SKYLINE_RUNS } from '@/components/ubenchx/tpc-skyline-data'; @@ -35,14 +39,14 @@ export function GET(request: NextRequest) { const rawGpu = s.get('gpu'); if (test === 'core-memory-profiles') { - const gpu = parseEnumParam(rawGpu, 'gpu', ['all', CORE_PROFILE_GPU], CORE_PROFILE_GPU); + const gpu = parseEnumParam(rawGpu, 'gpu', ['all', ...CORE_PROFILE_GPU_KEYS], 'all'); return Promise.resolve( cachedJson({ apiVersion: 'v1', view: 'ubenchx', test, params: { test, gpu }, - gpus: [coreMemoryProfiles()], + gpus: coreMemoryProfileResults(gpu), }), ); } @@ -105,10 +109,7 @@ export function GET(request: NextRequest) { memBw: { gpus: memBwResults }, smL2Distance: { gpus: smL2Results }, coreMemoryProfiles: { - gpus: - rawGpu === null || gpu === 'all' || gpu === CORE_PROFILE_GPU - ? [coreMemoryProfiles()] - : [], + gpus: coreMemoryProfileResults(rawGpu === null ? 'all' : gpu), }, // Like smL2Distance, default to every GPU rather than mem-bw's first one, and // match the GPU key case-insensitively as parseEnumParam does for the others. diff --git a/packages/app/src/app/ubenchx/core-memory-profiles/page.tsx b/packages/app/src/app/ubenchx/core-memory-profiles/page.tsx index 76835194f..e60db61ae 100644 --- a/packages/app/src/app/ubenchx/core-memory-profiles/page.tsx +++ b/packages/app/src/app/ubenchx/core-memory-profiles/page.tsx @@ -7,7 +7,7 @@ import { SITE_URL } from '@semianalysisai/inferencex-constants'; const TITLE = 'ubenchX: Core memory-access profiles'; const DESCRIPTION = - 'Measured 128 MiB memory-access profile differences for Ascend 950PR Cube and Vector scalar controllers, with isolated and concurrent launches.'; + 'Compare B200 SM and Huawei 950PR Cube/Vector memory-access profiles, preserving each device’s native timer units and measurement conditions.'; export const metadata: Metadata = { title: TITLE, diff --git a/packages/app/src/app/ubenchx/sm-l2-distance/page.tsx b/packages/app/src/app/ubenchx/sm-l2-distance/page.tsx index 68d3f3ef4..2a2db9944 100644 --- a/packages/app/src/app/ubenchx/sm-l2-distance/page.tsx +++ b/packages/app/src/app/ubenchx/sm-l2-distance/page.tsx @@ -1,36 +1,5 @@ -import type { Metadata } from 'next'; +import { permanentRedirect } from 'next/navigation'; -import { SmL2Content } from '@/components/ubenchx/SmL2Heatmap'; -import { UbenchxHub } from '@/components/ubenchx/UbenchxHub'; -import { enAlternates } from '@/lib/i18n/i18n'; -import { SITE_URL } from '@semianalysisai/inferencex-constants'; - -const TITLE = 'ubenchX: SM-SM L2 Latency Difference'; -const DESCRIPTION = - 'L2 pointer-chase microbenchmark showing SM-to-SM latency differences, revealing GPC and die topology structure on NVIDIA Blackwell GPUs.'; - -export const metadata: Metadata = { - title: TITLE, - description: DESCRIPTION, - alternates: enAlternates('/ubenchx/sm-l2-distance'), - robots: { index: false, follow: false }, - openGraph: { - title: `${TITLE} | InferenceX`, - description: DESCRIPTION, - url: `${SITE_URL}/ubenchx/sm-l2-distance`, - }, - twitter: { title: `${TITLE} | InferenceX`, description: DESCRIPTION }, -}; - -export default function UbenchxSmL2DistancePage() { - return ( -

-
-
- - -
-
-
- ); +export default function LegacySmL2Page() { + permanentRedirect('/ubenchx/core-memory-profiles'); } diff --git a/packages/app/src/app/zh/ubenchx/core-memory-profiles/page.tsx b/packages/app/src/app/zh/ubenchx/core-memory-profiles/page.tsx index aa5b423b2..5240fc805 100644 --- a/packages/app/src/app/zh/ubenchx/core-memory-profiles/page.tsx +++ b/packages/app/src/app/zh/ubenchx/core-memory-profiles/page.tsx @@ -7,7 +7,7 @@ import { SITE_URL } from '@semianalysisai/inferencex-constants'; const TITLE = 'ubenchX:核心访存特征'; const DESCRIPTION = - '展示 Ascend 950PR 的 Cube 与 Vector 标量控制器在 128 MiB 内存上的访存特征差异,包含单核执行与并发启动结果。'; + '对比 B200 SM 与 Huawei 950PR Cube/Vector 的访存特征,保留各设备原始计时单位和测试条件。'; export const metadata: Metadata = { title: TITLE, diff --git a/packages/app/src/app/zh/ubenchx/sm-l2-distance/page.tsx b/packages/app/src/app/zh/ubenchx/sm-l2-distance/page.tsx index 1f0cde4a6..3465cc495 100644 --- a/packages/app/src/app/zh/ubenchx/sm-l2-distance/page.tsx +++ b/packages/app/src/app/zh/ubenchx/sm-l2-distance/page.tsx @@ -1,37 +1,5 @@ -import type { Metadata } from 'next'; +import { permanentRedirect } from 'next/navigation'; -import { SmL2Content } from '@/components/ubenchx/SmL2Heatmap'; -import { UbenchxHub } from '@/components/ubenchx/UbenchxHub'; -import { zhAlternates, ZH_OG_LOCALE } from '@/lib/i18n/i18n'; -import { SITE_URL } from '@semianalysisai/inferencex-constants'; - -const TITLE = 'ubenchX:SM 间 L2 延迟差异'; -const DESCRIPTION = - '基于 L2 指针追踪的微基准测试,展示 SM 间延迟差异,揭示 NVIDIA Blackwell GPU 上的 GPC 和 die 拓扑结构。'; - -export const metadata: Metadata = { - title: TITLE, - description: DESCRIPTION, - alternates: zhAlternates('/ubenchx/sm-l2-distance'), - robots: { index: false, follow: false }, - openGraph: { - title: `${TITLE} | InferenceX`, - description: DESCRIPTION, - url: `${SITE_URL}/zh/ubenchx/sm-l2-distance`, - locale: ZH_OG_LOCALE, - }, - twitter: { title: `${TITLE} | InferenceX`, description: DESCRIPTION }, -}; - -export default function UbenchxSmL2DistancePageZh() { - return ( -
-
-
- - -
-
-
- ); +export default function LegacySmL2Page() { + permanentRedirect('/zh/ubenchx/core-memory-profiles'); } diff --git a/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx b/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx index b76ff0c7a..afa5f4b28 100644 --- a/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx +++ b/packages/app/src/components/ubenchx/CoreMemoryProfilesContent.tsx @@ -4,12 +4,29 @@ import * as d3 from 'd3'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { track } from '@/lib/analytics/analytics'; import { useLocale } from '@/lib/i18n/use-locale'; -import { coreMemoryProfiles, type CoreProfilePanel } from './core-memory-profiles'; +import { + coreMemoryProfiles, + CORE_PROFILE_GPU, + CORE_PROFILE_GPU_KEYS, + type CoreProfilePanel, +} from './core-memory-profiles'; +import { SmL2Content } from './SmL2Heatmap'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select'; const STRINGS = { en: { noPairs: 'No pairs', title: 'Core memory-access profiles', + hardware: 'Hardware', + allHardware: 'All hardware', + comparison: + 'Compare memory-access grouping patterns on B200 and Huawei 950PR. Each device keeps its own color scale: B200 uses clock64 cycles; 950PR uses SYS_CNT ticks. Equal colors or numbers across devices do not mean equal latency.', subtitle: 'Ascend 950PR_9579 · 128 MiB · Cube and Vector scalar controllers', isolated: 'One active core', concurrent: 'Concurrent launch', @@ -35,6 +52,10 @@ const STRINGS = { zh: { noPairs: '无核心对', title: '核心访存特征', + hardware: '硬件', + allHardware: '全部硬件', + comparison: + '对比 B200 与 Huawei 950PR 的访存分组模式。各设备使用独立色标:B200 以 clock64 周期计,950PR 以 SYS_CNT ticks 计。不同设备上颜色或数值相同,并不代表延迟相同。', subtitle: 'Ascend 950PR_9579 · 128 MiB · Cube 与 Vector 标量控制器', isolated: '单个核心执行', concurrent: '并发启动', @@ -268,14 +289,14 @@ function Panel({ panel, max, text }: { panel: CoreProfilePanel; max: number; tex ); } -export function CoreMemoryProfilesContent() { +function AscendCoreProfiles() { const locale = useLocale(), t = STRINGS[locale]; const result = useMemo(coreMemoryProfiles, []); return (
-

{t.title}

+

Huawei 950PR

{t.subtitle}

{t.limits}

@@ -309,3 +330,47 @@ export function CoreMemoryProfilesContent() {
); } + +export function CoreMemoryProfilesContent() { + const locale = useLocale(); + const t = STRINGS[locale]; + const [gpu, setGpu] = useState('all'); + return ( +
+
+

{t.title}

+

{t.comparison}

+
+
+ + +
+ {gpu !== CORE_PROFILE_GPU && } + {(gpu === 'all' || gpu === CORE_PROFILE_GPU) && ( +
+ +
+ )} +
+ ); +} diff --git a/packages/app/src/components/ubenchx/SmL2Heatmap.tsx b/packages/app/src/components/ubenchx/SmL2Heatmap.tsx index 3ba7449cc..c5b2e5f62 100644 --- a/packages/app/src/components/ubenchx/SmL2Heatmap.tsx +++ b/packages/app/src/components/ubenchx/SmL2Heatmap.tsx @@ -12,11 +12,8 @@ import { transformSmL2Run, type SmL2ViewResult } from './sm-l2-transform'; const STRINGS = { en: { - pageTitle: 'SM-SM L2 Latency Difference', - pageSubtitle: - 'Pointer-chase L2 cache benchmark revealing SM-to-SM latency differences and GPC/die topology.', heatmapTitle: 'SM-SM L2 Latency Difference', - colorBarLabel: 'mean |diff| per address (cycles)', + colorBarLabel: 'mean |diff| per address (clock64 cycles)', tooltipSm: 'SM', tooltipGpc: 'GPC', tooltipDie: 'Die', @@ -26,7 +23,7 @@ const STRINGS = { tooltipCol: 'column', methodology: 'Methodology', methodologyText: - 'L2 pointer-chase benchmark: each SM walks a linked-list through L2 cache lines, recording per-hop latency via clock64(). The matrix shows mean |diff| between per-address latency vectors of each SM pair, revealing shared L2 partition proximity.', + 'Each SM walks a linked list through L2 cache lines, recording per-hop latency with clock64(). Each cell is the mean absolute difference between two SMs’ matched-address latency profiles, not direct SM-to-SM communication latency or a physical distance.', statsIntraGpc: 'Intra-GPC mean', statsInterGpc: 'Inter-GPC (same die) mean', statsCrossDie: 'Cross-die mean', @@ -35,10 +32,8 @@ const STRINGS = { noData: 'No SM-L2 distance data available.', }, zh: { - pageTitle: 'SM 间 L2 延迟差异', - pageSubtitle: '基于指针追踪的 L2 缓存基准测试,揭示 SM 间延迟差异和 GPC/die 拓扑结构。', heatmapTitle: 'SM 间 L2 延迟差异', - colorBarLabel: '每地址平均 |差值|(周期)', + colorBarLabel: '每地址平均 |差值|(clock64 周期)', tooltipSm: 'SM', tooltipGpc: 'GPC', tooltipDie: 'Die', @@ -48,7 +43,7 @@ const STRINGS = { tooltipCol: '列', methodology: '测试方法', methodologyText: - 'L2 指针追踪基准测试:每个 SM 沿链表遍历 L2 缓存行,通过 clock64() 记录每跳延迟。矩阵展示每对 SM 的逐地址延迟向量的平均绝对差,揭示共享 L2 分区的远近关系。', + '每个 SM 沿链表遍历 L2 缓存行,并用 clock64() 记录每跳延迟。每个单元格表示两个 SM 在相同地址上测得的延迟特征之间的平均绝对差,既不是 SM 间直接通信延迟,也不是物理距离。', statsIntraGpc: 'GPC 内平均', statsInterGpc: '跨 GPC(同 die)平均', statsCrossDie: '跨 die 平均', @@ -348,17 +343,19 @@ function SmL2HeatmapChart({ result, locale }: { result: SmL2ViewResult; locale: ); } -export function SmL2Content() { +export function SmL2Content({ gpu = 'all' }: { gpu?: string }) { const locale = useLocale(); const t = STRINGS[locale]; const results = useMemo( () => - Object.entries(SM_L2_RUNS).map(([key, run]) => ({ - key, - view: transformSmL2Run(key, run), - })), - [], + Object.entries(SM_L2_RUNS) + .filter(([key]) => gpu === 'all' || gpu === key) + .map(([key, run]) => ({ + key, + view: transformSmL2Run(key, run), + })), + [gpu], ); if (results.length === 0) { @@ -367,11 +364,6 @@ export function SmL2Content() { return (
-
-

{t.pageTitle}

-

{t.pageSubtitle}

-
- {results.map(({ key, view }) => (

diff --git a/packages/app/src/components/ubenchx/UbenchxHub.tsx b/packages/app/src/components/ubenchx/UbenchxHub.tsx index e8269169d..9fc62f3bd 100644 --- a/packages/app/src/components/ubenchx/UbenchxHub.tsx +++ b/packages/app/src/components/ubenchx/UbenchxHub.tsx @@ -21,7 +21,6 @@ const STRINGS = { test: 'Microbenchmark', testTooltip: 'The ubenchX microbenchmark to display.', memBwTitle: 'HBM Bandwidth', - smL2Title: 'SM-SM L2 Latency Difference', tpcSkylineTitle: 'TPC Skyline', coreProfilesTitle: 'Core memory-access profiles', }, @@ -31,7 +30,6 @@ const STRINGS = { test: '微基准测试', testTooltip: '要显示的 ubenchX 微基准测试。', memBwTitle: 'HBM 带宽', - smL2Title: 'SM 间 L2 延迟差异', tpcSkylineTitle: 'TPC Skyline', coreProfilesTitle: '核心访存特征', }, @@ -39,7 +37,6 @@ const STRINGS = { export const UBENCHX_TESTS = [ { slug: 'mem-bw', titleKey: 'memBwTitle' }, - { slug: 'sm-l2-distance', titleKey: 'smL2Title' }, { slug: 'tpc-skyline', titleKey: 'tpcSkylineTitle' }, { slug: 'core-memory-profiles', titleKey: 'coreProfilesTitle' }, ] as const; diff --git a/packages/app/src/components/ubenchx/core-memory-profiles.test.ts b/packages/app/src/components/ubenchx/core-memory-profiles.test.ts index d63e2276b..0691e5ece 100644 --- a/packages/app/src/components/ubenchx/core-memory-profiles.test.ts +++ b/packages/app/src/components/ubenchx/core-memory-profiles.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { summarizeCoreProfile } from './core-memory-profiles'; +import { coreMemoryProfileResults, summarizeCoreProfile } from './core-memory-profiles'; describe('core profile pair statistics', () => { it('averages unique off-diagonal pairs in their decoded groups', () => { @@ -47,3 +47,11 @@ it('preserves an absent pair class instead of inventing a zero measurement', () ), ).toEqual({ withinDieGroupMean: null, betweenDieGroupMean: 8 }); }); + +it('filters the unified collection without inventing absent measurements', () => { + expect(coreMemoryProfileResults('H100 SXM')).toEqual([]); + expect(coreMemoryProfileResults('Ascend 950PR_9579')).toHaveLength(1); + const all = coreMemoryProfileResults(); + expect(all.map((run) => run.gpu)).toEqual(['B200 SXM', 'Ascend 950PR_9579']); + expect(coreMemoryProfileResults('B200 SXM')).toEqual([all[0]]); +}); diff --git a/packages/app/src/components/ubenchx/core-memory-profiles.ts b/packages/app/src/components/ubenchx/core-memory-profiles.ts index c083f383d..6fb852b7c 100644 --- a/packages/app/src/components/ubenchx/core-memory-profiles.ts +++ b/packages/app/src/components/ubenchx/core-memory-profiles.ts @@ -1,4 +1,6 @@ import data from './data/ascend-core-profiles.json'; +import { SM_L2_RUNS } from './sm-l2-data'; +import { transformSmL2Run } from './sm-l2-transform'; export const CORE_PROFILE_GPU = 'Ascend 950PR_9579'; export interface CoreProfilePanel { @@ -67,3 +69,25 @@ export function coreMemoryProfiles() { ], }; } + +/** One page/API collection, preserving each benchmark's native units and schema. */ +export const CORE_PROFILE_GPU_KEYS = [...Object.keys(SM_L2_RUNS), CORE_PROFILE_GPU]; + +export function coreMemoryProfileResults(gpu = 'all') { + const nvidia = Object.entries(SM_L2_RUNS) + .filter(([key]) => gpu === 'all' || gpu === key) + .map(([key, run]) => { + const view = transformSmL2Run(key, run); + return { + ...view, + unit: 'clock64 cycles', + metric: 'Mean absolute difference between matched-address latency profiles', + colorLimits: [0, view.stats.max], + limitations: [ + 'Profile differences are not direct SM-to-SM communication latency or physical coordinates', + 'clock64 cycles and Ascend SYS_CNT ticks are not directly comparable', + ], + }; + }); + return [...nvidia, ...(gpu === 'all' || gpu === CORE_PROFILE_GPU ? [coreMemoryProfiles()] : [])]; +} diff --git a/packages/app/src/lib/api/api-route-catalog.ts b/packages/app/src/lib/api/api-route-catalog.ts index 1dbf8e7b3..f0f40f7bb 100644 --- a/packages/app/src/lib/api/api-route-catalog.ts +++ b/packages/app/src/lib/api/api-route-catalog.ts @@ -518,7 +518,7 @@ export const apiRouteCatalog = [ method: 'GET', classification: 'published-read', operationId: 'get-ubenchx-view', - sourceSha256: '9ecf85848715cddf23b32f74d2f6ede9ee1f33a87e95447d2898532c2f1ac60a', + sourceSha256: '20755a02e4f59eb3d3a833b8b6cb6c8179c046930b72376b06a5817fa5eab05a', }, { source: 'src/app/api/v1/operatorx/runs/route.ts', @@ -1177,7 +1177,7 @@ export const apiContractSourceDigests = [ { source: 'src/components/ubenchx/core-memory-profiles.ts', - sourceSha256: '33e66e68f44e8382bc3b09f33c89f96caeaa011d5171958c4c0f9c1cd98178fb', + sourceSha256: 'e616d19a91e814a414ddcfef871fb89b79b62d81b76b6ace3454a563d48054c8', reviewArea: { en: 'ubenchX Huawei measurement units, protocol metadata and shared UI/API calculations.', zh: 'ubenchX Huawei 测量单位、协议元数据及界面与 API 共用的计算。', diff --git a/packages/app/src/lib/views-api/docs/extensions.ts b/packages/app/src/lib/views-api/docs/extensions.ts index 9e7d053a2..6883701b8 100644 --- a/packages/app/src/lib/views-api/docs/extensions.ts +++ b/packages/app/src/lib/views-api/docs/extensions.ts @@ -357,8 +357,8 @@ const PARAMETER_NOTES: Record = { 'JSON 对象,将视频数据点 ID 映射为 {hourly,source,date} 字符串;hourly 为非负 USD/deployment-hour。', ], gpu: [ - 'GPU key, e.g. "H100 SXM"; default first available GPU. "all" returns every GPU.', - 'GPU 键,如 "H100 SXM";默认首个可用 GPU。设为 "all" 返回全部 GPU。', + 'Accelerator key, e.g. "H100 SXM", "Huawei 950PR", "B200 SXM" or "Ascend 950PR_9579". core-memory-profiles and tpc-skyline default to "all"; other tests default to the first available device. "all" returns all devices; unavailable tests retain an empty gpus array for an explicitly selected device.', + '加速器键,如 "H100 SXM"、"Huawei 950PR"、"B200 SXM" 或 "Ascend 950PR_9579"。core-memory-profiles 和 tpc-skyline 默认 "all",其他测试默认首个可用设备。"all" 返回全部设备;显式选择设备时,没有数据的测试保留空 gpus 数组。', ], test: [ 'ubenchX test selector: mem-bw, sm-l2-distance, tpc-skyline, core-memory-profiles, or all (default). Determines which benchmark data is returned.', @@ -503,8 +503,8 @@ const NEW_VIEWS = { }, ], ubenchx: [ - 'ubenchX microbenchmarks (mem-bw, sm-l2-distance, tpc-skyline, and core-memory-profiles)', - 'ubenchX 微基准测试(mem-bw、sm-l2-distance、tpc-skyline 和 core-memory-profiles)', + 'ubenchX microbenchmarks with per-device protocols and bandwidth references (mem-bw, sm-l2-distance, tpc-skyline, and core-memory-profiles)', + 'ubenchX 微基准测试及各设备的测试协议和带宽参考值(mem-bw、sm-l2-distance、tpc-skyline 和 core-memory-profiles)', { gpus: objects, tests: strings, @@ -526,7 +526,7 @@ export const operations: ApiOperation[] = Object.entries(NEW_VIEWS).map( path: `/api/v1/views/${view}`, summary: text(en, zh), description: text( - `Read-only ${en.toLowerCase()} using the dashboard's source handlers and calculation helpers. Unknown and repeated query keys return 400. The response includes resolved params and preserves missing evidence. Renderer-only styling is not an API parameter.${view === 'ubenchx' ? ' core-memory-profiles returns panels with actual coreIds, dieGroups, full matrices, raw SYS_CNT tick units and unique-pair within/between-group statistics; a missing pair class is null. Shared colorLimits and limitations preserve the interpretation. These are profile differences, not core-to-core latency or a floorplan. mem-bw includes Huawei rotating-pool FP16 graph results. timeMs is amortized per copy for metadata.protocol=rotating-pool-npu-graph. peakBandwidthSource documents the per-run normalization reference; optional rows retain observations, bandwidthP10Gbps, bandwidthP90Gbps, processBandwidthGbps, slots and combinedPoolBytes. Missing sizes are listed in metadata.missingSizesBytes.' : ''}${ + `Read-only ${en.toLowerCase()} using the dashboard's source handlers and calculation helpers. Unknown and repeated query keys return 400. The response includes resolved params and preserves missing evidence. Renderer-only styling is not an API parameter.${view === 'ubenchx' ? ' core-memory-profiles defaults to gpu=all and returns B200 SXM plus Ascend 950PR_9579; gpu selects either device. B200 retains orderedSms, smInfo, gpcBounds, matrix, stats and metadata, with unit=clock64 cycles and its own colorLimits. The legacy sm-l2-distance API remains available with its original shape. Ascend returns panels with actual coreIds, dieGroups, full matrices, raw SYS_CNT tick units and unique-pair within/between-group statistics; a missing pair class is null. Shared colorLimits and limitations preserve the interpretation. These are profile differences, not core-to-core latency or a floorplan. mem-bw includes Huawei rotating-pool FP16 graph results. timeMs is amortized per copy for metadata.protocol=rotating-pool-npu-graph. peakBandwidthSource documents the per-run normalization reference; optional rows retain observations, bandwidthP10Gbps, bandwidthP90Gbps, processBandwidthGbps, slots and combinedPoolBytes. Missing sizes are listed in metadata.missingSizesBytes.' : ''}${ view === 'video' ? ' Only already published artifacts are read. Cell, phase, slot and GPU-basis choices select result evidence and normalized serving rates; x/y/cost/workload filters produce computed tradeoff points. Local bundles and arbitrary URLs are excluded. Responses are no-store.' : view === 'current-inferencex-image' @@ -535,7 +535,7 @@ export const operations: ApiOperation[] = Object.entries(NEW_VIEWS).map( ? ' Telemetry comes from one source per run: its stored DB series once the run is ingested, otherwise its GitHub artifacts. Stored coverage describes the entire run: complete means the recorded artifact/file inventory is present, partial means recorded telemetry is missing, and unknown means no complete inventory was retained; missingArtifacts names entirely missing artifacts and may be empty when only a file is incomplete. GitHub coverage is null (unassessed). Responses use private, no-store; an upstream database failure remains HTTP 503 rather than an empty dataset. File/host series retain separate identities. Raw rows and charts respect selected GPU indices. Statistics cover every chip of the selected file/host series, including startup and warmup, and are computed from its samples on each read; a stored series whose samples do not match its recorded sample count returns none. Mean is sample-weighted, P50/P95/P99 interpolate linearly at p*(N-1), and standard deviation divides by N. These statistics are not serving-window power or J/token. Line time remains relative to the first sample across all chips; missing metric readings are omitted rather than zero-filled. Correlations require both readings. This endpoint projects the raw GPU-metrics explorer, not the inference Power Timeline. Timeline role/window evidence comes from its existing series=power read plus benchmark power_audit. Timeline i_ptaxis, i_ptlines, i_ptwindow, i_ptfocus, i_ptutility and i_ptconc share fields control client rendering only and are not accepted here; they do not change raw telemetry or full-record statistics.' : '' }`, - `只读${zh},使用仪表板的数据读取和计算函数。未知或重复查询键返回 400;响应包含解析后的参数,保留缺失数据。仅影响样式的控件不作为 API 参数。${view === 'ubenchx' ? ' core-memory-profiles 返回各面板的实际 coreIds、dieGroups、完整矩阵、原始 SYS_CNT tick 单位及去重核心对的组内和组间统计;没有对应核心对时为 null。colorLimits 和 limitations 保留统一色标及解释限制。这些数据是访存特征差异,不是核心间通信延迟或物理布局图。 mem-bw 包含 Huawei FP16 轮转缓冲池图执行结果。metadata.protocol=rotating-pool-npu-graph 时,timeMs 为每次拷贝的摊销时间。peakBandwidthSource 说明该次测量采用的归一化参考值;行数据可保留 observations、bandwidthP10Gbps、bandwidthP90Gbps、processBandwidthGbps、slots 和 combinedPoolBytes。缺失大小列在 metadata.missingSizesBytes。' : ''}${ + `只读${zh},使用仪表板的数据读取和计算函数。未知或重复查询键返回 400;响应包含解析后的参数,保留缺失数据。仅影响样式的控件不作为 API 参数。${view === 'ubenchx' ? ' core-memory-profiles 默认 gpu=all,返回 B200 SXM 和 Ascend 950PR_9579;gpu 可单独选择设备。B200 保留 orderedSms、smInfo、gpcBounds、matrix、stats 和 metadata,单位为 clock64 cycles,使用独立 colorLimits。旧版 sm-l2-distance API 仍可使用,响应结构不变。Ascend 返回各面板的实际 coreIds、dieGroups、完整矩阵、原始 SYS_CNT tick 单位及去重核心对的组内和组间统计;没有对应核心对时为 null。colorLimits 和 limitations 保留统一色标及解释限制。这些数据是访存特征差异,不是核心间通信延迟或物理布局图。 mem-bw 包含 Huawei FP16 轮转缓冲池图执行结果。metadata.protocol=rotating-pool-npu-graph 时,timeMs 为每次拷贝的摊销时间。peakBandwidthSource 说明该次测量采用的归一化参考值;行数据可保留 observations、bandwidthP10Gbps、bandwidthP90Gbps、processBandwidthGbps、slots 和 combinedPoolBytes。缺失大小列在 metadata.missingSizesBytes。' : ''}${ view === 'video' ? ' 仅读取已发布产物。cell、阶段、slot 和 GPU 口径选择对应结果证据,并计算 serving 归一化速率;x/y、成本及工作负载筛选生成权衡图数据点。不读取本地数据包或任意 URL。响应不缓存。' : view === 'current-inferencex-image' diff --git a/packages/skills/skills/inferencex-api/integrity.json b/packages/skills/skills/inferencex-api/integrity.json index 02d45f69d..1f8eccdca 100644 --- a/packages/skills/skills/inferencex-api/integrity.json +++ b/packages/skills/skills/inferencex-api/integrity.json @@ -9,7 +9,7 @@ "references/cli-contract.md": "4f070877eeefffad2860c58f79f68432fbe27aa21fc578a1c696f0309a3d7d7b", "references/cli.md": "11e1183f7ed70d669019e8435ac16a6a9f873de027507b8850a9943f6659bfd9", "references/collectivex.md": "f79cf8e2779a9289ab69f79f4a4b338e0b9a5f76a3750a3e969f33a744e726a1", - "references/dashboard-views.md": "5b0b4c6c3114b12196b7e81a0439adf34100721b60d803bbe176c4ac0eeb085e", + "references/dashboard-views.md": "47ef953ebdb4125144d801a697ef9dcabaa4dd02bcb083a052c127635e163990", "references/offline-exports.md": "95aa565dcd4c9e592159baa560a9a58217bc61e395de1c6daf0576795c7f4ec9", "references/pareto.md": "1b4d2d163f982e3f2d97addce310789eae9c1e5badd82dd7501708c9e0385027", "references/powerx.md": "5af5527d54a7e6191a5769080c122638b333b1ceb59e19fdee7df662a5cd3c8f", diff --git a/packages/skills/skills/inferencex-api/references/dashboard-views.md b/packages/skills/skills/inferencex-api/references/dashboard-views.md index ca296cb6a..710a25a4e 100644 --- a/packages/skills/skills/inferencex-api/references/dashboard-views.md +++ b/packages/skills/skills/inferencex-api/references/dashboard-views.md @@ -172,29 +172,29 @@ All paths below are relative to `/api/v1/views/`. The maintained exhaustive query-key list is in the app's OpenAPI contract. The following groups explain which API selectors belong together. -| View | Selection and calculation | -| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `options` | Static registries and defaults, JSON only. Data-dependent run/config choices come from their own views. | -| `inference` | Model, sequence, precisions, date/exact run, GPU/vendor/framework/deployment/spec/power filters; metric, xmode, xstat, xmetric, percentile, optimal/best/allPoints; API-only equal-service sources/target; roleShare and powerFit panels; TCO, custom costs/powers, pricing, unofficial runs, comparison dates/endpoints. JSON or CSV. | -| `historical` | Model, sequence, target, metric, precisions, GPUs/vendors/frameworks/deployment, start/end, TCO and pricing. `extendToDate` labels synthetic extension, defaults to current UTC date. JSON or CSV. | -| `calculator` | Model/sequence/run/date, precisions/GPUs, percentile, target/mode, token type, owning/renting cost, TCO, power budget, cost cap, hide-above-limit and public unofficial runs. JSON or CSV. | -| `first-token` | Benchmark selection plus 1–8 positive TTFT caps in seconds, minimum interactivity, cost provider and token type. Shared dashboard winner selection. | -| `cache-reuse` | AgentX selection plus exact `config` from returned configurations and `recipe` from data.recipes. Cache-reuse curves retain official versus unofficial evidence. | -| `profit-estimator` | AgentX selection, comparison dates/runs, target, utilization, lab revenue share, list/OpenRouter/custom token prices, own/rent/custom chip costs, TCO, actual/theoretical cache-hit mode and provisioned/modeled/compare power. USD/chip-hour. | -| `profit-estimator-per-gigawatt` | Same selectors; USD/GW-year basis and owning-cost default. | -| `fleet` | Model/sequence/precision/GPUs, target/percentile, TCO/token type/cost provider, MW, input/output prices, ramp, cache discount, MTBI, recovery, horizon and metric. JSON or CSV. | -| `evaluation` | Model, task, date, precision and GPU selection; public unofficial runs remain separately labeled and independent of the official date cutoff. JSON or CSV. | -| `reliability` | Rolling range, GPU selection and optional `asOf` date for reproducibility. JSON or CSV. | -| `gpu-specs` | Full hardware properties or selected metric ranking; table/radar/bar are renderings of these values. JSON or CSV. | -| `overview` | Models, model/hardware row limits, hardware tier, engine, comparison mode and reference. JSON or CSV. | -| `rankings` | Ranking kind (model or chip), selected model/scenario and format. Use the exact values in OpenAPI. | -| `compare` | GPU pairs, model/slug, scenario, tier selection and variant. JSON or CSV. | -| `collectivex` | Ordered run selection and suite; EP size/phase/modes/precision/operation/percentile/axis/SKU/backend/series; KV page size/x/y/pull/push/overlap ISL/series; swap direction/layout/metric/percentile/series. | -| `submissions` | Search, table sort/direction/offset/limit, weekly/cumulative chart, on-change cutoff and NVIDIA/AMD/total lines. Table search does not filter the independent submission-volume chart. | -| `current-inferencex-image` | Model, sequence, hardware, precision, speculation, node type, framework families, `asOf` for image age/release status, and `includeHistory` for daily age history. | -| `gpu-metrics` | Required run, file/host artifact, GPU indices, metric or correlation axes, statistics sorting, chart mode and interactive downsampling preference. One telemetry source per run; full-record statistics computed on read. Not a serving-window/role-pool projection. Responses are no-store. | -| `ubenchx` | Test selector (`test`: `mem-bw`, `sm-l2-distance`, `tpc-skyline`, `core-memory-profiles`, or `all`) plus GPU selector (`all` or one GPU). `mem-bw` returns static device-memory copy bandwidth rows with derived MBU and latency. The Huawei key is `Huawei 950PR` (measured SKU `Ascend950PR_9579`): FP16 rotating-pool graph timings, 360 observations per size, and explicit 1,600 GB/s reference assumptions in `peakBandwidthSource`. `metadata.protocol`, CANN/torch_npu versions, and absent sizes distinguish them from the GPU protocol. `timeMs` is amortized graph-copy time for these rows; optional row fields retain p10/p90 bandwidth, process medians, slots and working-set bytes. An explicit device filter leaves unavailable tests empty. `sm-l2-distance` returns SM-to-SM L2 latency difference matrix with GPC/die topology and summary statistics. `tpc-skyline` returns measured TPCs per GPC (sorted descending) with GPC, TPC, and SM counts, defaulting to every GPU. `core-memory-profiles` returns all four Ascend 950PR_9579 scalar-controller matrices (Cube/Vector, isolated/concurrent), actual core IDs, shared color limits, per-die-group means and provenance. Values are mean absolute differences between matched-address profiles in raw `SYS_CNT ticks`, not core-to-core latency or calibrated cycles. No grid-wide barrier is used in concurrent launches. Cell hover, pinning and clear-selection controls are presentation-only; all matrix cells remain available in the API. `all` (default) returns every test. Explicit device filters leave unavailable test sections empty. The Y-axis selector on `/ubenchx/mem-bw` is presentation-only. | -| `video` | CI run/artifact discovery; only already-published artifact reads; source, serving cell, media/fidelity slot, power phase and GPU denominator; same-workload comparisons, axes, deployment costs and selected tradeoff point. No-store. | +| View | Selection and calculation | +| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `options` | Static registries and defaults, JSON only. Data-dependent run/config choices come from their own views. | +| `inference` | Model, sequence, precisions, date/exact run, GPU/vendor/framework/deployment/spec/power filters; metric, xmode, xstat, xmetric, percentile, optimal/best/allPoints; API-only equal-service sources/target; roleShare and powerFit panels; TCO, custom costs/powers, pricing, unofficial runs, comparison dates/endpoints. JSON or CSV. | +| `historical` | Model, sequence, target, metric, precisions, GPUs/vendors/frameworks/deployment, start/end, TCO and pricing. `extendToDate` labels synthetic extension, defaults to current UTC date. JSON or CSV. | +| `calculator` | Model/sequence/run/date, precisions/GPUs, percentile, target/mode, token type, owning/renting cost, TCO, power budget, cost cap, hide-above-limit and public unofficial runs. JSON or CSV. | +| `first-token` | Benchmark selection plus 1–8 positive TTFT caps in seconds, minimum interactivity, cost provider and token type. Shared dashboard winner selection. | +| `cache-reuse` | AgentX selection plus exact `config` from returned configurations and `recipe` from data.recipes. Cache-reuse curves retain official versus unofficial evidence. | +| `profit-estimator` | AgentX selection, comparison dates/runs, target, utilization, lab revenue share, list/OpenRouter/custom token prices, own/rent/custom chip costs, TCO, actual/theoretical cache-hit mode and provisioned/modeled/compare power. USD/chip-hour. | +| `profit-estimator-per-gigawatt` | Same selectors; USD/GW-year basis and owning-cost default. | +| `fleet` | Model/sequence/precision/GPUs, target/percentile, TCO/token type/cost provider, MW, input/output prices, ramp, cache discount, MTBI, recovery, horizon and metric. JSON or CSV. | +| `evaluation` | Model, task, date, precision and GPU selection; public unofficial runs remain separately labeled and independent of the official date cutoff. JSON or CSV. | +| `reliability` | Rolling range, GPU selection and optional `asOf` date for reproducibility. JSON or CSV. | +| `gpu-specs` | Full hardware properties or selected metric ranking; table/radar/bar are renderings of these values. JSON or CSV. | +| `overview` | Models, model/hardware row limits, hardware tier, engine, comparison mode and reference. JSON or CSV. | +| `rankings` | Ranking kind (model or chip), selected model/scenario and format. Use the exact values in OpenAPI. | +| `compare` | GPU pairs, model/slug, scenario, tier selection and variant. JSON or CSV. | +| `collectivex` | Ordered run selection and suite; EP size/phase/modes/precision/operation/percentile/axis/SKU/backend/series; KV page size/x/y/pull/push/overlap ISL/series; swap direction/layout/metric/percentile/series. | +| `submissions` | Search, table sort/direction/offset/limit, weekly/cumulative chart, on-change cutoff and NVIDIA/AMD/total lines. Table search does not filter the independent submission-volume chart. | +| `current-inferencex-image` | Model, sequence, hardware, precision, speculation, node type, framework families, `asOf` for image age/release status, and `includeHistory` for daily age history. | +| `gpu-metrics` | Required run, file/host artifact, GPU indices, metric or correlation axes, statistics sorting, chart mode and interactive downsampling preference. One telemetry source per run; full-record statistics computed on read. Not a serving-window/role-pool projection. Responses are no-store. | +| `ubenchx` | Test selector (`test`: `mem-bw`, `sm-l2-distance`, `tpc-skyline`, `core-memory-profiles`, or `all`) plus GPU selector (`all` or one GPU). `mem-bw` returns static device-memory copy bandwidth rows with derived MBU and latency. The Huawei key is `Huawei 950PR` (measured SKU `Ascend950PR_9579`): FP16 rotating-pool graph timings, 360 observations per size, and explicit 1,600 GB/s reference assumptions in `peakBandwidthSource`. `metadata.protocol`, CANN/torch_npu versions, and absent sizes distinguish them from the GPU protocol. `timeMs` is amortized graph-copy time for these rows; optional row fields retain p10/p90 bandwidth, process medians, slots and working-set bytes. An explicit device filter leaves unavailable tests empty. `sm-l2-distance` returns SM-to-SM L2 latency difference matrix with GPC/die topology and summary statistics. `tpc-skyline` returns measured TPCs per GPC (sorted descending) with GPC, TPC, and SM counts, defaulting to every GPU. `core-memory-profiles` combines B200 SXM and Ascend on `/ubenchx/core-memory-profiles`, defaulting to `gpu=all`; the hardware selector maps to `gpu=B200 SXM` or `gpu=Ascend 950PR_9579`. The old `/ubenchx/sm-l2-distance` page redirects here, but its API remains backward compatible. B200 retains the SM matrix, GPC/die metadata and statistics, with `unit=clock64 cycles` and its own `colorLimits`. The Ascend result returns all four Ascend 950PR_9579 scalar-controller matrices (Cube/Vector, isolated/concurrent), actual core IDs, color limits shared only across its four panels, per-die-group means and provenance. Values are mean absolute differences between matched-address profiles in raw `SYS_CNT ticks`, not core-to-core latency or calibrated cycles. No grid-wide barrier is used in concurrent launches. Cell hover, pinning and clear-selection controls are presentation-only; all matrix cells remain available in the API. `all` (default) returns every test. Explicit device filters leave unavailable test sections empty. The Y-axis selector on `/ubenchx/mem-bw` is presentation-only. | +| `video` | CI run/artifact discovery; only already-published artifact reads; source, serving cell, media/fidelity slot, power phase and GPU denominator; same-workload comparisons, axes, deployment costs and selected tradeoff point. No-store. | ## Interpretation and maintenance @@ -641,3 +641,5 @@ switch/topology fields remain null (unspecified), not their NICs. The and CSV. MI355X's scale-up technology is fourth-generation Infinity Fabric. Chinese ownership-tier wording denotes owning hardware at hyperscaler purchase volume, not a rental quote; the wording does not change the underlying TCO rates. + +Vendor-series colors are presentation-only. Huawei/Ascend series use a shared, theme-aware amber identity across the chart generators; historical dates and high-contrast configurations may use related shades. Colors do not change API measurements, hardware identities, filters or normalization references. Sequential heatmap scales encode values rather than vendor identity.