[Aarch64] memcpy IFUNC for Cavium ThunderX2

Message ID 1518653077.14236.76.camel@cavium.com
State New, archived
Headers

Commit Message

Steve Ellcey Feb. 15, 2018, 12:04 a.m. UTC
  This patch adds a new memcpy ifunc for Cavium ThunderX2.  The difference
between this and the Thunderx version is in the prefetching.  ThunderX2
has different cache characteristics and so uses a different prefetching
strategy.  Note that I prefetch past the end of the buffer being copied
but my understanding is that that is legal and should never generate any
errors.  I tried adding code to not prefetch past the end of the source
but those changes slowed down memcpy so I did not include them.

I did not copy memcpy_thunderx.S to memcpy_thunderx2.S but just use
memcpy_thunderx2.S to set some macros and then include memcpy_thunderx.S.
This is to reduce duplicate code.

I have attached the memcpy benchmark output files from a ThunderX2 run,
the main differences are in bench-memcpy-large.out.

Tested with no regressions, OK to checkin?

Steve Ellcey
sellcey@cavium.com


2018-02-14  Steve Ellcey  <sellcey@cavium.com>

	* sysdeps/aarch64/multiarch/Makefile (sysdep_routines):
	Add memcpy_thunderx2.
	* sysdeps/aarch64/multiarch/ifunc-impl-list.c (MAX_IFUNC):
	Increment to 4.
	(__libc_ifunc_impl_list): Add __memcpy_thunderx2.
	* sysdeps/aarch64/multiarch/memcpy.c (libc_ifunc): Add IS_THUNDERX2
	and IS_THUNDERX2PA checks.
	* sysdeps/aarch64/multiarch/memcpy_thunderx.S (USE_THUNDERX2):
	Use macro to set name appropriately.
	(memcpy): Use USE_THUNDERX2 macro to modify prefetches.
	* sysdeps/aarch64/multiarch/memcpy_thunderx2.S: New file.
	* sysdeps/unix/sysv/linux/aarch64/cpu-features.h (IS_THUNDERX2PA):
	New macro.
	(IS_THUNDERX2): New macro.
{
 "timing_type": "clock_gettime",
 "functions": {
  "memcpy": {
   "bench-variant": "walk",
   "ifuncs": ["__memcpy_thunderx", "__memcpy_thunderx2", "__memcpy_falkor", "__memcpy_generic"],
   "results": [
    {
     "length": 128,
     "timings": [21.4942, 12.1081, 10.3745, 11.6527]
    },
    {
     "length": 144,
     "timings": [11.9032, 11.8052, 11.9287, 11.6242]
    },
    {
     "length": 129,
     "timings": [16.355, 16.3208, 16.2314, 16.2463]
    },
    {
     "length": 143,
     "timings": [18.623, 18.5488, 18.8457, 18.4789]
    },
    {
     "length": 130,
     "timings": [15.6339, 15.6916, 15.494, 15.6021]
    },
    {
     "length": 142,
     "timings": [17.5375, 17.526, 17.7659, 17.4535]
    },
    {
     "length": 131,
     "timings": [16.7222, 16.6609, 16.5655, 16.6152]
    },
    {
     "length": 141,
     "timings": [18.3201, 18.3597, 18.4109, 18.2882]
    },
    {
     "length": 132,
     "timings": [14.3109, 14.3064, 14.1868, 14.172]
    },
    {
     "length": 140,
     "timings": [15.5832, 15.5329, 15.6176, 15.4536]
    },
    {
     "length": 133,
     "timings": [17.0048, 17.0566, 16.89, 16.9499]
    },
    {
     "length": 139,
     "timings": [17.9963, 17.9387, 18.1697, 17.8709]
    },
    {
     "length": 134,
     "timings": [16.3178, 16.2699, 16.148, 16.2449]
    },
    {
     "length": 138,
     "timings": [16.8907, 16.9435, 16.9594, 16.8701]
    },
    {
     "length": 135,
     "timings": [17.2914, 17.2757, 17.3065, 17.2335]
    },
    {
     "length": 137,
     "timings": [17.7278, 17.6447, 17.7162, 17.5823]
    },
    {
     "length": 256,
     "timings": [25.2448, 25.3023, 26.0872, 29.9415]
    },
    {
     "length": 272,
     "timings": [22.6928, 22.5821, 21.5354, 29.5536]
    },
    {
     "length": 257,
     "timings": [26.1641, 26.1446, 25.4013, 30.7717]
    },
    {
     "length": 271,
     "timings": [28.4372, 28.5283, 27.8175, 28.3311]
    },
    {
     "length": 258,
     "timings": [25.6145, 25.5047, 24.791, 30.5721]
    },
    {
     "length": 270,
     "timings": [27.4302, 27.5553, 26.9052, 27.3955]
    },
    {
     "length": 259,
     "timings": [26.4514, 26.3049, 25.7316, 26.3235]
    },
    {
     "length": 269,
     "timings": [27.984, 27.9519, 27.6123, 27.871]
    },
    {
     "length": 260,
     "timings": [24.3513, 24.4159, 23.6787, 30.0601]
    },
    {
     "length": 268,
     "timings": [25.7966, 25.6928, 25.1203, 25.7298]
    },
    {
     "length": 261,
     "timings": [26.6435, 26.6492, 26.2303, 26.5775]
    },
    {
     "length": 267,
     "timings": [27.6926, 27.8337, 27.2131, 27.6297]
    },
    {
     "length": 262,
     "timings": [26.0473, 25.9666, 25.3517, 25.957]
    },
    {
     "length": 266,
     "timings": [27.6607, 26.6481, 26.215, 26.6137]
    },
    {
     "length": 263,
     "timings": [26.8893, 27.0195, 26.3998, 26.8287]
    },
    {
     "length": 265,
     "timings": [27.8088, 27.6209, 26.8362, 27.261]
    },
    {
     "length": 512,
     "timings": [52.8482, 53.1578, 53.0447, 53.2207]
    },
    {
     "length": 528,
     "timings": [43.5152, 43.3533, 41.8301, 43.5236]
    },
    {
     "length": 513,
     "timings": [47.5259, 47.3113, 45.3574, 47.3936]
    },
    {
     "length": 527,
     "timings": [49.3317, 49.3735, 49.0593, 49.9351]
    },
    {
     "length": 514,
     "timings": [47.0049, 46.9728, 45.2575, 46.8779]
    },
    {
     "length": 526,
     "timings": [48.9785, 49.5162, 47.3838, 48.909]
    },
    {
     "length": 515,
     "timings": [48.6102, 48.2008, 45.9038, 47.9531]
    },
    {
     "length": 525,
     "timings": [49.5628, 50.0973, 48.042, 49.4927]
    },
    {
     "length": 516,
     "timings": [46.6467, 46.5889, 44.8825, 46.4017]
    },
    {
     "length": 524,
     "timings": [47.5298, 47.697, 45.8342, 47.4631]
    },
    {
     "length": 517,
     "timings": [48.472, 48.5772, 46.5999, 48.3913]
    },
    {
     "length": 523,
     "timings": [49.2524, 49.2238, 47.6133, 49.2369]
    },
    {
     "length": 518,
     "timings": [47.7013, 47.6045, 45.9706, 47.4991]
    },
    {
     "length": 522,
     "timings": [48.3276, 48.4883, 46.2532, 48.1895]
    },
    {
     "length": 519,
     "timings": [48.8275, 48.565, 46.6277, 48.5724]
    },
    {
     "length": 521,
     "timings": [48.9435, 48.8697, 47.1255, 48.7623]
    },
    {
     "length": 1024,
     "timings": [93.0709, 93.0519, 95.9798, 93.0836]
    },
    {
     "length": 1040,
     "timings": [85.256, 85.7013, 83.3721, 85.2527]
    },
    {
     "length": 1025,
     "timings": [89.0724, 89.3392, 87.0511, 88.8497]
    },
    {
     "length": 1039,
     "timings": [91.1254, 90.7922, 87.7327, 91.2008]
    },
    {
     "length": 1026,
     "timings": [88.7619, 88.5973, 86.6483, 88.9821]
    },
    {
     "length": 1038,
     "timings": [90.94, 90.5825, 88.0679, 90.5443]
    },
    {
     "length": 1027,
     "timings": [90.2511, 89.9322, 88.5148, 89.9398]
    },
    {
     "length": 1037,
     "timings": [91.203, 91.5318, 87.8592, 90.9161]
    },
    {
     "length": 1028,
     "timings": [88.8012, 88.3048, 86.3613, 88.1933]
    },
    {
     "length": 1036,
     "timings": [89.9387, 89.3009, 86.5252, 89.5797]
    },
    {
     "length": 1029,
     "timings": [90.5471, 90.3682, 88.9411, 91.6433]
    },
    {
     "length": 1035,
     "timings": [91.0903, 90.825, 88.3019, 90.8132]
    },
    {
     "length": 1030,
     "timings": [90.3108, 90.5195, 88.7057, 91.0861]
    },
    {
     "length": 1034,
     "timings": [89.914, 90.573, 87.6975, 90.1682]
    },
    {
     "length": 1031,
     "timings": [92.3159, 91.4741, 89.0753, 91.5451]
    },
    {
     "length": 1033,
     "timings": [91.4879, 91.1731, 88.6778, 91.2529]
    },
    {
     "length": 2048,
     "timings": [175.704, 175.238, 180.446, 175.298]
    },
    {
     "length": 2064,
     "timings": [163.105, 163.092, 165.398, 163.142]
    },
    {
     "length": 2049,
     "timings": [168.549, 168.927, 169.223, 168.587]
    },
    {
     "length": 2063,
     "timings": [169.899, 170.562, 168.534, 169.394]
    },
    {
     "length": 2050,
     "timings": [168.125, 168.689, 167.772, 167.363]
    },
    {
     "length": 2062,
     "timings": [170.035, 169.149, 168.54, 169.2]
    },
    {
     "length": 2051,
     "timings": [170.08, 168.958, 168.504, 168.607]
    },
    {
     "length": 2061,
     "timings": [171.254, 170.432, 169.331, 170.98]
    },
    {
     "length": 2052,
     "timings": [167.397, 167.033, 167.543, 167.674]
    },
    {
     "length": 2060,
     "timings": [167.834, 167.542, 168.408, 167.44]
    },
    {
     "length": 2053,
     "timings": [169.932, 169.569, 169.708, 169.122]
    },
    {
     "length": 2059,
     "timings": [169.559, 169.598, 169.227, 169.253]
    },
    {
     "length": 2054,
     "timings": [169.571, 169.659, 168.285, 168.492]
    },
    {
     "length": 2058,
     "timings": [169.654, 170.554, 168.845, 169.32]
    },
    {
     "length": 2055,
     "timings": [170.882, 169.756, 169.014, 169.537]
    },
    {
     "length": 2057,
     "timings": [170.335, 169.665, 168.54, 170.333]
    },
    {
     "length": 4096,
     "timings": [336.924, 336.231, 344.708, 338.517]
    },
    {
     "length": 4112,
     "timings": [324.752, 324.787, 327.219, 325.939]
    },
    {
     "length": 4097,
     "timings": [330.497, 330.542, 331.768, 329.59]
    },
    {
     "length": 4111,
     "timings": [331.838, 331.713, 333.003, 331.598]
    },
    {
     "length": 4098,
     "timings": [329.67, 329.169, 331.191, 329.053]
    },
    {
     "length": 4110,
     "timings": [331.715, 332.634, 331.448, 331.237]
    },
    {
     "length": 4099,
     "timings": [331.002, 332.094, 331.179, 330.109]
    },
    {
     "length": 4109,
     "timings": [331.369, 332.883, 331.399, 331.102]
    },
    {
     "length": 4100,
     "timings": [330.564, 328.229, 330.086, 328.809]
    },
    {
     "length": 4108,
     "timings": [332.456, 331.023, 331.429, 331.226]
    },
    {
     "length": 4101,
     "timings": [332.631, 331.504, 331.001, 332.333]
    },
    {
     "length": 4107,
     "timings": [332.096, 332.101, 331.826, 333.611]
    },
    {
     "length": 4102,
     "timings": [330.443, 329.886, 330.771, 331.822]
    },
    {
     "length": 4106,
     "timings": [331.87, 331.948, 333.989, 331.384]
    },
    {
     "length": 4103,
     "timings": [331.198, 331.799, 332.962, 330.994]
    },
    {
     "length": 4105,
     "timings": [332.266, 331.839, 332.695, 332.206]
    },
    {
     "length": 8192,
     "timings": [671.892, 674.868, 690.552, 671.719]
    },
    {
     "length": 8208,
     "timings": [661.086, 664.091, 665.974, 661.3]
    },
    {
     "length": 8193,
     "timings": [667.8, 666.529, 669.203, 665.603]
    },
    {
     "length": 8207,
     "timings": [672.378, 670.068, 668.224, 669.602]
    },
    {
     "length": 8194,
     "timings": [667.283, 664.222, 669.186, 666.377]
    },
    {
     "length": 8206,
     "timings": [669.514, 669.644, 669.534, 670.466]
    },
    {
     "length": 8195,
     "timings": [665.756, 665.9, 670.204, 666.29]
    },
    {
     "length": 8205,
     "timings": [669.026, 669.292, 670.953, 669.339]
    },
    {
     "length": 8196,
     "timings": [664.39, 663.958, 672.608, 663.733]
    },
    {
     "length": 8204,
     "timings": [666.763, 669.639, 668.723, 666.545]
    },
    {
     "length": 8197,
     "timings": [666.813, 670.607, 669.621, 667.644]
    },
    {
     "length": 8203,
     "timings": [671.102, 673.248, 668.693, 671.452]
    },
    {
     "length": 8198,
     "timings": [669.706, 667.143, 667.829, 666.135]
    },
    {
     "length": 8202,
     "timings": [672.832, 669.015, 668.365, 671.224]
    },
    {
     "length": 8199,
     "timings": [669.127, 667.232, 667.656, 670.565]
    },
    {
     "length": 8201,
     "timings": [667.918, 668.358, 668.792, 672.274]
    },
    {
     "length": 16384,
     "timings": [1317.6, 1319.15, 1334.13, 1320.33]
    },
    {
     "length": 16400,
     "timings": [1309.29, 1307.62, 1321.99, 1308.18]
    },
    {
     "length": 16385,
     "timings": [1308.01, 1309.96, 1316.65, 1310.34]
    },
    {
     "length": 16399,
     "timings": [1312.66, 1319.89, 1312.74, 1313.2]
    },
    {
     "length": 16386,
     "timings": [1310.81, 1314.21, 1309.7, 1310.42]
    },
    {
     "length": 16398,
     "timings": [1310.53, 1318.76, 1311.26, 1310.25]
    },
    {
     "length": 16387,
     "timings": [1317.29, 1311.97, 1311.02, 1311.84]
    },
    {
     "length": 16397,
     "timings": [1319.88, 1313.51, 1313.09, 1312.83]
    },
    {
     "length": 16388,
     "timings": [1316.06, 1309.7, 1310.61, 1315.79]
    },
    {
     "length": 16396,
     "timings": [1312.42, 1310.8, 1311.89, 1317.05]
    },
    {
     "length": 16389,
     "timings": [1312.76, 1309.75, 1312.04, 1318.95]
    },
    {
     "length": 16395,
     "timings": [1313.34, 1311.75, 1312.88, 1313.19]
    },
    {
     "length": 16390,
     "timings": [1308.59, 1310.74, 1317.65, 1311.33]
    },
    {
     "length": 16394,
     "timings": [1313.51, 1311.21, 1317.35, 1312.71]
    },
    {
     "length": 16391,
     "timings": [1311.48, 1312.11, 1318.08, 1309.44]
    },
    {
     "length": 16393,
     "timings": [1310.93, 1319.55, 1310.63, 1312.12]
    },
    {
     "length": 32768,
     "timings": [2595.9, 2590.33, 2631.51, 2618.32]
    },
    {
     "length": 32784,
     "timings": [2600.46, 2586.2, 2614.5, 2608]
    },
    {
     "length": 32769,
     "timings": [2609.86, 2562.88, 2613.12, 2608.49]
    },
    {
     "length": 32783,
     "timings": [2613.98, 2570.92, 2616.49, 2608.56]
    },
    {
     "length": 32770,
     "timings": [2609.15, 2567.9, 2613.76, 2605.96]
    },
    {
     "length": 32782,
     "timings": [2610.04, 2573.38, 2616.85, 2625.11]
    },
    {
     "length": 32771,
     "timings": [2605.42, 2569.22, 2612.92, 2623.97]
    },
    {
     "length": 32781,
     "timings": [2600.68, 2574.84, 2611.34, 2620.07]
    },
    {
     "length": 32772,
     "timings": [2602.07, 2572.18, 2624.23, 2611.9]
    },
    {
     "length": 32780,
     "timings": [2604.5, 2574.5, 2625.3, 2606.05]
    },
    {
     "length": 32773,
     "timings": [2603.11, 2573.3, 2620.02, 2609.19]
    },
    {
     "length": 32779,
     "timings": [2601.56, 2569.64, 2628.39, 2615.26]
    },
    {
     "length": 32774,
     "timings": [2605.01, 2584.86, 2613.18, 2612.1]
    },
    {
     "length": 32778,
     "timings": [2603.56, 2584.18, 2613.99, 2610.46]
    },
    {
     "length": 32775,
     "timings": [2602.43, 2580.67, 2614.89, 2612.38]
    },
    {
     "length": 32777,
     "timings": [2618.48, 2616.33, 2632.45, 2621.59]
    },
    {
     "length": 65536,
     "timings": [5234.94, 5145.52, 5244.1, 5225.91]
    },
    {
     "length": 65552,
     "timings": [5208.3, 5140.68, 5227.81, 5212.91]
    },
    {
     "length": 65537,
     "timings": [5202.93, 5123.47, 5219.33, 5221.05]
    },
    {
     "length": 65551,
     "timings": [5191.36, 5135.38, 5213.92, 5243.45]
    },
    {
     "length": 65538,
     "timings": [5180.56, 5133.16, 5214.6, 5229.25]
    },
    {
     "length": 65550,
     "timings": [5184.6, 5131.44, 5232.76, 5203.49]
    },
    {
     "length": 65539,
     "timings": [5174.45, 5123.6, 5234.01, 5207.62]
    },
    {
     "length": 65549,
     "timings": [5179.56, 5129.87, 5232.09, 5213.52]
    },
    {
     "length": 65540,
     "timings": [5175.95, 5126.31, 5251.79, 5228.54]
    },
    {
     "length": 65548,
     "timings": [5206.04, 5180.98, 5230.14, 5219.02]
    },
    {
     "length": 65541,
     "timings": [5207.72, 5173.66, 5226.82, 5215.72]
    },
    {
     "length": 65547,
     "timings": [5191.6, 5186.73, 5228.78, 5225.24]
    },
    {
     "length": 65542,
     "timings": [5189.36, 5171.51, 5236.01, 5219.3]
    },
    {
     "length": 65546,
     "timings": [5213.25, 5135.73, 5225.89, 5222.1]
    },
    {
     "length": 65543,
     "timings": [5226.38, 5163.58, 5216.51, 5211.48]
    },
    {
     "length": 65545,
     "timings": [5221.43, 5138.37, 5219.37, 5255.64]
    },
    {
     "length": 131072,
     "timings": [10389.3, 10293.1, 10472.7, 10502.4]
    },
    {
     "length": 131088,
     "timings": [10401.3, 10288, 10449, 10453.6]
    },
    {
     "length": 131073,
     "timings": [10350.1, 10269.7, 10421.7, 10433.2]
    },
    {
     "length": 131087,
     "timings": [10351.2, 10260.1, 10466.6, 10400.5]
    },
    {
     "length": 131074,
     "timings": [10339.2, 10255.1, 10467.2, 10385.2]
    },
    {
     "length": 131086,
     "timings": [10344.5, 10249.5, 10482.8, 10428.7]
    },
    {
     "length": 131075,
     "timings": [10357.3, 10257.2, 10469.7, 10409.2]
    },
    {
     "length": 131085,
     "timings": [10347.7, 10285.1, 10412.9, 10419.6]
    },
    {
     "length": 131076,
     "timings": [10341.6, 10279.2, 10407.3, 10375.9]
    },
    {
     "length": 131084,
     "timings": [10326.8, 10284.5, 10379.3, 10374.5]
    },
    {
     "length": 131077,
     "timings": [10312.1, 10269, 10386.1, 10385.8]
    },
    {
     "length": 131083,
     "timings": [10362.3, 10225.5, 10399.1, 10375.6]
    },
    {
     "length": 131078,
     "timings": [10361.4, 10228.9, 10381.8, 10365.1]
    },
    {
     "length": 131082,
     "timings": [10373, 10215.7, 10395.8, 10381]
    },
    {
     "length": 131079,
     "timings": [10340.1, 10224.7, 10392.6, 10420.1]
    },
    {
     "length": 131081,
     "timings": [10312.7, 10229.3, 10404.7, 10442.3]
    },
    {
     "length": 262144,
     "timings": [20670, 20481.2, 20884.1, 20937]
    },
    {
     "length": 262160,
     "timings": [20694.1, 20555.6, 20982.5, 20846.1]
    },
    {
     "length": 262145,
     "timings": [20697.5, 20538, 20967.1, 20875.2]
    },
    {
     "length": 262159,
     "timings": [20709.4, 20563.9, 20986.8, 20823.1]
    },
    {
     "length": 262146,
     "timings": [20696.1, 20519.1, 20938.3, 20843.9]
    },
    {
     "length": 262158,
     "timings": [20700.4, 20628.4, 20852.1, 20836.8]
    },
    {
     "length": 262147,
     "timings": [20705.9, 20623.1, 20885.7, 20837.5]
    },
    {
     "length": 262157,
     "timings": [20691.6, 20619.7, 20872, 20834]
    },
    {
     "length": 262148,
     "timings": [20676.7, 20613, 20858.1, 20827.3]
    },
    {
     "length": 262156,
     "timings": [20804.2, 20524.1, 20879.3, 20850.5]
    },
    {
     "length": 262149,
     "timings": [20786.2, 20521.8, 20898.8, 20856.1]
    },
    {
     "length": 262155,
     "timings": [20801.4, 20543.4, 20871.4, 20850.6]
    },
    {
     "length": 262150,
     "timings": [20793.4, 20584.5, 20861, 20929.3]
    },
    {
     "length": 262154,
     "timings": [20748.3, 20541.8, 20850.5, 20895.9]
    },
    {
     "length": 262151,
     "timings": [20718.4, 20563.5, 20876.5, 20925.4]
    },
    {
     "length": 262153,
     "timings": [20749.6, 20536.6, 20964.1, 20829.3]
    },
    {
     "length": 524288,
     "timings": [41411.8, 41106.3, 41863.4, 41785]
    },
    {
     "length": 524304,
     "timings": [41455.4, 41150.7, 41787, 41759.3]
    },
    {
     "length": 524289,
     "timings": [41455.8, 41100.8, 41889.1, 41719.6]
    },
    {
     "length": 524303,
     "timings": [41442.2, 41267.7, 41698.5, 41673.4]
    },
    {
     "length": 524290,
     "timings": [41465.1, 41295.5, 41624.5, 41685.5]
    },
    {
     "length": 524302,
     "timings": [41412.1, 41303, 41638.7, 41682.6]
    },
    {
     "length": 524291,
     "timings": [41356.4, 41247.5, 41680.2, 41613.4]
    },
    {
     "length": 524301,
     "timings": [41556.6, 41199.1, 41797.9, 41773.3]
    },
    {
     "length": 524292,
     "timings": [41731.6, 41149.2, 41613.4, 41834]
    },
    {
     "length": 524300,
     "timings": [41640.6, 41145.2, 41621, 41678.1]
    },
    {
     "length": 524293,
     "timings": [41578.8, 41129.2, 41720.9, 41842.1]
    },
    {
     "length": 524299,
     "timings": [41435.2, 41053, 41716.6, 41866]
    },
    {
     "length": 524294,
     "timings": [41412.4, 41061.1, 41598.4, 41856.3]
    },
    {
     "length": 524298,
     "timings": [41424.3, 41094.5, 41782.8, 41753.5]
    },
    {
     "length": 524295,
     "timings": [41406.8, 41085.6, 41863, 41678.3]
    },
    {
     "length": 524297,
     "timings": [41404.4, 41087.3, 41854.5, 41680.5]
    },
    {
     "length": 1048576,
     "timings": [82511.6, 81892.2, 83806.2, 83242.7]
    },
    {
     "length": 1048592,
     "timings": [82752.3, 82483.6, 83590.6, 83285.5]
    },
    {
     "length": 1048577,
     "timings": [82644.1, 82410.6, 83596.1, 83274.2]
    },
    {
     "length": 1048591,
     "timings": [82707.2, 82435.8, 83430.8, 83079.2]
    },
    {
     "length": 1048578,
     "timings": [82460.8, 82442.7, 83338.4, 83229.7]
    },
    {
     "length": 1048590,
     "timings": [82881.9, 82052, 83312, 83190]
    },
    {
     "length": 1048579,
     "timings": [82873.1, 82048.1, 83314.1, 83196.4]
    },
    {
     "length": 1048589,
     "timings": [82905.8, 82065.3, 83510.2, 83179.5]
    },
    {
     "length": 1048580,
     "timings": [82946.6, 82041.2, 83374.1, 83377.3]
    },
    {
     "length": 1048588,
     "timings": [82733.6, 82087.8, 83498.9, 83539.8]
    },
    {
     "length": 1048581,
     "timings": [82510.9, 82058.3, 83430.8, 83537.5]
    },
    {
     "length": 1048587,
     "timings": [82655, 82172.2, 83457.7, 83553.9]
    },
    {
     "length": 1048582,
     "timings": [82693.9, 82085, 83905.9, 83226.6]
    },
    {
     "length": 1048586,
     "timings": [82571.2, 82091.4, 83867.7, 83127]
    },
    {
     "length": 1048583,
     "timings": [82719.1, 82143.8, 83875.2, 83133.6]
    },
    {
     "length": 1048585,
     "timings": [82516.2, 82404.7, 83478.9, 83309.7]
    },
    {
     "length": 2097152,
     "timings": [164733, 164589, 166935, 166529]
    },
    {
     "length": 2097168,
     "timings": [165315, 164842, 167224, 166447]
    },
    {
     "length": 2097153,
     "timings": [165290, 164943, 167233, 166543]
    },
    {
     "length": 2097167,
     "timings": [166116, 164585, 167213, 166767]
    },
    {
     "length": 2097154,
     "timings": [166496, 164460, 167049, 166635]
    },
    {
     "length": 2097166,
     "timings": [166541, 164626, 167328, 166674]
    },
    {
     "length": 2097155,
     "timings": [166251, 164565, 167468, 167790]
    },
    {
     "length": 2097165,
     "timings": [165837, 164399, 167248, 167805]
    },
    {
     "length": 2097156,
     "timings": [165833, 164586, 167251, 167657]
    },
    {
     "length": 2097164,
     "timings": [165953, 164762, 167337, 167766]
    },
    {
     "length": 2097157,
     "timings": [165761, 164271, 168014, 167129]
    },
    {
     "length": 2097163,
     "timings": [165756, 164242, 168203, 166923]
    },
    {
     "length": 2097158,
     "timings": [165762, 164262, 167882, 166952]
    },
    {
     "length": 2097162,
     "timings": [165806, 165258, 167369, 166881]
    },
    {
     "length": 2097159,
     "timings": [165728, 165104, 167373, 166924]
    },
    {
     "length": 2097161,
     "timings": [165658, 165127, 167202, 167118]
    },
    {
     "length": 4194304,
     "timings": [325306, 325422, 331019, 330932]
    },
    {
     "length": 4194320,
     "timings": [329836, 326429, 332112, 331623]
    },
    {
     "length": 4194305,
     "timings": [331052, 327420, 332432, 331337]
    },
    {
     "length": 4194319,
     "timings": [331086, 327701, 332758, 332044]
    },
    {
     "length": 4194306,
     "timings": [331446, 327814, 333324, 333956]
    },
    {
     "length": 4194318,
     "timings": [330616, 328046, 333149, 334159]
    },
    {
     "length": 4194307,
     "timings": [331978, 330048, 334128, 335087]
    },
    {
     "length": 4194317,
     "timings": [331020, 329299, 334711, 335221]
    },
    {
     "length": 4194308,
     "timings": [331024, 329204, 335078, 334162]
    },
    {
     "length": 4194316,
     "timings": [331349, 328971, 335746, 333316]
    },
    {
     "length": 4194309,
     "timings": [331112, 328961, 335749, 333236]
    },
    {
     "length": 4194315,
     "timings": [331118, 328870, 336153, 333769]
    },
    {
     "length": 4194310,
     "timings": [331128, 330514, 333186, 333561]
    },
    {
     "length": 4194314,
     "timings": [330699, 330451, 334237, 333751]
    },
    {
     "length": 4194311,
     "timings": [330583, 330584, 333149, 333214]
    },
    {
     "length": 4194313,
     "timings": [332382, 328472, 333463, 332856]
    },
    {
     "length": 8388608,
     "timings": [641456, 634152, 651086, 654462]
    },
    {
     "length": 8388624,
     "timings": [654839, 647849, 659480, 660866]
    },
    {
     "length": 8388609,
     "timings": [659152, 651294, 663755, 661841]
    },
    {
     "length": 8388623,
     "timings": [659552, 652481, 664962, 665532]
    },
    {
     "length": 8388610,
     "timings": [658591, 655029, 665046, 666072]
    },
    {
     "length": 8388622,
     "timings": [659788, 654660, 665589, 667326]
    },
    {
     "length": 8388611,
     "timings": [659960, 656234, 667766, 668440]
    },
    {
     "length": 8388621,
     "timings": [662218, 656202, 670929, 666084]
    },
    {
     "length": 8388612,
     "timings": [661049, 656828, 670542, 666266]
    },
    {
     "length": 8388620,
     "timings": [662265, 657178, 670942, 665838]
    },
    {
     "length": 8388613,
     "timings": [662444, 657960, 670719, 666705]
    },
    {
     "length": 8388619,
     "timings": [661585, 661394, 667169, 666752]
    },
    {
     "length": 8388614,
     "timings": [661258, 660601, 668496, 666908]
    },
    {
     "length": 8388618,
     "timings": [661808, 659921, 668734, 666890]
    },
    {
     "length": 8388615,
     "timings": [664495, 657584, 668248, 666445]
    },
    {
     "length": 8388617,
     "timings": [664702, 657572, 668319, 666694]
    },
    {
     "length": 16777216,
     "timings": [1.27261e+06, 1.26146e+06, 1.29016e+06, 1.29426e+06]
    },
    {
     "length": 16777232,
     "timings": [1.30006e+06, 1.28565e+06, 1.31264e+06, 1.31258e+06]
    },
    {
     "length": 16777217,
     "timings": [1.31015e+06, 1.30083e+06, 1.32193e+06, 1.32538e+06]
    },
    {
     "length": 16777231,
     "timings": [1.31127e+06, 1.30257e+06, 1.32501e+06, 1.32987e+06]
    },
    {
     "length": 16777218,
     "timings": [1.3145e+06, 1.30764e+06, 1.3275e+06, 1.33293e+06]
    },
    {
     "length": 16777230,
     "timings": [1.31805e+06, 1.30798e+06, 1.32839e+06, 1.33494e+06]
    },
    {
     "length": 16777219,
     "timings": [1.31974e+06, 1.31023e+06, 1.33794e+06, 1.32992e+06]
    },
    {
     "length": 16777229,
     "timings": [1.32168e+06, 1.31127e+06, 1.33738e+06, 1.3311e+06]
    },
    {
     "length": 16777220,
     "timings": [1.32106e+06, 1.31238e+06, 1.34065e+06, 1.33133e+06]
    },
    {
     "length": 16777228,
     "timings": [1.3219e+06, 1.31063e+06, 1.3414e+06, 1.33194e+06]
    },
    {
     "length": 16777221,
     "timings": [1.32005e+06, 1.3187e+06, 1.3354e+06, 1.33155e+06]
    },
    {
     "length": 16777227,
     "timings": [1.32054e+06, 1.32018e+06, 1.3351e+06, 1.32962e+06]
    },
    {
     "length": 16777222,
     "timings": [1.32057e+06, 1.3198e+06, 1.33597e+06, 1.331e+06]
    },
    {
     "length": 16777226,
     "timings": [1.32308e+06, 1.3205e+06, 1.33287e+06, 1.33312e+06]
    },
    {
     "length": 16777223,
     "timings": [1.329e+06, 1.31592e+06, 1.33316e+06, 1.33445e+06]
    },
    {
     "length": 16777225,
     "timings": [1.32979e+06, 1.31714e+06, 1.33506e+06, 1.33387e+06]
    },
    {
     "length": 33554432,
     "timings": [2.51792e+06, 2.52166e+06, 2.59244e+06, 2.60674e+06]
    },
    {
     "length": 33554448,
     "timings": [2.60894e+06, 2.5847e+06, 2.63487e+06, 2.64577e+06]
    },
    {
     "length": 33554433,
     "timings": [2.61534e+06, 2.60074e+06, 2.64385e+06, 2.65299e+06]
    },
    {
     "length": 33554447,
     "timings": [2.63056e+06, 2.61246e+06, 2.65376e+06, 2.66364e+06]
    },
    {
     "length": 33554434,
     "timings": [2.63604e+06, 2.61824e+06, 2.6572e+06, 2.66914e+06]
    },
    {
     "length": 33554446,
     "timings": [2.6411e+06, 2.62655e+06, 2.67998e+06, 2.66654e+06]
    },
    {
     "length": 33554435,
     "timings": [2.64574e+06, 2.62811e+06, 2.68315e+06, 2.66351e+06]
    },
    {
     "length": 33554445,
     "timings": [2.64374e+06, 2.62928e+06, 2.6852e+06, 2.6643e+06]
    },
    {
     "length": 33554436,
     "timings": [2.64434e+06, 2.62816e+06, 2.6762e+06, 2.65708e+06]
    },
    {
     "length": 33554444,
     "timings": [2.64448e+06, 2.6378e+06, 2.67052e+06, 2.6634e+06]
    },
    {
     "length": 33554437,
     "timings": [2.64484e+06, 2.63917e+06, 2.67594e+06, 2.66426e+06]
    },
    {
     "length": 33554443,
     "timings": [2.64513e+06, 2.6408e+06, 2.66354e+06, 2.66087e+06]
    },
    {
     "length": 33554438,
     "timings": [2.64512e+06, 2.64452e+06, 2.6703e+06, 2.66438e+06]
    },
    {
     "length": 33554442,
     "timings": [2.66122e+06, 2.62832e+06, 2.66512e+06, 2.66527e+06]
    },
    {
     "length": 33554439,
     "timings": [2.65762e+06, 2.62926e+06, 2.66946e+06, 2.66218e+06]
    },
    {
     "length": 33554441,
     "timings": [2.65784e+06, 2.63056e+06, 2.6657e+06, 2.66116e+06]
    }]
  }
 }
}
{
 "timing_type": "clock_gettime",
 "functions": {
  "memcpy": {
   "bench-variant": "large",
   "ifuncs": ["__memcpy_thunderx", "__memcpy_thunderx2", "__memcpy_falkor", "__memcpy_generic"],
   "results": [
    {
     "length": 65543,
     "align1": 0,
     "align2": 0,
     "timings": [4952.19, 3911.56, 4265.62, 4186.56]
    },
    {
     "length": 65551,
     "align1": 0,
     "align2": 3,
     "timings": [7200.62, 6689.69, 6710.31, 7721.25]
    },
    {
     "length": 65567,
     "align1": 3,
     "align2": 0,
     "timings": [7217.19, 6589.38, 6704.69, 7725.94]
    },
    {
     "length": 65599,
     "align1": 3,
     "align2": 5,
     "timings": [7180, 6666.25, 6716.25, 7710.31]
    },
    {
     "length": 131079,
     "align1": 0,
     "align2": 0,
     "timings": [9199.69, 8032.19, 8692.81, 8607.81]
    },
    {
     "length": 131087,
     "align1": 0,
     "align2": 3,
     "timings": [14681.6, 13440.3, 13447.8, 15530.9]
    },
    {
     "length": 131103,
     "align1": 3,
     "align2": 0,
     "timings": [14448.8, 13276.2, 13458.1, 16159.1]
    },
    {
     "length": 131135,
     "align1": 3,
     "align2": 5,
     "timings": [15579.1, 13508.1, 13440.3, 17059.1]
    },
    {
     "length": 262151,
     "align1": 0,
     "align2": 0,
     "timings": [23862.2, 24441.9, 23240.6, 24191.9]
    },
    {
     "length": 262159,
     "align1": 0,
     "align2": 3,
     "timings": [29275.3, 27609.4, 28409.4, 32469.7]
    },
    {
     "length": 262175,
     "align1": 3,
     "align2": 0,
     "timings": [29203.1, 27083.4, 28423.1, 32277.8]
    },
    {
     "length": 262207,
     "align1": 3,
     "align2": 5,
     "timings": [30024.7, 27598.8, 28440.6, 32579.7]
    },
    {
     "length": 524295,
     "align1": 0,
     "align2": 0,
     "timings": [47389.1, 49070.9, 46514.1, 48664.4]
    },
    {
     "length": 524303,
     "align1": 0,
     "align2": 3,
     "timings": [58346.2, 55055, 56669.4, 64995]
    },
    {
     "length": 524319,
     "align1": 3,
     "align2": 0,
     "timings": [58154.7, 54030, 56661.2, 64466.2]
    },
    {
     "length": 524351,
     "align1": 3,
     "align2": 5,
     "timings": [58316.6, 55081.9, 56688.8, 64808.8]
    },
    {
     "length": 1048583,
     "align1": 0,
     "align2": 0,
     "timings": [94339.4, 97932.2, 92883.4, 97073.1]
    },
    {
     "length": 1048591,
     "align1": 0,
     "align2": 3,
     "timings": [116498, 110074, 114012, 129668]
    },
    {
     "length": 1048607,
     "align1": 3,
     "align2": 0,
     "timings": [116019, 108027, 113263, 129315]
    },
    {
     "length": 1048639,
     "align1": 3,
     "align2": 5,
     "timings": [116542, 110031, 113199, 130458]
    },
    {
     "length": 2097159,
     "align1": 0,
     "align2": 0,
     "timings": [187454, 195817, 186657, 194690]
    },
    {
     "length": 2097167,
     "align1": 0,
     "align2": 3,
     "timings": [232980, 220797, 226448, 259975]
    },
    {
     "length": 2097183,
     "align1": 3,
     "align2": 0,
     "timings": [232321, 215874, 227196, 257367]
    },
    {
     "length": 2097215,
     "align1": 3,
     "align2": 5,
     "timings": [233585, 220098, 227131, 259478]
    },
    {
     "length": 4194311,
     "align1": 0,
     "align2": 0,
     "timings": [375384, 392390, 371983, 390365]
    },
    {
     "length": 4194319,
     "align1": 0,
     "align2": 3,
     "timings": [466357, 441015, 452582, 519416]
    },
    {
     "length": 4194335,
     "align1": 3,
     "align2": 0,
     "timings": [465100, 432780, 453555, 514612]
    },
    {
     "length": 4194367,
     "align1": 3,
     "align2": 5,
     "timings": [465788, 441147, 453362, 519520]
    },
    {
     "length": 8388615,
     "align1": 0,
     "align2": 0,
     "timings": [749325, 783571, 745284, 780129]
    },
    {
     "length": 8388623,
     "align1": 0,
     "align2": 3,
     "timings": [932040, 881769, 906085, 1.03847e+06]
    },
    {
     "length": 8388639,
     "align1": 3,
     "align2": 0,
     "timings": [929061, 864950, 906292, 1.03044e+06]
    },
    {
     "length": 8388671,
     "align1": 3,
     "align2": 5,
     "timings": [933193, 881767, 906506, 1.03859e+06]
    },
    {
     "length": 16777223,
     "align1": 0,
     "align2": 0,
     "timings": [1.68678e+06, 1.72441e+06, 1.66096e+06, 1.73277e+06]
    },
    {
     "length": 16777231,
     "align1": 0,
     "align2": 3,
     "timings": [1.88663e+06, 1.80531e+06, 1.93916e+06, 2.10617e+06]
    },
    {
     "length": 16777247,
     "align1": 3,
     "align2": 0,
     "timings": [1.87686e+06, 1.77372e+06, 1.93076e+06, 2.08584e+06]
    },
    {
     "length": 16777279,
     "align1": 3,
     "align2": 5,
     "timings": [1.88337e+06, 1.80137e+06, 1.93296e+06, 2.10337e+06]
    },
    {
     "length": 33554439,
     "align1": 0,
     "align2": 0,
     "timings": [4.396e+06, 4.5285e+06, 4.68021e+06, 4.77554e+06]
    },
    {
     "length": 33554447,
     "align1": 0,
     "align2": 3,
     "timings": [4.61064e+06, 4.70503e+06, 5.43449e+06, 5.3109e+06]
    },
    {
     "length": 33554463,
     "align1": 3,
     "align2": 0,
     "timings": [4.58765e+06, 4.62832e+06, 5.41532e+06, 5.26046e+06]
    },
    {
     "length": 33554495,
     "align1": 3,
     "align2": 5,
     "timings": [4.59319e+06, 4.67679e+06, 5.41229e+06, 5.28254e+06]
    }]
  }
 }
}
{
 "timing_type": "clock_gettime",
 "functions": {
  "memcpy": {
   "bench-variant": "random",
   "ifuncs": ["__memcpy_thunderx", "__memcpy_thunderx2", "__memcpy_falkor", "__memcpy_generic"],
   "results": [
    {
     "max-size": 4096,
     "timings": [21376.6, 21515.2, 20931.9, 21168.9]
    },
    {
     "max-size": 8192,
     "timings": [20861.4, 20868.7, 20698.2, 20629.8]
    },
    {
     "max-size": 16384,
     "timings": [22469.3, 22571, 21596.5, 22362.8]
    },
    {
     "max-size": 32768,
     "timings": [25299.5, 25167.7, 23612.3, 25089.9]
    },
    {
     "max-size": 65536,
     "timings": [27192, 27121, 25251.6, 27007.6]
    }]
  }
 }
}
{
 "timing_type": "clock_gettime",
 "functions": {
  "memcpy": {
   "bench-variant": "default",
   "ifuncs": ["builtin_memcpy", "simple_memcpy", "__memcpy_thunderx", "__memcpy_thunderx2", "__memcpy_falkor", "__memcpy_generic"],
   "results": [
    {
     "length": 1,
     "align1": 0,
     "align2": 0,
     "timings": [128.984, 17.8906, 18.8281, 16.5625, 19.375, 16.25]
    },
    {
     "length": 1,
     "align1": 0,
     "align2": 0,
     "timings": [18.125, 13.2031, 16.0938, 16.0156, 15.5469, 15.5469]
    },
    {
     "length": 1,
     "align1": 0,
     "align2": 0,
     "timings": [17.6562, 13.0469, 15.3906, 16.0156, 15.2344, 15.2344]
    },
    {
     "length": 1,
     "align1": 0,
     "align2": 0,
     "timings": [17.2656, 12.9688, 15.7031, 15.3125, 15.3125, 15.3906]
    },
    {
     "length": 2,
     "align1": 0,
     "align2": 0,
     "timings": [17.3438, 18.9062, 15.5469, 15.3125, 17.1094, 15.3906]
    },
    {
     "length": 2,
     "align1": 1,
     "align2": 0,
     "timings": [17.5, 16.7969, 15.625, 14.2969, 16.0156, 15.3125]
    },
    {
     "length": 2,
     "align1": 0,
     "align2": 1,
     "timings": [17.6562, 16.6406, 15.625, 14.5312, 16.3281, 15]
    },
    {
     "length": 2,
     "align1": 1,
     "align2": 1,
     "timings": [17.3438, 16.0938, 15.4688, 15.2344, 15.7812, 16.0156]
    },
    {
     "length": 4,
     "align1": 0,
     "align2": 0,
     "timings": [16.0938, 29.9219, 15.2344, 14.8438, 16.0156, 16.1719]
    },
    {
     "length": 4,
     "align1": 2,
     "align2": 0,
     "timings": [17.0312, 28.5938, 14.8438, 14.5312, 15.0781, 14.4531]
    },
    {
     "length": 4,
     "align1": 0,
     "align2": 2,
     "timings": [16.7188, 31.4844, 15.1562, 14.5312, 14.8438, 14.6094]
    },
    {
     "length": 4,
     "align1": 2,
     "align2": 2,
     "timings": [16.6406, 31.4062, 14.5312, 14.4531, 14.6094, 15]
    },
    {
     "length": 8,
     "align1": 0,
     "align2": 0,
     "timings": [16.7188, 21.9531, 15.3125, 14.7656, 16.3281, 14.7656]
    },
    {
     "length": 8,
     "align1": 3,
     "align2": 0,
     "timings": [16.1719, 19.6094, 15.1562, 14.8438, 14.1406, 14.4531]
    },
    {
     "length": 8,
     "align1": 0,
     "align2": 3,
     "timings": [16.5625, 19.7656, 14.9219, 15.1562, 14.375, 14.6875]
    },
    {
     "length": 8,
     "align1": 3,
     "align2": 3,
     "timings": [16.4062, 19.8438, 14.7656, 14.7656, 13.5156, 14.2969]
    },
    {
     "length": 16,
     "align1": 0,
     "align2": 0,
     "timings": [16.4062, 30.8594, 14.9219, 14.2188, 16.1719, 14.2969]
    },
    {
     "length": 16,
     "align1": 4,
     "align2": 0,
     "timings": [17.0312, 28.2031, 14.6094, 15.2344, 14.375, 14.5312]
    },
    {
     "length": 16,
     "align1": 0,
     "align2": 4,
     "timings": [16.4062, 27.7344, 14.375, 14.6094, 13.6719, 14.0625]
    },
    {
     "length": 16,
     "align1": 4,
     "align2": 4,
     "timings": [16.4062, 26.7969, 14.6094, 14.2969, 15.0781, 14.2969]
    },
    {
     "length": 32,
     "align1": 0,
     "align2": 0,
     "timings": [17.5781, 44.6094, 15.9375, 14.6094, 14.0625, 15.5469]
    },
    {
     "length": 32,
     "align1": 5,
     "align2": 0,
     "timings": [16.7969, 42.8125, 14.8438, 14.375, 14.2188, 15.0781]
    },
    {
     "length": 32,
     "align1": 0,
     "align2": 5,
     "timings": [16.3281, 44.8438, 14.6094, 14.2188, 14.0625, 14.4531]
    },
    {
     "length": 32,
     "align1": 5,
     "align2": 5,
     "timings": [16.7188, 45.2344, 15.625, 15.5469, 14.5312, 14.0625]
    },
    {
     "length": 64,
     "align1": 0,
     "align2": 0,
     "timings": [17.1875, 76.1719, 15.8594, 15, 16.7188, 14.8438]
    },
    {
     "length": 64,
     "align1": 6,
     "align2": 0,
     "timings": [17.5, 74.375, 16.3281, 16.4844, 16.0938, 16.4844]
    },
    {
     "length": 64,
     "align1": 0,
     "align2": 6,
     "timings": [17.1094, 74.8438, 16.7969, 16.25, 14.8438, 15.625]
    },
    {
     "length": 64,
     "align1": 6,
     "align2": 6,
     "timings": [18.5156, 74.6094, 18.125, 18.3594, 17.4219, 17.7344]
    },
    {
     "length": 128,
     "align1": 0,
     "align2": 0,
     "timings": [21.4844, 168.516, 21.7188, 18.125, 17.0312, 19.8438]
    },
    {
     "length": 128,
     "align1": 7,
     "align2": 0,
     "timings": [23.0469, 168.359, 22.4219, 22.7344, 19.375, 21.1719]
    },
    {
     "length": 128,
     "align1": 0,
     "align2": 7,
     "timings": [22.8125, 168.359, 22.5, 21.7969, 19.1406, 20.9375]
    },
    {
     "length": 128,
     "align1": 7,
     "align2": 7,
     "timings": [22.9688, 167.812, 23.3594, 23.2031, 23.5938, 22.0312]
    },
    {
     "length": 256,
     "align1": 0,
     "align2": 0,
     "timings": [24.6094, 276.875, 25.2344, 23.125, 23.9062, 37.2656]
    },
    {
     "length": 256,
     "align1": 8,
     "align2": 0,
     "timings": [25.7031, 276.484, 25.3906, 24.8438, 24.2969, 37.3438]
    },
    {
     "length": 256,
     "align1": 0,
     "align2": 8,
     "timings": [25.5469, 278.125, 24.6094, 25, 23.9844, 35.8594]
    },
    {
     "length": 256,
     "align1": 8,
     "align2": 8,
     "timings": [24.6094, 276.406, 25.9375, 24.0625, 23.5938, 34.5312]
    },
    {
     "length": 512,
     "align1": 0,
     "align2": 0,
     "timings": [34.7656, 533.359, 35.625, 33.0469, 36.1719, 32.5]
    },
    {
     "length": 512,
     "align1": 9,
     "align2": 0,
     "timings": [50.7031, 533.438, 50.3125, 49.2969, 48.125, 49.2969]
    },
    {
     "length": 512,
     "align1": 0,
     "align2": 9,
     "timings": [51.1719, 534.609, 50.7812, 50.4688, 47.3438, 50.3906]
    },
    {
     "length": 512,
     "align1": 9,
     "align2": 9,
     "timings": [38.9844, 533.125, 39.2969, 38.8281, 39.2188, 37.2656]
    },
    {
     "length": 1024,
     "align1": 0,
     "align2": 0,
     "timings": [52.5, 1119.14, 55.4688, 52.0312, 61.9531, 52.0312]
    },
    {
     "length": 1024,
     "align1": 10,
     "align2": 0,
     "timings": [87.7344, 1043.28, 86.4844, 85.8594, 83.75, 85.7812]
    },
    {
     "length": 1024,
     "align1": 0,
     "align2": 10,
     "timings": [88.5156, 1046.25, 88.125, 87.2656, 82.7344, 88.3594]
    },
    {
     "length": 1024,
     "align1": 10,
     "align2": 10,
     "timings": [60, 1042.73, 57.3438, 60.2344, 62.5, 57.5781]
    },
    {
     "length": 2048,
     "align1": 0,
     "align2": 0,
     "timings": [91.6406, 2064.14, 90.5469, 91.0156, 110.625, 88.75]
    },
    {
     "length": 2048,
     "align1": 11,
     "align2": 0,
     "timings": [161.953, 2064.14, 160.156, 160.156, 156.016, 160.078]
    },
    {
     "length": 2048,
     "align1": 0,
     "align2": 11,
     "timings": [161.562, 2072.27, 160.859, 160.234, 155.234, 159.297]
    },
    {
     "length": 2048,
     "align1": 11,
     "align2": 11,
     "timings": [95.3906, 2064.84, 95.0781, 102.891, 113.359, 99.4531]
    },
    {
     "length": 4096,
     "align1": 0,
     "align2": 0,
     "timings": [370.625, 4110.62, 163.984, 164.297, 216.641, 164.688]
    },
    {
     "length": 4096,
     "align1": 12,
     "align2": 0,
     "timings": [306.953, 4108.75, 305.938, 305.547, 288.672, 306.016]
    },
    {
     "length": 4096,
     "align1": 0,
     "align2": 12,
     "timings": [307.5, 4118.44, 307.656, 307.969, 289.375, 306.016]
    },
    {
     "length": 4096,
     "align1": 12,
     "align2": 12,
     "timings": [172.578, 4108.36, 168.359, 170.469, 216.016, 171.484]
    },
    {
     "length": 8192,
     "align1": 0,
     "align2": 0,
     "timings": [343.438, 8194.06, 329.219, 340.781, 448.203, 332.891]
    },
    {
     "length": 8192,
     "align1": 13,
     "align2": 0,
     "timings": [598.203, 8194.14, 614.766, 612.734, 622.5, 614.062]
    },
    {
     "length": 8192,
     "align1": 0,
     "align2": 13,
     "timings": [592.109, 8221.88, 590.781, 590.859, 618.047, 578.047]
    },
    {
     "length": 8192,
     "align1": 13,
     "align2": 13,
     "timings": [351.562, 8193.98, 330.312, 341.562, 438.906, 335.469]
    },
    {
     "length": 16384,
     "align1": 0,
     "align2": 0,
     "timings": [682.109, 16367.3, 663.594, 660.078, 819.688, 662.031]
    },
    {
     "length": 16384,
     "align1": 14,
     "align2": 0,
     "timings": [1241.41, 16369.5, 1236.33, 1238.83, 1316.33, 1233.91]
    },
    {
     "length": 16384,
     "align1": 0,
     "align2": 14,
     "timings": [1179.22, 16480.6, 1176.09, 1178.98, 1297.27, 1169.53]
    },
    {
     "length": 16384,
     "align1": 14,
     "align2": 14,
     "timings": [685.391, 16481, 678.359, 684.141, 817.109, 680.156]
    },
    {
     "length": 32768,
     "align1": 0,
     "align2": 0,
     "timings": [1925.78, 32713.4, 2022.97, 1927.81, 2109.22, 2082.03]
    },
    {
     "length": 32768,
     "align1": 15,
     "align2": 0,
     "timings": [3322.34, 32713.5, 3620.78, 3322.27, 3338.05, 3879.84]
    },
    {
     "length": 32768,
     "align1": 0,
     "align2": 15,
     "timings": [3290.62, 33222.4, 3547.19, 3284.38, 3335.39, 3939.38]
    },
    {
     "length": 32768,
     "align1": 15,
     "align2": 15,
     "timings": [1931.09, 32713.9, 2023.05, 1923.2, 2114.22, 2083.83]
    },
    {
     "length": 65536,
     "align1": 0,
     "align2": 0,
     "timings": [3920.94, 65409.2, 4118.12, 3915.62, 4200.16, 4147.27]
    },
    {
     "length": 65536,
     "align1": 16,
     "align2": 0,
     "timings": [3843.2, 65574.3, 4013.44, 3821.64, 4199.84, 4134.38]
    },
    {
     "length": 65536,
     "align1": 0,
     "align2": 16,
     "timings": [3947.89, 66601.6, 4014.77, 3823.67, 4199.84, 4135.62]
    },
    {
     "length": 65536,
     "align1": 16,
     "align2": 16,
     "timings": [3988.28, 65417.9, 4017.42, 3830, 4200.31, 4138.59]
    },
    {
     "length": 0,
     "align1": 0,
     "align2": 0,
     "timings": [23.3594, 14.7656, 17.7344, 15.3906, 18.5938, 17.1875]
    },
    {
     "length": 0,
     "align1": 0,
     "align2": 0,
     "timings": [17.6562, 12.9688, 15.5469, 15.4688, 16.5625, 15.4688]
    },
    {
     "length": 0,
     "align1": 0,
     "align2": 0,
     "timings": [17.4219, 12.8125, 15.625, 15.3906, 16.1719, 15.3906]
    },
    {
     "length": 0,
     "align1": 0,
     "align2": 0,
     "timings": [17.5, 12.9688, 15.625, 15.3125, 16.4062, 15.1562]
    },
    {
     "length": 1,
     "align1": 0,
     "align2": 0,
     "timings": [17.6562, 13.75, 16.25, 15.4688, 16.0938, 16.9531]
    },
    {
     "length": 1,
     "align1": 1,
     "align2": 0,
     "timings": [17.3438, 12.8125, 15.7031, 15.5469, 15.4688, 15.3906]
    },
    {
     "length": 1,
     "align1": 0,
     "align2": 1,
     "timings": [17.5781, 13.0469, 15.7031, 14.2188, 15.0781, 15.1562]
    },
    {
     "length": 1,
     "align1": 1,
     "align2": 1,
     "timings": [17.4219, 12.1875, 15.5469, 15.1562, 15.3125, 15.3125]
    },
    {
     "length": 2,
     "align1": 0,
     "align2": 0,
     "timings": [17.2656, 17.3438, 15.4688, 15.5469, 16.4062, 15.0781]
    },
    {
     "length": 2,
     "align1": 2,
     "align2": 0,
     "timings": [17.1094, 15.625, 15.7812, 15.2344, 15.5469, 15.3906]
    },
    {
     "length": 2,
     "align1": 0,
     "align2": 2,
     "timings": [16.4062, 13.9062, 15.7031, 15.3906, 15.4688, 15.3906]
    },
    {
     "length": 2,
     "align1": 2,
     "align2": 2,
     "timings": [17.1094, 13.5156, 15.7812, 15.3125, 15.7812, 15.3906]
    },
    {
     "length": 3,
     "align1": 0,
     "align2": 0,
     "timings": [17.3438, 17.1094, 15.7031, 15.3125, 16.0156, 15.4688]
    },
    {
     "length": 3,
     "align1": 3,
     "align2": 0,
     "timings": [16.6406, 15.3906, 15.3906, 15.2344, 15.625, 15.3906]
    },
    {
     "length": 3,
     "align1": 0,
     "align2": 3,
     "timings": [16.6406, 15.7031, 15.5469, 15.3125, 15.3906, 15.3906]
    },
    {
     "length": 3,
     "align1": 3,
     "align2": 3,
     "timings": [17.3438, 15.2344, 16.3281, 15.625, 15.7812, 15.3906]
    },
    {
     "length": 4,
     "align1": 0,
     "align2": 0,
     "timings": [16.7969, 29.6875, 15.3125, 14.8438, 15.9375, 15.1562]
    },
    {
     "length": 4,
     "align1": 4,
     "align2": 0,
     "timings": [16.4844, 29.375, 14.8438, 14.5312, 14.9219, 14.5312]
    },
    {
     "length": 4,
     "align1": 0,
     "align2": 4,
     "timings": [16.5625, 29.6094, 14.8438, 14.6094, 16.0156, 14.7656]
    },
    {
     "length": 4,
     "align1": 4,
     "align2": 4,
     "timings": [16.5625, 30.8594, 15, 14.5312, 14.0625, 14.4531]
    },
    {
     "length": 5,
     "align1": 0,
     "align2": 0,
     "timings": [16.3281, 35.3125, 15.2344, 14.4531, 14.375, 14.5312]
    },
    {
     "length": 5,
     "align1": 5,
     "align2": 0,
     "timings": [16.1719, 34.6875, 15, 14.4531, 14.1406, 14.5312]
    },
    {
     "length": 5,
     "align1": 0,
     "align2": 5,
     "timings": [16.4062, 34.1406, 15, 14.4531, 14.1406, 14.5312]
    },
    {
     "length": 5,
     "align1": 5,
     "align2": 5,
     "timings": [16.4062, 38.2031, 14.5312, 14.6094, 14.8438, 14.5312]
    },
    {
     "length": 6,
     "align1": 0,
     "align2": 0,
     "timings": [16.25, 19.7656, 14.5312, 14.4531, 13.9844, 14.5312]
    },
    {
     "length": 6,
     "align1": 6,
     "align2": 0,
     "timings": [16.4062, 18.6719, 14.7656, 14.5312, 14.1406, 14.375]
    },
    {
     "length": 6,
     "align1": 0,
     "align2": 6,
     "timings": [16.4062, 17.3438, 14.6875, 14.375, 14.1406, 14.5312]
    },
    {
     "length": 6,
     "align1": 6,
     "align2": 6,
     "timings": [16.1719, 17.1094, 14.4531, 14.375, 14.5312, 14.7656]
    },
    {
     "length": 7,
     "align1": 0,
     "align2": 0,
     "timings": [16.6406, 20.1562, 14.6094, 14.5312, 14.1406, 14.5312]
    },
    {
     "length": 7,
     "align1": 7,
     "align2": 0,
     "timings": [16.25, 19.375, 14.5312, 14.5312, 14.1406, 14.5312]
    },
    {
     "length": 7,
     "align1": 0,
     "align2": 7,
     "timings": [16.25, 18.125, 14.6094, 14.375, 14.1406, 14.375]
    },
    {
     "length": 7,
     "align1": 7,
     "align2": 7,
     "timings": [16.5625, 17.6562, 14.6875, 14.4531, 14.2969, 14.4531]
    },
    {
     "length": 8,
     "align1": 0,
     "align2": 0,
     "timings": [16.5625, 21.4062, 14.8438, 14.6875, 14.2969, 14.7656]
    },
    {
     "length": 8,
     "align1": 8,
     "align2": 0,
     "timings": [16.3281, 19.5312, 14.9219, 14.9219, 15, 14.1406]
    },
    {
     "length": 8,
     "align1": 0,
     "align2": 8,
     "timings": [16.3281, 19.0625, 14.9219, 14.4531, 13.4375, 14.375]
    },
    {
     "length": 8,
     "align1": 8,
     "align2": 8,
     "timings": [16.4062, 18.6719, 14.8438, 14.2188, 13.6719, 14.375]
    },
    {
     "length": 9,
     "align1": 0,
     "align2": 0,
     "timings": [16.3281, 22.6562, 14.6875, 14.5312, 13.125, 14.375]
    },
    {
     "length": 9,
     "align1": 9,
     "align2": 0,
     "timings": [16.25, 20.9375, 14.5312, 14.4531, 13.5938, 14.4531]
    },
    {
     "length": 9,
     "align1": 0,
     "align2": 9,
     "timings": [16.4062, 20.0781, 14.6094, 14.2969, 13.5156, 14.2969]
    },
    {
     "length": 9,
     "align1": 9,
     "align2": 9,
     "timings": [16.4062, 19.9219, 14.6875, 14.4531, 13.0469, 14.2969]
    },
    {
     "length": 10,
     "align1": 0,
     "align2": 0,
     "timings": [16.4062, 23.6719, 14.6094, 14.375, 13.0469, 14.2969]
    },
    {
     "length": 10,
     "align1": 10,
     "align2": 0,
     "timings": [16.5625, 21.7969, 14.6875, 14.5312, 13.0469, 14.2969]
    },
    {
     "length": 10,
     "align1": 0,
     "align2": 10,
     "timings": [16.25, 20.9375, 14.7656, 14.375, 13.0469, 14.2188]
    },
    {
     "length": 10,
     "align1": 10,
     "align2": 10,
     "timings": [16.25, 20.625, 14.4531, 14.375, 12.8906, 14.2969]
    },
    {
     "length": 11,
     "align1": 0,
     "align2": 0,
     "timings": [16.6406, 23.5156, 14.5312, 14.2969, 13.4375, 14.2969]
    },
    {
     "length": 11,
     "align1": 11,
     "align2": 0,
     "timings": [16.3281, 22.4219, 15.0781, 14.2969, 13.4375, 14.2188]
    },
    {
     "length": 11,
     "align1": 0,
     "align2": 11,
     "timings": [16.3281, 22.1875, 14.4531, 14.375, 13.4375, 14.2969]
    },
    {
     "length": 11,
     "align1": 11,
     "align2": 11,
     "timings": [16.5625, 22.2656, 14.6094, 14.375, 13.2031, 14.5312]
    },
    {
     "length": 12,
     "align1": 0,
     "align2": 0,
     "timings": [16.3281, 24.6094, 14.5312, 14.1406, 13.125, 14.375]
    },
    {
     "length": 12,
     "align1": 12,
     "align2": 0,
     "timings": [16.4062, 24.5312, 15, 14.375, 12.9688, 14.2188]
    },
    {
     "length": 12,
     "align1": 0,
     "align2": 12,
     "timings": [16.5625, 23.2812, 15.1562, 14.4531, 13.125, 14.375]
    },
    {
     "length": 12,
     "align1": 12,
     "align2": 12,
     "timings": [16.0156, 23.125, 15.0781, 14.2969, 13.9844, 14.2969]
    },
    {
     "length": 13,
     "align1": 0,
     "align2": 0,
     "timings": [16.0938, 26.0156, 15, 15.1562, 13.125, 14.2969]
    },
    {
     "length": 13,
     "align1": 13,
     "align2": 0,
     "timings": [16.25, 25.3906, 15.3125, 14.6094, 13.4375, 14.4531]
    },
    {
     "length": 13,
     "align1": 0,
     "align2": 13,
     "timings": [16.4844, 149.062, 16.875, 14.9219, 13.5938, 14.375]
    },
    {
     "length": 13,
     "align1": 13,
     "align2": 13,
     "timings": [16.7188, 23.8281, 15.1562, 14.6094, 13.6719, 14.4531]
    },
    {
     "length": 14,
     "align1": 0,
     "align2": 0,
     "timings": [16.0938, 26.6406, 15.3125, 14.4531, 13.2031, 14.2969]
    },
    {
     "length": 14,
     "align1": 14,
     "align2": 0,
     "timings": [16.25, 25.8594, 15.0781, 14.2188, 13.2812, 14.2969]
    },
    {
     "length": 14,
     "align1": 0,
     "align2": 14,
     "timings": [16.4062, 24.6875, 14.5312, 14.2969, 13.5156, 14.2188]
    },
    {
     "length": 14,
     "align1": 14,
     "align2": 14,
     "timings": [16.25, 24.7656, 14.4531, 14.6875, 13.5156, 14.8438]
    },
    {
     "length": 15,
     "align1": 0,
     "align2": 0,
     "timings": [16.4062, 27.8906, 14.4531, 14.375, 13.0469, 14.2188]
    },
    {
     "length": 15,
     "align1": 15,
     "align2": 0,
     "timings": [16.25, 27.1094, 14.6094, 14.375, 12.9688, 14.2969]
    },
    {
     "length": 15,
     "align1": 0,
     "align2": 15,
     "timings": [16.4844, 25.8594, 14.7656, 14.5312, 13.0469, 14.2969]
    },
    {
     "length": 15,
     "align1": 15,
     "align2": 15,
     "timings": [16.3281, 25.7031, 14.8438, 14.5312, 12.8906, 14.375]
    },
    {
     "length": 16,
     "align1": 0,
     "align2": 0,
     "timings": [16.5625, 28.6719, 14.7656, 14.375, 13.5938, 14.2969]
    },
    {
     "length": 16,
     "align1": 16,
     "align2": 0,
     "timings": [16.5625, 27.1875, 14.5312, 14.375, 12.9688, 14.2188]
    },
    {
     "length": 16,
     "align1": 0,
     "align2": 16,
     "timings": [16.6406, 26.9531, 14.9219, 14.4531, 13.2812, 14.4531]
    },
    {
     "length": 16,
     "align1": 16,
     "align2": 16,
     "timings": [16.4062, 26.5625, 14.5312, 14.4531, 13.3594, 14.2969]
    },
    {
     "length": 17,
     "align1": 0,
     "align2": 0,
     "timings": [16.9531, 29.5312, 16.5625, 14.8438, 14.5312, 15.7812]
    },
    {
     "length": 17,
     "align1": 17,
     "align2": 0,
     "timings": [16.1719, 27.9688, 15.0781, 14.2188, 13.8281, 13.2812]
    },
    {
     "length": 17,
     "align1": 0,
     "align2": 17,
     "timings": [16.1719, 27.6562, 15.3906, 14.8438, 13.9062, 13.5156]
    },
    {
     "length": 17,
     "align1": 17,
     "align2": 17,
     "timings": [16.5625, 27.8125, 15.7812, 15.3125, 14.9219, 15.1562]
    },
    {
     "length": 18,
     "align1": 0,
     "align2": 0,
     "timings": [16.4062, 29.4531, 14.4531, 14.4531, 13.6719, 14.2188]
    },
    {
     "length": 18,
     "align1": 18,
     "align2": 0,
     "timings": [16.0938, 29.2188, 13.9844, 14.6094, 13.4375, 12.8906]
    },
    {
     "length": 18,
     "align1": 0,
     "align2": 18,
     "timings": [16.25, 29.2188, 15.3906, 14.7656, 13.9844, 14.6875]
    },
    {
     "length": 18,
     "align1": 18,
     "align2": 18,
     "timings": [16.7188, 29.0625, 16.1719, 15.7031, 14.7656, 15.5469]
    },
    {
     "length": 19,
     "align1": 0,
     "align2": 0,
     "timings": [16.0938, 30.3125, 14.5312, 14.2969, 13.8281, 12.8125]
    },
    {
     "length": 19,
     "align1": 19,
     "align2": 0,
     "timings": [15.8594, 29.9219, 14.8438, 14.4531, 13.2812, 13.0469]
    },
    {
     "length": 19,
     "align1": 0,
     "align2": 19,
     "timings": [16.4062, 30.7812, 15.3906, 14.4531, 13.9062, 13.2812]
    },
    {
     "length": 19,
     "align1": 19,
     "align2": 19,
     "timings": [16.0938, 30.625, 15.7812, 15.3906, 14.5312, 13.9062]
    },
    {
     "length": 20,
     "align1": 0,
     "align2": 0,
     "timings": [16.0938, 31.4062, 14.6875, 15, 13.8281, 13.2031]
    },
    {
     "length": 20,
     "align1": 20,
     "align2": 0,
     "timings": [16.0156, 31.3281, 14.7656, 14.6094, 14.2188, 14.0625]
    },
    {
     "length": 20,
     "align1": 0,
     "align2": 20,
     "timings": [15.9375, 31.25, 14.5312, 14.4531, 13.6719, 14.2188]
    },
    {
     "length": 20,
     "align1": 20,
     "align2": 20,
     "timings": [16.1719, 31.0156, 15.3906, 14.6094, 14.0625, 13.2812]
    },
    {
     "length": 21,
     "align1": 0,
     "align2": 0,
     "timings": [16.4062, 32.2656, 14.7656, 14.6094, 13.9844, 14.7656]
    },
    {
     "length": 21,
     "align1": 21,
     "align2": 0,
     "timings": [16.25, 32.4219, 14.7656, 14.5312, 13.9844, 14.5312]
    },
    {
     "length": 21,
     "align1": 0,
     "align2": 21,
     "timings": [16.1719, 32.1875, 15.3906, 14.6875, 13.9844, 14.8438]
    },
    {
     "length": 21,
     "align1": 21,
     "align2": 21,
     "timings": [16.5625, 31.9531, 16.4844, 15.5469, 14.9219, 15.625]
    },
    {
     "length": 22,
     "align1": 0,
     "align2": 0,
     "timings": [16.0156, 33.2031, 14.7656, 14.5312, 13.75, 13.2812]
    },
    {
     "length": 22,
     "align1": 22,
     "align2": 0,
     "timings": [16.0938, 32.9688, 14.6875, 14.9219, 13.8281, 13.0469]
    },
    {
     "length": 22,
     "align1": 0,
     "align2": 22,
     "timings": [15.8594, 33.2031, 15.5469, 15, 13.9844, 14.5312]
    },
    {
     "length": 22,
     "align1": 22,
     "align2": 22,
     "timings": [17.0312, 32.9688, 15.7812, 15.625, 15.0781, 15.7812]
    },
    {
     "length": 23,
     "align1": 0,
     "align2": 0,
     "timings": [16.0156, 34.1406, 15.0781, 14.6094, 13.9062, 13.0469]
    },
    {
     "length": 23,
     "align1": 23,
     "align2": 0,
     "timings": [16.0156, 34.0625, 15.2344, 14.5312, 14.375, 12.9688]
    },
    {
     "length": 23,
     "align1": 0,
     "align2": 23,
     "timings": [16.1719, 33.5938, 15.2344, 14.9219, 13.9062, 13.8281]
    },
    {
     "length": 23,
     "align1": 23,
     "align2": 23,
     "timings": [16.6406, 33.6719, 16.3281, 15.8594, 15, 14.375]
    },
    {
     "length": 24,
     "align1": 0,
     "align2": 0,
     "timings": [16.0156, 35.7812, 14.2188, 14.2188, 13.8281, 12.7344]
    },
    {
     "length": 24,
     "align1": 24,
     "align2": 0,
     "timings": [16.25, 35.1562, 14.2969, 14.2188, 13.6719, 14.8438]
    },
    {
     "length": 24,
     "align1": 0,
     "align2": 24,
     "timings": [15.8594, 35.2344, 14.2188, 14.1406, 13.5938, 14.0625]
    },
    {
     "length": 24,
     "align1": 24,
     "align2": 24,
     "timings": [15.9375, 35, 14.2969, 14.2188, 13.6719, 14.0625]
    },
    {
     "length": 25,
     "align1": 0,
     "align2": 0,
     "timings": [16.3281, 36.9531, 15.1562, 14.9219, 14.0625, 13.2812]
    },
    {
     "length": 25,
     "align1": 25,
     "align2": 0,
     "timings": [16.0938, 36.0156, 14.8438, 14.6094, 13.75, 13.4375]
    },
    {
     "length": 25,
     "align1": 0,
     "align2": 25,
     "timings": [16.0156, 35.625, 15.1562, 14.7656, 13.9062, 13.2812]
    },
    {
     "length": 25,
     "align1": 25,
     "align2": 25,
     "timings": [16.4062, 35.625, 15.7031, 15.5469, 14.375, 13.9844]
    },
    {
     "length": 26,
     "align1": 0,
     "align2": 0,
     "timings": [16.1719, 37.7344, 14.9219, 14.5312, 13.6719, 14.6875]
    },
    {
     "length": 26,
     "align1": 26,
     "align2": 0,
     "timings": [16.25, 37.1094, 15.0781, 14.6875, 13.9062, 13.2031]
    },
    {
     "length": 26,
     "align1": 0,
     "align2": 26,
     "timings": [16.0156, 36.9531, 15.2344, 15.0781, 14.0625, 13.2812]
    },
    {
     "length": 26,
     "align1": 26,
     "align2": 26,
     "timings": [16.5625, 37.0312, 15.625, 15.5469, 16.0938, 15.3125]
    },
    {
     "length": 27,
     "align1": 0,
     "align2": 0,
     "timings": [16.25, 39.2969, 14.8438, 14.6875, 13.9062, 13.3594]
    },
    {
     "length": 27,
     "align1": 27,
     "align2": 0,
     "timings": [15.9375, 38.0469, 15.1562, 14.5312, 13.9062, 13.3594]
    },
    {
     "length": 27,
     "align1": 0,
     "align2": 27,
     "timings": [16.1719, 37.8125, 15.2344, 14.9219, 14.0625, 13.2812]
    },
    {
     "length": 27,
     "align1": 27,
     "align2": 27,
     "timings": [16.6406, 37.5781, 16.6406, 15.7031, 14.1406, 15.5469]
    },
    {
     "length": 28,
     "align1": 0,
     "align2": 0,
     "timings": [16.0938, 39.2188, 14.9219, 14.5312, 13.9844, 14.4531]
    },
    {
     "length": 28,
     "align1": 28,
     "align2": 0,
     "timings": [16.3281, 39.0625, 14.6875, 14.375, 14.2969, 14.0625]
    },
    {
     "length": 28,
     "align1": 0,
     "align2": 28,
     "timings": [16.0156, 39.0625, 14.6875, 14.4531, 13.9844, 14.2969]
    },
    {
     "length": 28,
     "align1": 28,
     "align2": 28,
     "timings": [16.1719, 38.75, 15, 15, 13.8281, 13.4375]
    },
    {
     "length": 29,
     "align1": 0,
     "align2": 0,
     "timings": [16.0938, 41.3281, 15.4688, 14.8438, 13.8281, 13.0469]
    },
    {
     "length": 29,
     "align1": 29,
     "align2": 0,
     "timings": [16.7969, 40.0781, 14.9219, 14.6875, 14.2188, 14.6094]
    },
    {
     "length": 29,
     "align1": 0,
     "align2": 29,
     "timings": [16.4062, 40, 15.1562, 14.8438, 13.9062, 13.2812]
    },
    {
     "length": 29,
     "align1": 29,
     "align2": 29,
     "timings": [16.7188, 39.6094, 15.7812, 15.5469, 14.2969, 15.2344]
    },
    {
     "length": 30,
     "align1": 0,
     "align2": 0,
     "timings": [16.1719, 41.1719, 15.2344, 14.8438, 13.8281, 13.3594]
    },
    {
     "length": 30,
     "align1": 30,
     "align2": 0,
     "timings": [16.0938, 41.5625, 15.0781, 14.6875, 14.4531, 13.2031]
    },
    {
     "length": 30,
     "align1": 0,
     "align2": 30,
     "timings": [16.3281, 41.0938, 15.3125, 14.8438, 14.2188, 14.7656]
    },
    {
     "length": 30,
     "align1": 30,
     "align2": 30,
     "timings": [16.5625, 40.5469, 15.5469, 15.625, 14.2188, 15.3125]
    },
    {
     "length": 31,
     "align1": 0,
     "align2": 0,
     "timings": [16.1719, 42.8125, 15.1562, 14.6875, 13.6719, 14.5312]
    },
    {
     "length": 31,
     "align1": 31,
     "align2": 0,
     "timings": [16.4062, 42.0312, 15.0781, 14.6875, 14.375, 13.5156]
    },
    {
     "length": 31,
     "align1": 0,
     "align2": 31,
     "timings": [16.1719, 41.5625, 15.1562, 14.5312, 13.9062, 13.125]
    },
    {
     "length": 31,
     "align1": 31,
     "align2": 31,
     "timings": [16.5625, 41.7969, 15.8594, 15.7031, 14.8438, 15.1562]
    },
    {
     "length": 48,
     "align1": 0,
     "align2": 0,
     "timings": [16.9531, 88.5938, 15.4688, 14.8438, 15.4688, 14.7656]
    },
    {
     "length": 48,
     "align1": 3,
     "align2": 0,
     "timings": [17.3438, 88.5156, 16.875, 16.3281, 16.7188, 16.1719]
    },
    {
     "length": 48,
     "align1": 0,
     "align2": 3,
     "timings": [17.1094, 88.5156, 16.5625, 16.0156, 15.1562, 14.5312]
    },
    {
     "length": 48,
     "align1": 3,
     "align2": 3,
     "timings": [18.9844, 88.4375, 18.75, 18.2812, 17.5781, 17.0312]
    },
    {
     "length": 80,
     "align1": 0,
     "align2": 0,
     "timings": [17.5, 91.6406, 16.4062, 15.3125, 16.25, 15]
    },
    {
     "length": 80,
     "align1": 5,
     "align2": 0,
     "timings": [19.6094, 90.9375, 18.75, 18.2812, 19.7656, 16.7969]
    },
    {
     "length": 80,
     "align1": 0,
     "align2": 5,
     "timings": [19.1406, 90.7812, 18.3594, 18.6719, 19.2188, 18.125]
    },
    {
     "length": 80,
     "align1": 5,
     "align2": 5,
     "timings": [22.3438, 90.4688, 21.7969, 21.4844, 23.9844, 21.25]
    },
    {
     "length": 96,
     "align1": 0,
     "align2": 0,
     "timings": [17.0312, 108.047, 15.4688, 15.3906, 15.1562, 13.75]
    },
    {
     "length": 96,
     "align1": 6,
     "align2": 0,
     "timings": [19.1406, 107.969, 18.5938, 18.2031, 19.6094, 17.8906]
    },
    {
     "length": 96,
     "align1": 0,
     "align2": 6,
     "timings": [19.1406, 106.719, 18.5156, 18.4375, 18.6719, 18.2031]
    },
    {
     "length": 96,
     "align1": 6,
     "align2": 6,
     "timings": [21.875, 106.406, 21.4062, 21.5625, 24.0625, 19.9219]
    },
    {
     "length": 112,
     "align1": 0,
     "align2": 0,
     "timings": [21.3281, 123.984, 19.4531, 18.75, 15.0781, 18.75]
    },
    {
     "length": 112,
     "align1": 7,
     "align2": 0,
     "timings": [23.125, 122.969, 22.5781, 22.7344, 18.9062, 20.625]
    },
    {
     "length": 112,
     "align1": 0,
     "align2": 7,
     "timings": [22.6562, 122.578, 22.8906, 22.0312, 18.5938, 21.9531]
    },
    {
     "length": 112,
     "align1": 7,
     "align2": 7,
     "timings": [23.8281, 123.125, 22.7344, 22.8906, 23.6719, 21.5625]
    },
    {
     "length": 144,
     "align1": 0,
     "align2": 0,
     "timings": [19.8438, 188.281, 18.8281, 18.4375, 19.2969, 16.7969]
    },
    {
     "length": 144,
     "align1": 9,
     "align2": 0,
     "timings": [23.3594, 188.047, 22.4219, 22.7344, 36.3281, 21.3281]
    },
    {
     "length": 144,
     "align1": 0,
     "align2": 9,
     "timings": [28.2031, 195.156, 28.75, 27.5, 20.9375, 26.875]
    },
    {
     "length": 144,
     "align1": 9,
     "align2": 9,
     "timings": [27.2656, 188.047, 26.0938, 25.4688, 36.9531, 25]
    },
    {
     "length": 160,
     "align1": 0,
     "align2": 0,
     "timings": [21.4844, 182.031, 19.9219, 19.4531, 36.4844, 19.7656]
    },
    {
     "length": 160,
     "align1": 10,
     "align2": 0,
     "timings": [28.0469, 181.641, 27.5781, 26.4844, 36.0938, 26.5625]
    },
    {
     "length": 160,
     "align1": 0,
     "align2": 10,
     "timings": [27.7344, 184.688, 28.0469, 27.5781, 36.4062, 26.9531]
    },
    {
     "length": 160,
     "align1": 10,
     "align2": 10,
     "timings": [27.6562, 181.797, 26.6406, 26.5625, 36.875, 25.3906]
    },
    {
     "length": 176,
     "align1": 0,
     "align2": 0,
     "timings": [21.5625, 197.656, 20.1562, 20.0781, 36.0938, 18.6719]
    },
    {
     "length": 176,
     "align1": 11,
     "align2": 0,
     "timings": [27.6562, 197.5, 27.4219, 27.6562, 36.3281, 26.0156]
    },
    {
     "length": 176,
     "align1": 0,
     "align2": 11,
     "timings": [27.5781, 198.281, 28.2812, 28.0469, 36.0156, 26.4062]
    },
    {
     "length": 176,
     "align1": 11,
     "align2": 11,
     "timings": [26.9531, 195.938, 27.0312, 26.875, 36.875, 25.0781]
    },
    {
     "length": 192,
     "align1": 0,
     "align2": 0,
     "timings": [22.3438, 212.5, 20, 20.1562, 35, 18.2812]
    },
    {
     "length": 192,
     "align1": 12,
     "align2": 0,
     "timings": [28.2031, 212.578, 27.8125, 26.875, 36.0156, 26.4062]
    },
    {
     "length": 192,
     "align1": 0,
     "align2": 12,
     "timings": [27.8906, 213.672, 27.1094, 27.0312, 34.9219, 25.9375]
    },
    {
     "length": 192,
     "align1": 12,
     "align2": 12,
     "timings": [26.5625, 212.891, 26.3281, 25.7031, 35.8594, 24.375]
    },
    {
     "length": 208,
     "align1": 0,
     "align2": 0,
     "timings": [21.7969, 229.375, 21.875, 19.7656, 36.0938, 18.75]
    },
    {
     "length": 208,
     "align1": 13,
     "align2": 0,
     "timings": [28.0469, 229.531, 27.9688, 26.7188, 30.4688, 25.9375]
    },
    {
     "length": 208,
     "align1": 0,
     "align2": 13,
     "timings": [33.4375, 230.078, 32.4219, 31.7969, 36.1719, 37.7344]
    },
    {
     "length": 208,
     "align1": 13,
     "align2": 13,
     "timings": [28.8281, 229.766, 30.1562, 28.4375, 27.8906, 33.8281]
    },
    {
     "length": 224,
     "align1": 0,
     "align2": 0,
     "timings": [23.9062, 245.391, 24.5312, 22.7344, 22.8125, 30.5469]
    },
    {
     "length": 224,
     "align1": 14,
     "align2": 0,
     "timings": [32.2656, 245.469, 31.7188, 31.875, 29.4531, 36.3281]
    },
    {
     "length": 224,
     "align1": 0,
     "align2": 14,
     "timings": [31.7969, 246.484, 32.5, 31.5625, 29.2188, 36.3281]
    },
    {
     "length": 224,
     "align1": 14,
     "align2": 14,
     "timings": [28.4375, 245.391, 28.9062, 27.0312, 27.0312, 33.8281]
    },
    {
     "length": 240,
     "align1": 0,
     "align2": 0,
     "timings": [25.3906, 260.859, 24.9219, 22.9688, 23.3594, 29.375]
    },
    {
     "length": 240,
     "align1": 15,
     "align2": 0,
     "timings": [32.2656, 260.078, 31.7969, 31.6406, 28.6719, 35.5469]
    },
    {
     "length": 240,
     "align1": 0,
     "align2": 15,
     "timings": [31.875, 259.609, 31.5625, 31.7188, 28.6719, 35.7812]
    },
    {
     "length": 240,
     "align1": 15,
     "align2": 15,
     "timings": [28.75, 259.609, 28.3594, 27.3438, 26.7188, 34.8438]
    },
    {
     "length": 272,
     "align1": 0,
     "align2": 0,
     "timings": [23.8281, 292.891, 24.7656, 22.6562, 21.7969, 31.7188]
    },
    {
     "length": 272,
     "align1": 17,
     "align2": 0,
     "timings": [34.6094, 293.594, 31.1719, 30.4688, 36.0938, 35.2344]
    },
    {
     "length": 272,
     "align1": 0,
     "align2": 17,
     "timings": [38.3594, 293.672, 38.3594, 37.1875, 28.75, 38.4375]
    },
    {
     "length": 272,
     "align1": 17,
     "align2": 17,
     "timings": [31.7188, 293.438, 30.8594, 30.4688, 30.7812, 30.2344]
    },
    {
     "length": 288,
     "align1": 0,
     "align2": 0,
     "timings": [26.9531, 309.219, 29.7656, 25.3906, 26.3281, 23.5938]
    },
    {
     "length": 288,
     "align1": 18,
     "align2": 0,
     "timings": [35.7031, 308.75, 35.9375, 34.8438, 34.2969, 34.1406]
    },
    {
     "length": 288,
     "align1": 0,
     "align2": 18,
     "timings": [37.2656, 308.75, 38.3594, 37.2656, 33.2031, 36.5625]
    },
    {
     "length": 288,
     "align1": 18,
     "align2": 18,
     "timings": [31.6406, 308.047, 31.4844, 31.1719, 30.0781, 30.7812]
    },
    {
     "length": 304,
     "align1": 0,
     "align2": 0,
     "timings": [26.25, 324.062, 25.4688, 24.6875, 25, 23.4375]
    },
    {
     "length": 304,
     "align1": 19,
     "align2": 0,
     "timings": [35.4688, 324.453, 35.3906, 35.1562, 34.6094, 34.2969]
    },
    {
     "length": 304,
     "align1": 0,
     "align2": 19,
     "timings": [37.3438, 324.219, 37.5781, 37.3438, 34.2188, 35.9375]
    },
    {
     "length": 304,
     "align1": 19,
     "align2": 19,
     "timings": [31.5625, 324.375, 30.7031, 30.9375, 29.6875, 30.2344]
    },
    {
     "length": 320,
     "align1": 0,
     "align2": 0,
     "timings": [26.9531, 340.156, 25.2344, 24.375, 26.4062, 23.5156]
    },
    {
     "length": 320,
     "align1": 20,
     "align2": 0,
     "timings": [37.5, 340, 36.5625, 36.4844, 33.8281, 35.7812]
    },
    {
     "length": 320,
     "align1": 0,
     "align2": 20,
     "timings": [36.1719, 340.156, 36.4062, 36.4062, 33.2812, 35.3906]
    },
    {
     "length": 320,
     "align1": 20,
     "align2": 20,
     "timings": [30.9375, 340.156, 30.9375, 29.6875, 29.7656, 30.0781]
    },
    {
     "length": 336,
     "align1": 0,
     "align2": 0,
     "timings": [26.1719, 357.188, 25.3906, 24.375, 25.7031, 23.4375]
    },
    {
     "length": 336,
     "align1": 21,
     "align2": 0,
     "timings": [36.875, 355.703, 36.1719, 36.0156, 39.9219, 35.4688]
    },
    {
     "length": 336,
     "align1": 0,
     "align2": 21,
     "timings": [43.5156, 356.719, 42.6562, 41.4062, 34.0625, 42.9688]
    },
    {
     "length": 336,
     "align1": 21,
     "align2": 21,
     "timings": [33.0469, 357.734, 33.9062, 32.5781, 32.8125, 32.5781]
    },
    {
     "length": 352,
     "align1": 0,
     "align2": 0,
     "timings": [27.8906, 371.641, 27.1875, 26.9531, 28.5938, 26.7188]
    },
    {
     "length": 352,
     "align1": 22,
     "align2": 0,
     "timings": [41.25, 371.797, 40.625, 40.4688, 38.6719, 39.7656]
    },
    {
     "length": 352,
     "align1": 0,
     "align2": 22,
     "timings": [41.6406, 371.328, 41.6406, 41.1719, 38.0469, 41.9531]
    },
    {
     "length": 352,
     "align1": 22,
     "align2": 22,
     "timings": [33.2031, 371.328, 33.5938, 33.6719, 31.7188, 32.4219]
    },
    {
     "length": 368,
     "align1": 0,
     "align2": 0,
     "timings": [30.0781, 387.891, 27.3438, 26.6406, 27.2656, 26.7188]
    },
    {
     "length": 368,
     "align1": 23,
     "align2": 0,
     "timings": [40.8594, 388.047, 40.3125, 40.4688, 38.2812, 39.9219]
    },
    {
     "length": 368,
     "align1": 0,
     "align2": 23,
     "timings": [42.1875, 388.125, 41.7188, 41.3281, 38.0469, 41.4844]
    },
    {
     "length": 368,
     "align1": 23,
     "align2": 23,
     "timings": [32.9688, 388.281, 34.1406, 32.6562, 31.9531, 31.9531]
    },
    {
     "length": 384,
     "align1": 0,
     "align2": 0,
     "timings": [28.5938, 405.469, 27.1875, 26.7969, 27.7344, 26.25]
    },
    {
     "length": 384,
     "align1": 24,
     "align2": 0,
     "timings": [31.5625, 404.453, 31.0156, 31.7969, 29.9219, 29.9219]
    },
    {
     "length": 384,
     "align1": 0,
     "align2": 24,
     "timings": [31.6406, 404.609, 30.1562, 30.1562, 29.8438, 30.1562]
    },
    {
     "length": 384,
     "align1": 24,
     "align2": 24,
     "timings": [29.6094, 404.453, 29.9219, 30.5469, 29.5312, 28.5156]
    },
    {
     "length": 400,
     "align1": 0,
     "align2": 0,
     "timings": [28.5156, 419.531, 27.5, 27.5781, 28.2031, 26.4844]
    },
    {
     "length": 400,
     "align1": 25,
     "align2": 0,
     "timings": [41.6406, 420.469, 41.9531, 40.7031, 45.3125, 39.9219]
    },
    {
     "length": 400,
     "align1": 0,
     "align2": 25,
     "timings": [48.125, 420.391, 47.3438, 46.7969, 38.6719, 46.6406]
    },
    {
     "length": 400,
     "align1": 25,
     "align2": 25,
     "timings": [36.7188, 421.094, 36.1719, 36.1719, 36.4062, 36.0156]
    },
    {
     "length": 416,
     "align1": 0,
     "align2": 0,
     "timings": [29.8438, 436.172, 30.7812, 28.9844, 31.7969, 29.6094]
    },
    {
     "length": 416,
     "align1": 26,
     "align2": 0,
     "timings": [46.25, 436.406, 46.4844, 45.3125, 43.5938, 45]
    },
    {
     "length": 416,
     "align1": 0,
     "align2": 26,
     "timings": [46.3281, 436.25, 46.4062, 46.7188, 42.9688, 45.7812]
    },
    {
     "length": 416,
     "align1": 26,
     "align2": 26,
     "timings": [37.5, 436.094, 36.9531, 36.0938, 36.4844, 36.0156]
    },
    {
     "length": 432,
     "align1": 0,
     "align2": 0,
     "timings": [29.1406, 453.203, 29.5312, 29.6094, 32.0312, 28.8281]
    },
    {
     "length": 432,
     "align1": 27,
     "align2": 0,
     "timings": [45.7031, 451.953, 45.625, 45.0781, 44.0625, 45.1562]
    },
    {
     "length": 432,
     "align1": 0,
     "align2": 27,
     "timings": [46.5625, 453.203, 46.875, 46.5625, 42.9688, 45.9375]
    },
    {
     "length": 432,
     "align1": 27,
     "align2": 27,
     "timings": [37.1094, 452.969, 37.8906, 36.5625, 35.9375, 35.8594]
    },
    {
     "length": 448,
     "align1": 0,
     "align2": 0,
     "timings": [28.5938, 469.062, 29.6875, 28.5156, 31.7188, 28.125]
    },
    {
     "length": 448,
     "align1": 28,
     "align2": 0,
     "timings": [45.9375, 469.219, 45.3125, 45.3125, 42.1875, 45.2344]
    },
    {
     "length": 448,
     "align1": 0,
     "align2": 28,
     "timings": [46.6406, 468.438, 45.625, 45.1562, 41.7969, 45.1562]
    },
    {
     "length": 448,
     "align1": 28,
     "align2": 28,
     "timings": [35.4688, 469.141, 36.5625, 34.5312, 35.5469, 35.3125]
    },
    {
     "length": 464,
     "align1": 0,
     "align2": 0,
     "timings": [30.8594, 484.375, 29.5312, 29.2969, 32.7344, 29.1406]
    },
    {
     "length": 464,
     "align1": 29,
     "align2": 0,
     "timings": [46.5625, 484.141, 45.7812, 45.0781, 49.2969, 45.7031]
    },
    {
     "length": 464,
     "align1": 0,
     "align2": 29,
     "timings": [49.6875, 484.453, 50.7031, 48.9844, 42.8906, 49.4531]
    },
    {
     "length": 464,
     "align1": 29,
     "align2": 29,
     "timings": [38.8281, 484.141, 38.5938, 38.6719, 39.6875, 37.8125]
    },
    {
     "length": 480,
     "align1": 0,
     "align2": 0,
     "timings": [33.125, 500.156, 33.4375, 32.1875, 33.75, 31.0938]
    },
    {
     "length": 480,
     "align1": 30,
     "align2": 0,
     "timings": [50.2344, 500, 50.3125, 49.2188, 48.75, 49.4531]
    },
    {
     "length": 480,
     "align1": 0,
     "align2": 30,
     "timings": [49.5312, 500.156, 49.8438, 49.2969, 47.3438, 51.9531]
    },
    {
     "length": 480,
     "align1": 30,
     "align2": 30,
     "timings": [39.2188, 499.922, 40.3125, 37.8906, 38.75, 38.6719]
    },
    {
     "length": 496,
     "align1": 0,
     "align2": 0,
     "timings": [33.4375, 517.422, 33.3594, 32.8125, 33.6719, 30.1562]
    },
    {
     "length": 496,
     "align1": 31,
     "align2": 0,
     "timings": [50.7031, 517.578, 49.9219, 49.7656, 47.5, 49.0625]
    },
    {
     "length": 496,
     "align1": 0,
     "align2": 31,
     "timings": [50.9375, 517.5, 49.6094, 49.5312, 46.9531, 48.3594]
    },
    {
     "length": 496,
     "align1": 31,
     "align2": 31,
     "timings": [41.25, 517.5, 40.1562, 38.4375, 38.5938, 38.0469]
    },
    {
     "length": 1024,
     "align1": 0,
     "align2": 0,
     "timings": [52.1094, 1043.12, 52.5, 50.8594, 60.0781, 51.6406]
    },
    {
     "length": 1024,
     "align1": 32,
     "align2": 0,
     "timings": [53.6719, 1042.5, 51.5625, 51.3281, 59.375, 50.5469]
    },
    {
     "length": 1024,
     "align1": 0,
     "align2": 32,
     "timings": [50, 1043.67, 51.25, 49.5312, 58.2031, 49.7656]
    },
    {
     "length": 1024,
     "align1": 32,
     "align2": 32,
     "timings": [52.6562, 1042.73, 51.0938, 51.9531, 58.4375, 50.1562]
    },
    {
     "length": 1056,
     "align1": 0,
     "align2": 0,
     "timings": [55.3125, 1075.47, 53.9062, 52.7344, 60.7031, 55.0781]
    },
    {
     "length": 1056,
     "align1": 33,
     "align2": 0,
     "timings": [87.1875, 1075.78, 86.9531, 87.4219, 88.0469, 86.7969]
    },
    {
     "length": 1056,
     "align1": 0,
     "align2": 33,
     "timings": [91.7969, 1075.47, 92.3438, 92.5, 88.0469, 92.9688]
    },
    {
     "length": 1056,
     "align1": 33,
     "align2": 33,
     "timings": [61.1719, 1075.78, 61.1719, 63.75, 64.375, 63.5938]
    },
    {
     "length": 1088,
     "align1": 0,
     "align2": 0,
     "timings": [55.2344, 1106.72, 52.9688, 51.0938, 63.2812, 52.2656]
    },
    {
     "length": 1088,
     "align1": 34,
     "align2": 0,
     "timings": [86.7969, 1106.41, 87.3438, 87.5781, 89.1406, 86.7188]
    },
    {
     "length": 1088,
     "align1": 0,
     "align2": 34,
     "timings": [92.7344, 1106.56, 92.1094, 91.7188, 87.5, 91.875]
    },
    {
     "length": 1088,
     "align1": 34,
     "align2": 34,
     "timings": [62.8125, 1106.48, 59.5312, 62.5781, 64.375, 61.4062]
    },
    {
     "length": 1120,
     "align1": 0,
     "align2": 0,
     "timings": [57.7344, 1139.14, 56.4844, 56.7969, 65.8594, 55.2344]
    },
    {
     "length": 1120,
     "align1": 35,
     "align2": 0,
     "timings": [91.1719, 1139.22, 91.3281, 90.8594, 92.8906, 91.4844]
    },
    {
     "length": 1120,
     "align1": 0,
     "align2": 35,
     "timings": [97.5781, 1139.14, 96.4062, 96.3281, 91.875, 95.625]
    },
    {
     "length": 1120,
     "align1": 35,
     "align2": 35,
     "timings": [65.8594, 1259.14, 68.2812, 66.0156, 68.5938, 64.4531]
    },
    {
     "length": 1152,
     "align1": 0,
     "align2": 0,
     "timings": [58.4375, 1170.39, 55.7031, 55, 65.2344, 55.3906]
    },
    {
     "length": 1152,
     "align1": 36,
     "align2": 0,
     "timings": [96.4062, 1170.55, 95.5469, 95.4688, 89.8438, 94.7656]
    },
    {
     "length": 1152,
     "align1": 0,
     "align2": 36,
     "timings": [96.4844, 1170.31, 96.6406, 95.5469, 89.8438, 95.625]
    },
    {
     "length": 1152,
     "align1": 36,
     "align2": 36,
     "timings": [66.3281, 1170.39, 63.75, 64.2969, 68.5938, 65.8594]
    },
    {
     "length": 1184,
     "align1": 0,
     "align2": 0,
     "timings": [58.6719, 1203.2, 58.4375, 58.2812, 68.2812, 57.7344]
    },
    {
     "length": 1184,
     "align1": 37,
     "align2": 0,
     "timings": [101.172, 1203.2, 101.25, 101.016, 96.9531, 100.703]
    },
    {
     "length": 1184,
     "align1": 0,
     "align2": 37,
     "timings": [101.25, 1203.2, 102.578, 100.938, 96.5625, 100.469]
    },
    {
     "length": 1184,
     "align1": 37,
     "align2": 37,
     "timings": [66.25, 1203.2, 64.7656, 65, 71.6406, 64.8438]
    },
    {
     "length": 1216,
     "align1": 0,
     "align2": 0,
     "timings": [59.9219, 1235.16, 57.8906, 58.2031, 68.9062, 58.125]
    },
    {
     "length": 1216,
     "align1": 38,
     "align2": 0,
     "timings": [100.234, 1235.16, 100.938, 98.5938, 97.6562, 99.8438]
    },
    {
     "length": 1216,
     "align1": 0,
     "align2": 38,
     "timings": [101.406, 1235.23, 102.031, 101.484, 96.0156, 101.406]
    },
    {
     "length": 1216,
     "align1": 38,
     "align2": 38,
     "timings": [68.5938, 1235.16, 66.4062, 67.8906, 71.3281, 68.75]
    },
    {
     "length": 1248,
     "align1": 0,
     "align2": 0,
     "timings": [62.6562, 1266.25, 61.7969, 60.2344, 73.125, 60.0781]
    },
    {
     "length": 1248,
     "align1": 39,
     "align2": 0,
     "timings": [105.156, 1266.41, 104.141, 105.234, 103.203, 103.594]
    },
    {
     "length": 1248,
     "align1": 0,
     "align2": 39,
     "timings": [106.406, 1266.33, 105.469, 105.547, 100.781, 105.781]
    },
    {
     "length": 1248,
     "align1": 39,
     "align2": 39,
     "timings": [69.5312, 1266.88, 70.4688, 72.1094, 73.3594, 67.5781]
    },
    {
     "length": 1280,
     "align1": 0,
     "align2": 0,
     "timings": [61.9531, 1299.14, 61.875, 59.6094, 71.0156, 59.2969]
    },
    {
     "length": 1280,
     "align1": 40,
     "align2": 0,
     "timings": [75.625, 1299.22, 75.8594, 75.0781, 74.0625, 76.1719]
    },
    {
     "length": 1280,
     "align1": 0,
     "align2": 40,
     "timings": [75.7812, 1299.22, 78.9844, 72.1094, 73.75, 78.5156]
    },
    {
     "length": 1280,
     "align1": 40,
     "align2": 40,
     "timings": [63.0469, 1298.98, 61.7969, 60.8594, 70.0781, 61.0156]
    },
    {
     "length": 1312,
     "align1": 0,
     "align2": 0,
     "timings": [65, 1329.92, 64.9219, 63.2031, 75.625, 62.2656]
    },
    {
     "length": 1312,
     "align1": 41,
     "align2": 0,
     "timings": [109.531, 1330.31, 109.297, 108.672, 106.797, 108.75]
    },
    {
     "length": 1312,
     "align1": 0,
     "align2": 41,
     "timings": [110.391, 1330.23, 110.469, 109.922, 106.406, 110.938]
    },
    {
     "length": 1312,
     "align1": 41,
     "align2": 41,
     "timings": [71.5625, 1330.16, 69.6875, 72.6562, 77.8906, 70.7812]
    },
    {
     "length": 1344,
     "align1": 0,
     "align2": 0,
     "timings": [64.375, 1362.97, 60.9375, 62.7344, 75.3125, 62.1094]
    },
    {
     "length": 1344,
     "align1": 42,
     "align2": 0,
     "timings": [110.391, 1362.89, 109.062, 109.922, 106.484, 108.984]
    },
    {
     "length": 1344,
     "align1": 0,
     "align2": 42,
     "timings": [110.781, 1363.44, 109.141, 111.25, 105.859, 109.688]
    },
    {
     "length": 1344,
     "align1": 42,
     "align2": 42,
     "timings": [70.5469, 1362.81, 68.3594, 73.0469, 76.7188, 69.5312]
    },
    {
     "length": 1376,
     "align1": 0,
     "align2": 0,
     "timings": [67.0312, 1394.06, 67.1875, 64.2969, 78.9062, 65.9375]
    },
    {
     "length": 1376,
     "align1": 43,
     "align2": 0,
     "timings": [114.922, 1393.75, 113.125, 113.359, 111.875, 112.812]
    },
    {
     "length": 1376,
     "align1": 0,
     "align2": 43,
     "timings": [116.172, 1394.06, 114.688, 114.766, 110, 114.609]
    },
    {
     "length": 1376,
     "align1": 43,
     "align2": 43,
     "timings": [74.4531, 1394.45, 74.2188, 73.75, 79.375, 72.1094]
    },
    {
     "length": 1408,
     "align1": 0,
     "align2": 0,
     "timings": [66.3281, 1427.27, 67.1875, 64.1406, 77.0312, 64.2188]
    },
    {
     "length": 1408,
     "align1": 44,
     "align2": 0,
     "timings": [114.453, 1426.8, 112.578, 114.453, 106.719, 113.047]
    },
    {
     "length": 1408,
     "align1": 0,
     "align2": 44,
     "timings": [115.234, 1426.95, 113.594, 113.203, 106.953, 113.203]
    },
    {
     "length": 1408,
     "align1": 44,
     "align2": 44,
     "timings": [71.25, 1426.8, 73.2812, 76.0156, 81.7188, 73.5938]
    },
    {
     "length": 1440,
     "align1": 0,
     "align2": 0,
     "timings": [71.0156, 1458.67, 69.2188, 67.3438, 80.8594, 68.2812]
    },
    {
     "length": 1440,
     "align1": 45,
     "align2": 0,
     "timings": [118.828, 1459.77, 118.281, 119.609, 115.547, 118.438]
    },
    {
     "length": 1440,
     "align1": 0,
     "align2": 45,
     "timings": [115.234, 1458.83, 113.672, 114.062, 114.297, 114.609]
    },
    {
     "length": 1440,
     "align1": 45,
     "align2": 45,
     "timings": [76.875, 1458.75, 75.5469, 77.5781, 83.5938, 75.2344]
    },
    {
     "length": 1472,
     "align1": 0,
     "align2": 0,
     "timings": [69.2969, 1489.53, 68.3594, 67.5, 81.875, 64.9219]
    },
    {
     "length": 1472,
     "align1": 46,
     "align2": 0,
     "timings": [119.531, 1489.61, 118.359, 118.359, 115.469, 116.875]
    },
    {
     "length": 1472,
     "align1": 0,
     "align2": 46,
     "timings": [114.922, 1489.61, 114.453, 114.453, 114.219, 115.781]
    },
    {
     "length": 1472,
     "align1": 46,
     "align2": 46,
     "timings": [77.1875, 1489.06, 78.2812, 77.1094, 84.9219, 75.4688]
    },
    {
     "length": 1504,
     "align1": 0,
     "align2": 0,
     "timings": [73.125, 1523.12, 70.7031, 70.1562, 83.9844, 72.3438]
    },
    {
     "length": 1504,
     "align1": 47,
     "align2": 0,
     "timings": [123.438, 1522.5, 123.672, 122.5, 119.531, 122.109]
    },
    {
     "length": 1504,
     "align1": 0,
     "align2": 47,
     "timings": [119.062, 1522.42, 119.297, 118.281, 119.531, 117.109]
    },
    {
     "length": 1504,
     "align1": 47,
     "align2": 47,
     "timings": [78.75, 1522.58, 79.5312, 77.4219, 86.7188, 77.8906]
    },
    {
     "length": 1536,
     "align1": 0,
     "align2": 0,
     "timings": [71.7188, 1553.67, 71.1719, 69.6875, 84.2188, 70]
    },
    {
     "length": 1536,
     "align1": 48,
     "align2": 0,
     "timings": [71.7969, 1553.52, 68.75, 70.1562, 84.2188, 66.875]
    },
    {
     "length": 1536,
     "align1": 0,
     "align2": 48,
     "timings": [71.4844, 1645.47, 71.875, 69.5312, 82.8125, 69.8438]
    },
    {
     "length": 1536,
     "align1": 48,
     "align2": 48,
     "timings": [72.0312, 1553.67, 71.0156, 70, 83.2031, 68.9844]
    },
    {
     "length": 1568,
     "align1": 0,
     "align2": 0,
     "timings": [74.375, 1586.25, 73.4375, 73.5156, 86.9531, 72.3438]
    },
    {
     "length": 1568,
     "align1": 49,
     "align2": 0,
     "timings": [121.562, 1586.33, 121.953, 121.016, 125, 120.938]
    },
    {
     "length": 1568,
     "align1": 0,
     "align2": 49,
     "timings": [129.062, 1586.72, 130.312, 129.844, 124.375, 128.828]
    },
    {
     "length": 1568,
     "align1": 49,
     "align2": 49,
     "timings": [83.0469, 1585.39, 80.3125, 80.7031, 88.3594, 81.1719]
    },
    {
     "length": 1600,
     "align1": 0,
     "align2": 0,
     "timings": [72.2656, 1617.27, 72.7344, 72.4219, 88.2812, 71.25]
    },
    {
     "length": 1600,
     "align1": 50,
     "align2": 0,
     "timings": [121.797, 1617.27, 121.641, 121.797, 124.453, 120.703]
    },
    {
     "length": 1600,
     "align1": 0,
     "align2": 50,
     "timings": [129.453, 1617.5, 128.438, 127.578, 123.359, 128.203]
    },
    {
     "length": 1600,
     "align1": 50,
     "align2": 50,
     "timings": [79.8438, 1617.5, 79.7656, 80, 91.7188, 78.75]
    },
    {
     "length": 1632,
     "align1": 0,
     "align2": 0,
     "timings": [77.5, 1650.08, 76.6406, 73.125, 90.7812, 73.8281]
    },
    {
     "length": 1632,
     "align1": 51,
     "align2": 0,
     "timings": [124.766, 1650.08, 126.875, 124.844, 129.453, 124.531]
    },
    {
     "length": 1632,
     "align1": 0,
     "align2": 51,
     "timings": [132.656, 1650.31, 133.984, 133.047, 127.344, 132.109]
    },
    {
     "length": 1632,
     "align1": 51,
     "align2": 51,
     "timings": [84.2188, 1650.08, 83.8281, 82.3438, 91.7188, 81.9531]
    },
    {
     "length": 1664,
     "align1": 0,
     "align2": 0,
     "timings": [76.0156, 1681.95, 75.625, 73.4375, 89.2188, 76.3281]
    },
    {
     "length": 1664,
     "align1": 52,
     "align2": 0,
     "timings": [133.047, 1682.5, 132.969, 132.656, 125.312, 131.484]
    },
    {
     "length": 1664,
     "align1": 0,
     "align2": 52,
     "timings": [132.422, 1682.11, 132.109, 130.703, 123.984, 131.953]
    },
    {
     "length": 1664,
     "align1": 52,
     "align2": 52,
     "timings": [83.2031, 1682.27, 84.2188, 84.6094, 93.8281, 83.8281]
    },
    {
     "length": 1696,
     "align1": 0,
     "align2": 0,
     "timings": [79.2188, 1712.97, 78.9062, 76.4062, 93.9062, 77.4219]
    },
    {
     "length": 1696,
     "align1": 53,
     "align2": 0,
     "timings": [137.422, 1712.97, 137.109, 137.578, 134.297, 136.406]
    },
    {
     "length": 1696,
     "align1": 0,
     "align2": 53,
     "timings": [138.672, 1713.12, 140, 139.609, 131.875, 138.828]
    },
    {
     "length": 1696,
     "align1": 53,
     "align2": 53,
     "timings": [85.0781, 1713.12, 84.2969, 84.0625, 95.8594, 85.7031]
    },
    {
     "length": 1728,
     "align1": 0,
     "align2": 0,
     "timings": [77.9688, 1746.02, 78.125, 75.9375, 95.1562, 74.9219]
    },
    {
     "length": 1728,
     "align1": 54,
     "align2": 0,
     "timings": [138.672, 1745.86, 137.109, 136.797, 133.984, 136.797]
    },
    {
     "length": 1728,
     "align1": 0,
     "align2": 54,
     "timings": [138.984, 1746.09, 138.516, 137.969, 131.562, 137.891]
    },
    {
     "length": 1728,
     "align1": 54,
     "align2": 54,
     "timings": [86.0938, 1745.86, 85.2344, 87.0312, 97.1094, 84.6875]
    },
    {
     "length": 1760,
     "align1": 0,
     "align2": 0,
     "timings": [81.25, 1776.88, 81.0938, 80.3125, 97.3438, 92.0312]
    },
    {
     "length": 1760,
     "align1": 55,
     "align2": 0,
     "timings": [140.547, 1777.03, 142.422, 142.266, 137.812, 147.109]
    },
    {
     "length": 1760,
     "align1": 0,
     "align2": 55,
     "timings": [143.828, 1776.95, 143.125, 141.719, 136.328, 147.812]
    },
    {
     "length": 1760,
     "align1": 55,
     "align2": 55,
     "timings": [87.9688, 1776.88, 87.8906, 88.3594, 97.5781, 98.9062]
    },
    {
     "length": 1792,
     "align1": 0,
     "align2": 0,
     "timings": [80.3125, 1809.92, 81.0156, 79.6094, 97.2656, 93.0469]
    },
    {
     "length": 1792,
     "align1": 56,
     "align2": 0,
     "timings": [104.844, 1809.84, 104.297, 99.2188, 99.7656, 112.188]
    },
    {
     "length": 1792,
     "align1": 0,
     "align2": 56,
     "timings": [103.516, 1809.69, 104.453, 100.156, 99.6094, 111.094]
    },
    {
     "length": 1792,
     "align1": 56,
     "align2": 56,
     "timings": [82.1094, 1809.45, 83.5156, 82.1875, 97.1875, 95.1562]
    },
    {
     "length": 1824,
     "align1": 0,
     "align2": 0,
     "timings": [82.8906, 1841.02, 82.0312, 81.7188, 100.391, 80.625]
    },
    {
     "length": 1824,
     "align1": 57,
     "align2": 0,
     "timings": [145.312, 1840.7, 146.172, 145.781, 142.031, 145.703]
    },
    {
     "length": 1824,
     "align1": 0,
     "align2": 57,
     "timings": [147.578, 1840.94, 148.672, 146.328, 141.875, 147.266]
    },
    {
     "length": 1824,
     "align1": 57,
     "align2": 57,
     "timings": [90.4688, 1840.78, 89.9219, 90.8594, 101.641, 89.8438]
    },
    {
     "length": 1856,
     "align1": 0,
     "align2": 0,
     "timings": [82.8125, 1873.59, 83.6719, 82.5, 101.25, 78.8281]
    },
    {
     "length": 1856,
     "align1": 58,
     "align2": 0,
     "timings": [146.719, 1873.98, 146.719, 145.547, 142.5, 145]
    },
    {
     "length": 1856,
     "align1": 0,
     "align2": 58,
     "timings": [147.266, 1873.75, 148.125, 148.281, 141.484, 147.734]
    },
    {
     "length": 1856,
     "align1": 58,
     "align2": 58,
     "timings": [90.2344, 1873.44, 91.5625, 90.8594, 104.219, 88.0469]
    },
    {
     "length": 1888,
     "align1": 0,
     "align2": 0,
     "timings": [86.4844, 1905.31, 85.3906, 83.0469, 104.062, 83.2812]
    },
    {
     "length": 1888,
     "align1": 59,
     "align2": 0,
     "timings": [151.562, 1904.45, 151.25, 151.094, 147.344, 151.016]
    },
    {
     "length": 1888,
     "align1": 0,
     "align2": 59,
     "timings": [151.016, 1905.47, 150.547, 257.656, 147.969, 151.172]
    },
    {
     "length": 1888,
     "align1": 59,
     "align2": 59,
     "timings": [93.0469, 1905.62, 91.0156, 92.1094, 105.234, 89.2969]
    },
    {
     "length": 1920,
     "align1": 0,
     "align2": 0,
     "timings": [85.3125, 1936.64, 84.375, 82.0312, 101.25, 83.5938]
    },
    {
     "length": 1920,
     "align1": 60,
     "align2": 0,
     "timings": [151.406, 1936.56, 149.688, 150.312, 141.172, 150.781]
    },
    {
     "length": 1920,
     "align1": 0,
     "align2": 60,
     "timings": [151.172, 1936.56, 149.453, 150.078, 141.016, 151.406]
    },
    {
     "length": 1920,
     "align1": 60,
     "align2": 60,
     "timings": [92.1875, 1936.56, 93.2031, 94.1406, 104.453, 91.3281]
    },
    {
     "length": 1952,
     "align1": 0,
     "align2": 0,
     "timings": [88.125, 1969.53, 87.3438, 85.4688, 103.281, 85.3125]
    },
    {
     "length": 1952,
     "align1": 61,
     "align2": 0,
     "timings": [156.953, 1969.45, 155.391, 155.078, 152.188, 155.938]
    },
    {
     "length": 1952,
     "align1": 0,
     "align2": 61,
     "timings": [150.312, 1969.61, 150.703, 149.766, 151.328, 148.516]
    },
    {
     "length": 1952,
     "align1": 61,
     "align2": 61,
     "timings": [94.2969, 1969.45, 91.5625, 94.6875, 108.203, 95]
    },
    {
     "length": 1984,
     "align1": 0,
     "align2": 0,
     "timings": [87.8906, 2000.47, 86.9531, 84.9219, 107.578, 84.0625]
    },
    {
     "length": 1984,
     "align1": 62,
     "align2": 0,
     "timings": [156.016, 2000.31, 155.078, 155.391, 150.781, 155.078]
    },
    {
     "length": 1984,
     "align1": 0,
     "align2": 62,
     "timings": [149.609, 2000.47, 150.156, 149.688, 149.609, 148.047]
    },
    {
     "length": 1984,
     "align1": 62,
     "align2": 62,
     "timings": [97.1875, 2000.47, 95.9375, 97.2656, 109.062, 93.75]
    },
    {
     "length": 2016,
     "align1": 0,
     "align2": 0,
     "timings": [91.4062, 2033.28, 89.0625, 91.0156, 112.109, 88.6719]
    },
    {
     "length": 2016,
     "align1": 63,
     "align2": 0,
     "timings": [160.391, 2033.2, 160.156, 159.766, 156.016, 159.922]
    },
    {
     "length": 2016,
     "align1": 0,
     "align2": 63,
     "timings": [153.828, 2033.59, 153.672, 152.812, 155.547, 153.125]
    },
    {
     "length": 2016,
     "align1": 63,
     "align2": 63,
     "timings": [97.6562, 2033.36, 99.7656, 98.9062, 112.031, 95.9375]
    },
    {
     "length": 65536,
     "align1": 0,
     "align2": 0,
     "timings": [3828.59, 65411, 4022.66, 3822.11, 4202.11, 4146.88]
    }]
  }
 }
}
  

Comments

Siddhesh Poyarekar Feb. 15, 2018, 9:40 a.m. UTC | #1
On Thursday 15 February 2018 05:34 AM, Steve Ellcey wrote:
> I have attached the memcpy benchmark output files from a ThunderX2 run,
> the main differences are in bench-memcpy-large.out.

You can get a pretty report of your string benchmark results with the
compare_strings.py script:

../benchtests/scripts/compare_strings.py \
	-i benchtests/bench-memcpy.out \
	-s ../benchtests/scripts /benchout_strings.schema.json \
	-a length \
	-b __memcpy_generic

That should also make it easier to compare with various versions by
setting different baselines (-b).

Siddhesh
  
Siddhesh Poyarekar Feb. 15, 2018, 9:51 a.m. UTC | #2
On Thursday 15 February 2018 03:10 PM, Siddhesh Poyarekar wrote:
> On Thursday 15 February 2018 05:34 AM, Steve Ellcey wrote:
>> I have attached the memcpy benchmark output files from a ThunderX2 run,
>> the main differences are in bench-memcpy-large.out.
> 
> You can get a pretty report of your string benchmark results with the
> compare_strings.py script:
> 
> ../benchtests/scripts/compare_strings.py \
> 	-i benchtests/bench-memcpy.out \
> 	-s ../benchtests/scripts /benchout_strings.schema.json \
> 	-a length \

Actually, bench-memcpy has attributes len,align1,align2.  It is
bench-memcpy-walk that has only length attribute.  I forgot to mention
that the script also creates graphs if you're into that sort of thing :)

Siddhesh
  
Szabolcs Nagy Feb. 16, 2018, 6:39 p.m. UTC | #3
On 15/02/18 00:04, Steve Ellcey wrote:
> This patch adds a new memcpy ifunc for Cavium ThunderX2.  The difference
> between this and the Thunderx version is in the prefetching.  ThunderX2
> has different cache characteristics and so uses a different prefetching
> strategy.  Note that I prefetch past the end of the buffer being copied
> but my understanding is that that is legal and should never generate any
> errors.  I tried adding code to not prefetch past the end of the source
> but those changes slowed down memcpy so I did not include them.
> 
> I did not copy memcpy_thunderx.S to memcpy_thunderx2.S but just use
> memcpy_thunderx2.S to set some macros and then include memcpy_thunderx.S.
> This is to reduce duplicate code.
> 
> I have attached the memcpy benchmark output files from a ThunderX2 run,
> the main differences are in bench-memcpy-large.out.
> 
> Tested with no regressions, OK to checkin?
> 

the code looks ok, and it is ok to commit if you think this gives
benefit on thunderx2 (it should not affect other targets other
than code bloat).

i prefer not to add a new memcpy every time there is a new uarch,
so i think in the long term old ones should be removed or merged
(i'm not yet sure what's the right policy here, e.g. if a target
is not available to anyone in the community for benchmarking it
will be removed or if there is not enough performance benefit).

i don't see a huge performance difference in the benchmark logs
and there are a few weird cases e.g. in bench-memcpy.out

     {
      "length": 1888,
      "align1": 0,
      "align2": 59,
      "timings": [151.016, 1905.47, 150.547, 257.656, 147.969, 151.172]
     },

the memcpy_thunderx2 is very slow (and memcpy_falkor is the fastest).

> Steve Ellcey
> sellcey@cavium.com
> 
> 
> 2018-02-14  Steve Ellcey  <sellcey@cavium.com>
> 
> 	* sysdeps/aarch64/multiarch/Makefile (sysdep_routines):
> 	Add memcpy_thunderx2.
> 	* sysdeps/aarch64/multiarch/ifunc-impl-list.c (MAX_IFUNC):
> 	Increment to 4.
> 	(__libc_ifunc_impl_list): Add __memcpy_thunderx2.
> 	* sysdeps/aarch64/multiarch/memcpy.c (libc_ifunc): Add IS_THUNDERX2
> 	and IS_THUNDERX2PA checks.
> 	* sysdeps/aarch64/multiarch/memcpy_thunderx.S (USE_THUNDERX2):
> 	Use macro to set name appropriately.
> 	(memcpy): Use USE_THUNDERX2 macro to modify prefetches.
> 	* sysdeps/aarch64/multiarch/memcpy_thunderx2.S: New file.
> 	* sysdeps/unix/sysv/linux/aarch64/cpu-features.h (IS_THUNDERX2PA):
> 	New macro.
> 	(IS_THUNDERX2): New macro.
>
  
Steve Ellcey Feb. 20, 2018, 6:52 p.m. UTC | #4
On Fri, 2018-02-16 at 18:39 +0000, Szabolcs Nagy wrote:

> the code looks ok, and it is ok to commit if you think this gives
> benefit on thunderx2 (it should not affect other targets other
> than code bloat).
> 
> i prefer not to add a new memcpy every time there is a new uarch,
> so i think in the long term old ones should be removed or merged
> (i'm not yet sure what's the right policy here, e.g. if a target
> is not available to anyone in the community for benchmarking it
> will be removed or if there is not enough performance benefit).
> i don't see a huge performance difference in the benchmark logs
> and there are a few weird cases e.g. in bench-memcpy.out
> 
>      {
>       "length": 1888,
>       "align1": 0,
>       "align2": 59,
>       "timings": [151.016, 1905.47, 150.547, 257.656, 147.969, 151.172]
>      },
> 
> the memcpy_thunderx2 is very slow (and memcpy_falkor is the fastest).

The benefit isn't huge but I think it is large enough to be helpful on
some programs.  I reran the benchmarks again and looked at the results.
This particular anomoly seems to have gone away (though falkor is still
faster for this specific instance).  I am not sure why it showed up
before, I was on a machine with no other users but there still may have
been something running that caused this hiccup.

    {
     "length": 1888,
     "align1": 0,
     "align2": 59,
     "timings": [154.062, 1905.78, 151.641, 150.625, 146.094, 150.312]
    },

The code run for ThunderX and ThunderX2 in this instance would be the
same because the length isn't large enough to trigger the prefetch
loop anyway.

I will check this in later unless someone else raises some objections.

Steve Ellcey
sellcey@cavium.com
  

Patch

diff --git a/sysdeps/aarch64/multiarch/Makefile b/sysdeps/aarch64/multiarch/Makefile
index aa179c4..57ffdf7 100644
--- a/sysdeps/aarch64/multiarch/Makefile
+++ b/sysdeps/aarch64/multiarch/Makefile
@@ -1,4 +1,4 @@ 
 ifeq ($(subdir),string)
-sysdep_routines += memcpy_generic memcpy_thunderx memcpy_falkor \
-		   memmove_falkor memset_generic memset_falkor
+sysdep_routines += memcpy_generic memcpy_thunderx memcpy_thunderx2 \
+		   memcpy_falkor memmove_falkor memset_generic memset_falkor
 endif
diff --git a/sysdeps/aarch64/multiarch/ifunc-impl-list.c b/sysdeps/aarch64/multiarch/ifunc-impl-list.c
index f84956c..e55be80 100644
--- a/sysdeps/aarch64/multiarch/ifunc-impl-list.c
+++ b/sysdeps/aarch64/multiarch/ifunc-impl-list.c
@@ -25,7 +25,7 @@ 
 #include <stdio.h>
 
 /* Maximum number of IFUNC implementations.  */
-#define MAX_IFUNC	3
+#define MAX_IFUNC	4
 
 size_t
 __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
@@ -40,6 +40,7 @@  __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
   /* Support sysdeps/aarch64/multiarch/memcpy.c and memmove.c.  */
   IFUNC_IMPL (i, name, memcpy,
 	      IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_thunderx)
+	      IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_thunderx2)
 	      IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_falkor)
 	      IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_generic))
   IFUNC_IMPL (i, name, memmove,
diff --git a/sysdeps/aarch64/multiarch/memcpy.c b/sysdeps/aarch64/multiarch/memcpy.c
index 3efea2c..b94c655 100644
--- a/sysdeps/aarch64/multiarch/memcpy.c
+++ b/sysdeps/aarch64/multiarch/memcpy.c
@@ -30,6 +30,7 @@  extern __typeof (__redirect_memcpy) __libc_memcpy;
 
 extern __typeof (__redirect_memcpy) __memcpy_generic attribute_hidden;
 extern __typeof (__redirect_memcpy) __memcpy_thunderx attribute_hidden;
+extern __typeof (__redirect_memcpy) __memcpy_thunderx2 attribute_hidden;
 extern __typeof (__redirect_memcpy) __memcpy_falkor attribute_hidden;
 
 libc_ifunc (__libc_memcpy,
@@ -37,7 +38,9 @@  libc_ifunc (__libc_memcpy,
 	     ? __memcpy_thunderx
 	     : (IS_FALKOR (midr)
 		? __memcpy_falkor
-		: __memcpy_generic)));
+		: (IS_THUNDERX2 (midr) || IS_THUNDERX2PA (midr)
+		  ? __memcpy_thunderx2
+		  : __memcpy_generic))));
 
 # undef memcpy
 strong_alias (__libc_memcpy, memcpy);
diff --git a/sysdeps/aarch64/multiarch/memcpy_thunderx.S b/sysdeps/aarch64/multiarch/memcpy_thunderx.S
index 4f6921d..de494d9 100644
--- a/sysdeps/aarch64/multiarch/memcpy_thunderx.S
+++ b/sysdeps/aarch64/multiarch/memcpy_thunderx.S
@@ -74,11 +74,13 @@ 
 
 #if IS_IN (libc)
 
-# undef MEMCPY
-# define MEMCPY __memcpy_thunderx
-# undef MEMMOVE
-# define MEMMOVE __memmove_thunderx
-# define USE_THUNDERX
+# ifndef USE_THUNDERX2
+#  undef MEMCPY
+#  define MEMCPY __memcpy_thunderx
+#  undef MEMMOVE
+#  define MEMMOVE __memmove_thunderx
+#  define USE_THUNDERX
+# endif
 
 ENTRY_ALIGN (MEMMOVE, 6)
 
@@ -180,7 +182,7 @@  L(copy96):
 	.p2align 4
 L(copy_long):
 
-# ifdef USE_THUNDERX
+# if defined(USE_THUNDERX) || defined (USE_THUNDERX2)
 
 	/* On thunderx, large memcpy's are helped by software prefetching.
 	   This loop is identical to the one below it but with prefetching
@@ -194,7 +196,11 @@  L(copy_long):
 	bic	dst, dstin, 15
 	ldp	D_l, D_h, [src]
 	sub	src, src, tmp1
+#  if defined(USE_THUNDERX)
 	prfm	pldl1strm, [src, 384]
+#  elif defined(USE_THUNDERX2)
+	prfm	pldl1strm, [src, 256]
+#  endif
 	add	count, count, tmp1	/* Count is now 16 too large.  */
 	ldp	A_l, A_h, [src, 16]
 	stp	D_l, D_h, [dstin]
@@ -204,9 +210,13 @@  L(copy_long):
 	subs	count, count, 128 + 16	/* Test and readjust count.  */
 
 L(prefetch_loop64):
+#  if defined(USE_THUNDERX)
 	tbz	src, #6, 1f
 	prfm	pldl1strm, [src, 512]
 1:
+#  elif defined(USE_THUNDERX2)
+	prfm	pldl1strm, [src, 256]
+#  endif
 	stp	A_l, A_h, [dst, 16]
 	ldp	A_l, A_h, [src, 16]
 	stp	B_l, B_h, [dst, 32]
diff --git a/sysdeps/aarch64/multiarch/memcpy_thunderx2.S b/sysdeps/aarch64/multiarch/memcpy_thunderx2.S
index e69de29..8501abf 100644
--- a/sysdeps/aarch64/multiarch/memcpy_thunderx2.S
+++ b/sysdeps/aarch64/multiarch/memcpy_thunderx2.S
@@ -0,0 +1,27 @@ 
+/* A Thunderx2 Optimized memcpy implementation for AARCH64.
+   Copyright (C) 2018 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* The actual code in this memcpy and memmove is in memcpy_thunderx.S.
+   The only real differences are with the prefetching instructions.  */
+
+#define MEMCPY __memcpy_thunderx2
+#define MEMMOVE __memmove_thunderx2
+#define USE_THUNDERX2
+
+#include "memcpy_thunderx.S"
diff --git a/sysdeps/unix/sysv/linux/aarch64/cpu-features.h b/sysdeps/unix/sysv/linux/aarch64/cpu-features.h
index c646f9d..cde655b 100644
--- a/sysdeps/unix/sysv/linux/aarch64/cpu-features.h
+++ b/sysdeps/unix/sysv/linux/aarch64/cpu-features.h
@@ -41,6 +41,11 @@ 
 #define IS_THUNDERX(midr) (MIDR_IMPLEMENTOR(midr) == 'C'	\
 			   && MIDR_PARTNUM(midr) == 0x0a1)
 
+#define IS_THUNDERX2PA(midr) (MIDR_IMPLEMENTOR(midr) == 'B'     \
+			   && MIDR_PARTNUM(midr) == 0x516)
+#define IS_THUNDERX2(midr) (MIDR_IMPLEMENTOR(midr) == 'C'       \
+			   && MIDR_PARTNUM(midr) == 0xaf)
+
 #define IS_FALKOR(midr) (MIDR_IMPLEMENTOR(midr) == 'Q'			      \
                         && MIDR_PARTNUM(midr) == 0xc00)