aboutsummaryrefslogtreecommitdiff
path: root/benchmarks
diff options
context:
space:
mode:
authorJerry Zhao <jerryz123@berkeley.edu>2023-05-22 14:52:40 -0700
committerJerry Zhao <jerryz123@berkeley.edu>2023-05-22 14:52:40 -0700
commit044a6a06f2a35d22c4d13c9a0336125af87b62ca (patch)
tree8ab987224c96eb5509b757c97853c82dce2d8147 /benchmarks
parentf22a2108c4eabe7313c698ed04024b73850d405e (diff)
downloadriscv-tests-044a6a06f2a35d22c4d13c9a0336125af87b62ca.zip
riscv-tests-044a6a06f2a35d22c4d13c9a0336125af87b62ca.tar.gz
riscv-tests-044a6a06f2a35d22c4d13c9a0336125af87b62ca.tar.bz2
Add scalar single-threaded/mt memcpy
Diffstat (limited to 'benchmarks')
-rw-r--r--benchmarks/Makefile6
-rw-r--r--benchmarks/memcpy/dataset1.h207
-rwxr-xr-xbenchmarks/memcpy/memcpy_gendata.pl132
-rw-r--r--benchmarks/memcpy/memcpy_main.c39
-rw-r--r--benchmarks/mt-memcpy/dataset1.h307
-rwxr-xr-xbenchmarks/mt-memcpy/memcpy_gendata.pl132
-rw-r--r--benchmarks/mt-memcpy/mt-memcpy.c68
7 files changed, 889 insertions, 2 deletions
diff --git a/benchmarks/Makefile b/benchmarks/Makefile
index c9469e2..8f40e42 100644
--- a/benchmarks/Makefile
+++ b/benchmarks/Makefile
@@ -23,12 +23,14 @@ bmarks = \
rsort \
towers \
vvadd \
+ memcpy \
multiply \
mm \
dhrystone \
spmv \
mt-vvadd \
mt-matmul \
+ mt-memcpy \
pmp \
#--------------------------------------------------------------------
@@ -37,7 +39,7 @@ bmarks = \
RISCV_PREFIX ?= riscv$(XLEN)-unknown-elf-
RISCV_GCC ?= $(RISCV_PREFIX)gcc
-RISCV_GCC_OPTS ?= -DPREALLOCATE=1 -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -fno-common -fno-builtin-printf -fno-tree-loop-distribute-patterns
+RISCV_GCC_OPTS ?= -DPREALLOCATE=1 -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -fno-common -fno-builtin-printf -fno-tree-loop-distribute-patterns -march=rv$(XLEN)gc -mabi=lp64d
RISCV_LINK ?= $(RISCV_GCC) -T $(src_dir)/common/test.ld $(incs)
RISCV_LINK_OPTS ?= -static -nostdlib -nostartfiles -lm -lgcc -T $(src_dir)/common/test.ld
RISCV_OBJDUMP ?= $(RISCV_PREFIX)objdump --disassemble-all --disassemble-zeroes --section=.text --section=.text.startup --section=.text.init --section=.data
@@ -48,7 +50,7 @@ objs :=
define compile_template
$(1).riscv: $(wildcard $(src_dir)/$(1)/*) $(wildcard $(src_dir)/common/*)
- $$(RISCV_GCC) $$(incs) $$(RISCV_GCC_OPTS) -o $$@ $(wildcard $(src_dir)/$(1)/*.c) $(wildcard $(src_dir)/common/*.c) $(wildcard $(src_dir)/common/*.S) $$(RISCV_LINK_OPTS)
+ $$(RISCV_GCC) $$(incs) $$(RISCV_GCC_OPTS) -o $$@ $(wildcard $(src_dir)/$(1)/*.c) $(wildcard $(src_dir)/$(1)/*.S) $(wildcard $(src_dir)/common/*.c) $(wildcard $(src_dir)/common/*.S) $$(RISCV_LINK_OPTS)
endef
$(foreach bmark,$(bmarks),$(eval $(call compile_template,$(bmark))))
diff --git a/benchmarks/memcpy/dataset1.h b/benchmarks/memcpy/dataset1.h
new file mode 100644
index 0000000..3300a01
--- /dev/null
+++ b/benchmarks/memcpy/dataset1.h
@@ -0,0 +1,207 @@
+
+#define DATA_SIZE 4000
+
+int input_data[DATA_SIZE] =
+{
+ 41, 454, 833, 335, 564, 1, 187, 989, 749, 365, 350, 572, 132, 64, 949, 153, 584, 216, 805, 140,
+ 621, 210, 6, 572, 931, 339, 890, 593, 392, 898, 694, 228, 961, 12, 110, 883, 116, 750, 296, 646,
+ 426, 500, 314, 436, 659, 701, 774, 812, 319, 981, 678, 150, 875, 696, 376, 564, 474, 272, 938, 258,
+ 539, 647, 569, 509, 203, 88, 280, 703, 759, 669, 606, 375, 511, 551, 657, 936, 195, 592, 81, 569,
+ 267, 952, 229, 800, 337, 584, 944, 643, 902, 368, 241, 489, 913, 328, 826, 313, 933, 592, 985, 388,
+ 195, 543, 960, 649, 566, 979, 350, 997, 649, 814, 657, 79, 181, 208, 111, 998, 859, 629, 65, 847,
+ 288, 704, 349, 997, 141, 253, 905, 715, 886, 430, 264, 415, 576, 538, 979, 700, 761, 4, 241, 494,
+ 478, 100, 499, 864, 403, 693, 222, 416, 444, 296, 721, 285, 676, 620, 317, 78, 224, 351, 937, 540,
+ 288, 646, 119, 169, 615, 527, 606, 289, 389, 796, 351, 801, 455, 720, 278, 758, 367, 745, 358, 92,
+ 584, 989, 62, 271, 985, 853, 403, 788, 346, 531, 517, 222, 559, 461, 908, 241, 775, 358, 255, 332,
+ 778, 684, 598, 740, 143, 446, 33, 311, 125, 743, 941, 557, 933, 479, 799, 557, 553, 925, 431, 796,
+ 648, 357, 952, 891, 287, 666, 19, 514, 49, 557, 86, 870, 95, 853, 441, 440, 587, 61, 614, 678,
+ 382, 396, 280, 9, 808, 17, 971, 170, 819, 291, 344, 380, 450, 536, 512, 185, 965, 917, 347, 539,
+ 808, 983, 882, 887, 537, 54, 946, 612, 701, 951, 356, 479, 567, 151, 891, 7, 22, 641, 568, 335,
+ 665, 730, 423, 95, 434, 728, 158, 280, 2, 395, 84, 688, 247, 911, 49, 476, 435, 815, 792, 729,
+ 869, 265, 486, 127, 414, 236, 369, 214, 548, 180, 518, 6, 888, 503, 682, 596, 284, 173, 264, 643,
+ 499, 346, 290, 599, 897, 68, 215, 849, 731, 658, 688, 619, 251, 121, 786, 131, 555, 828, 302, 667,
+ 528, 433, 544, 487, 322, 753, 947, 125, 287, 626, 824, 14, 304, 10, 788, 403, 733, 106, 959, 703,
+ 366, 818, 722, 964, 294, 406, 975, 874, 653, 856, 748, 86, 91, 60, 378, 660, 105, 667, 102, 153,
+ 381, 121, 651, 98, 825, 412, 840, 236, 356, 12, 148, 423, 54, 965, 140, 216, 955, 621, 343, 361,
+ 533, 921, 757, 715, 521, 647, 837, 299, 592, 886, 13, 682, 173, 36, 63, 493, 121, 551, 133, 537,
+ 758, 969, 372, 643, 951, 434, 39, 415, 129, 303, 110, 438, 847, 860, 437, 203, 255, 478, 269, 988,
+ 409, 675, 628, 719, 399, 990, 549, 338, 753, 450, 564, 633, 171, 155, 19, 646, 727, 452, 501, 427,
+ 777, 509, 43, 988, 753, 426, 81, 12, 202, 483, 853, 142, 153, 339, 760, 390, 357, 50, 943, 171,
+ 922, 601, 328, 105, 496, 968, 442, 121, 516, 879, 641, 81, 276, 870, 786, 600, 113, 603, 842, 871,
+ 907, 887, 275, 610, 237, 404, 32, 234, 784, 745, 565, 526, 357, 275, 803, 441, 819, 226, 751, 752,
+ 280, 943, 85, 726, 458, 709, 454, 201, 710, 54, 459, 758, 41, 53, 253, 397, 377, 41, 508, 141,
+ 700, 416, 860, 747, 480, 219, 741, 478, 499, 770, 709, 180, 49, 482, 371, 691, 873, 725, 945, 173,
+ 992, 186, 526, 914, 721, 1, 435, 963, 232, 247, 497, 464, 697, 362, 30, 521, 348, 233, 250, 120,
+ 350, 40, 250, 779, 573, 195, 784, 161, 749, 743, 502, 439, 823, 355, 826, 403, 170, 141, 160, 633,
+ 674, 289, 32, 782, 202, 320, 143, 636, 853, 118, 90, 852, 394, 70, 107, 816, 855, 388, 106, 954,
+ 157, 36, 6, 16, 765, 698, 204, 695, 194, 677, 574, 598, 218, 883, 526, 824, 177, 746, 239, 462,
+ 698, 511, 757, 534, 706, 440, 49, 428, 84, 732, 799, 726, 893, 702, 512, 547, 373, 86, 492, 798,
+ 14, 215, 621, 21, 83, 651, 103, 59, 794, 429, 921, 657, 643, 96, 880, 973, 834, 659, 239, 966,
+ 462, 524, 114, 62, 561, 625, 529, 303, 10, 714, 997, 409, 904, 55, 387, 728, 407, 305, 105, 436,
+ 559, 901, 936, 592, 512, 691, 409, 796, 302, 497, 202, 177, 427, 940, 613, 995, 359, 480, 521, 158,
+ 684, 822, 22, 611, 185, 680, 312, 14, 107, 111, 274, 797, 387, 185, 242, 0, 486, 718, 105, 96,
+ 698, 749, 899, 739, 770, 814, 644, 435, 80, 326, 161, 37, 407, 33, 946, 605, 30, 935, 768, 27,
+ 870, 88, 113, 441, 148, 339, 62, 344, 147, 554, 838, 365, 845, 954, 432, 639, 141, 396, 211, 991,
+ 817, 249, 821, 338, 562, 832, 364, 974, 615, 393, 495, 266, 812, 470, 916, 348, 159, 336, 430, 419,
+ 803, 249, 180, 215, 544, 542, 840, 903, 458, 636, 786, 729, 872, 581, 795, 820, 806, 671, 758, 979,
+ 104, 418, 401, 670, 254, 920, 984, 568, 136, 745, 729, 662, 584, 139, 794, 385, 414, 927, 528, 173,
+ 707, 457, 554, 316, 378, 183, 766, 477, 977, 196, 236, 399, 947, 416, 229, 805, 165, 996, 505, 270,
+ 105, 735, 704, 696, 796, 825, 140, 528, 303, 50, 795, 623, 635, 537, 560, 87, 119, 294, 8, 867,
+ 532, 110, 814, 398, 37, 781, 584, 646, 739, 375, 619, 943, 767, 897, 478, 589, 57, 44, 958, 288,
+ 784, 845, 985, 742, 837, 99, 307, 522, 67, 443, 824, 432, 996, 165, 749, 930, 171, 28, 826, 461,
+ 621, 323, 155, 272, 826, 376, 43, 340, 694, 898, 80, 158, 236, 168, 747, 443, 744, 193, 265, 631,
+ 124, 935, 731, 274, 941, 781, 425, 185, 370, 619, 320, 292, 269, 933, 542, 156, 763, 827, 752, 88,
+ 915, 987, 14, 629, 1, 649, 906, 32, 995, 1, 809, 744, 560, 399, 873, 915, 972, 791, 289, 554,
+ 509, 984, 558, 530, 970, 600, 405, 401, 579, 683, 293, 540, 251, 903, 849, 120, 129, 995, 452, 521,
+ 716, 622, 86, 224, 678, 895, 181, 530, 240, 820, 335, 651, 793, 226, 641, 96, 1, 262, 320, 569,
+ 987, 238, 646, 126, 754, 610, 958, 191, 203, 238, 142, 796, 180, 884, 299, 573, 165, 108, 761, 140,
+ 974, 789, 646, 852, 559, 23, 619, 704, 422, 890, 260, 480, 565, 52, 542, 372, 492, 201, 991, 546,
+ 745, 408, 207, 119, 372, 645, 932, 464, 664, 81, 34, 293, 533, 52, 478, 880, 908, 224, 203, 744,
+ 33, 735, 214, 886, 365, 167, 892, 1, 781, 532, 680, 321, 705, 169, 688, 485, 947, 101, 386, 177,
+ 50, 42, 101, 708, 474, 654, 399, 915, 679, 625, 330, 242, 952, 822, 471, 795, 477, 641, 725, 252,
+ 713, 245, 937, 151, 529, 876, 870, 333, 77, 601, 545, 938, 907, 775, 853, 397, 143, 233, 979, 755,
+ 239, 454, 105, 424, 365, 210, 98, 962, 54, 900, 98, 923, 440, 655, 764, 529, 315, 595, 336, 90,
+ 697, 464, 774, 685, 726, 70, 324, 754, 282, 32, 536, 494, 622, 25, 594, 389, 890, 488, 75, 37,
+ 290, 409, 496, 639, 726, 27, 449, 950, 548, 539, 135, 80, 644, 303, 838, 723, 290, 734, 767, 125,
+ 162, 552, 415, 248, 491, 107, 985, 362, 116, 48, 617, 869, 859, 144, 235, 841, 282, 724, 571, 335,
+ 913, 470, 560, 263, 194, 343, 242, 809, 782, 677, 985, 339, 728, 336, 344, 410, 430, 465, 613, 56,
+ 759, 590, 176, 485, 309, 406, 333, 993, 354, 746, 310, 238, 699, 525, 46, 336, 487, 256, 503, 134,
+ 100, 546, 393, 722, 268, 367, 314, 943, 75, 106, 345, 629, 987, 396, 600, 208, 908, 429, 384, 523,
+ 92, 130, 545, 355, 277, 990, 668, 673, 351, 991, 853, 719, 863, 449, 312, 84, 100, 616, 532, 211,
+ 567, 707, 836, 737, 370, 847, 989, 452, 461, 316, 912, 974, 182, 746, 268, 796, 160, 522, 771, 618,
+ 22, 115, 854, 727, 644, 226, 17, 165, 779, 200, 911, 830, 855, 742, 137, 187, 983, 705, 717, 671,
+ 565, 785, 719, 886, 253, 962, 785, 657, 154, 293, 196, 620, 253, 144, 447, 173, 899, 796, 5, 72,
+ 325, 678, 616, 80, 309, 793, 175, 685, 159, 637, 123, 967, 838, 241, 715, 898, 550, 693, 230, 372,
+ 82, 601, 627, 721, 324, 398, 927, 553, 103, 72, 17, 174, 966, 978, 159, 325, 177, 558, 593, 185,
+ 372, 505, 393, 859, 599, 651, 745, 573, 377, 321, 865, 349, 591, 400, 553, 890, 440, 844, 345, 885,
+ 593, 933, 290, 980, 908, 448, 544, 989, 377, 50, 456, 332, 781, 900, 110, 716, 495, 747, 896, 444,
+ 806, 6, 700, 394, 548, 285, 340, 703, 29, 450, 829, 652, 630, 771, 546, 485, 613, 534, 972, 559,
+ 116, 481, 313, 507, 904, 434, 971, 343, 607, 42, 794, 784, 169, 865, 896, 421, 507, 415, 916, 871,
+ 431, 539, 339, 162, 147, 105, 224, 481, 112, 595, 580, 115, 834, 350, 134, 964, 948, 287, 201, 232,
+ 488, 154, 396, 602, 797, 539, 478, 943, 769, 872, 574, 121, 485, 652, 339, 811, 721, 747, 451, 362,
+ 821, 340, 744, 910, 0, 206, 594, 572, 277, 505, 120, 973, 680, 961, 757, 354, 555, 627, 847, 849,
+ 517, 971, 379, 910, 505, 410, 904, 770, 246, 63, 243, 874, 394, 396, 430, 482, 214, 619, 244, 646,
+ 524, 557, 399, 328, 172, 67, 304, 884, 620, 512, 594, 972, 535, 6, 698, 513, 159, 882, 750, 562,
+ 809, 764, 454, 366, 75, 506, 93, 786, 167, 831, 16, 382, 853, 638, 494, 452, 324, 72, 78, 83,
+ 52, 59, 112, 932, 10, 929, 342, 924, 730, 961, 680, 69, 287, 797, 961, 985, 92, 854, 626, 885,
+ 912, 600, 616, 389, 860, 232, 744, 793, 744, 179, 478, 773, 615, 689, 508, 775, 914, 494, 810, 139,
+ 288, 234, 974, 431, 129, 780, 581, 371, 548, 22, 868, 653, 981, 741, 270, 815, 623, 428, 653, 139,
+ 626, 603, 990, 315, 386, 344, 323, 889, 472, 317, 164, 260, 239, 861, 189, 377, 865, 511, 231, 304,
+ 356, 70, 152, 35, 825, 854, 328, 576, 390, 490, 848, 326, 38, 303, 402, 431, 616, 813, 546, 708,
+ 206, 388, 2, 962, 783, 967, 890, 442, 815, 49, 831, 831, 665, 251, 410, 321, 94, 741, 246, 179,
+ 422, 176, 211, 117, 675, 523, 9, 764, 374, 952, 426, 704, 64, 531, 53, 804, 758, 23, 811, 611,
+ 500, 846, 437, 375, 335, 854, 328, 971, 237, 24, 415, 639, 468, 318, 684, 723, 565, 662, 305, 647,
+ 449, 281, 597, 158, 136, 294, 882, 885, 383, 734, 938, 866, 268, 471, 115, 296, 908, 673, 50, 472,
+ 952, 439, 366, 5, 397, 155, 257, 506, 231, 948, 667, 600, 35, 445, 990, 222, 443, 784, 213, 349,
+ 389, 943, 13, 150, 621, 366, 52, 444, 612, 604, 934, 720, 953, 340, 828, 972, 462, 911, 621, 321,
+ 812, 435, 522, 50, 672, 78, 57, 761, 313, 950, 352, 238, 55, 27, 972, 226, 753, 201, 416, 176,
+ 879, 877, 864, 450, 572, 879, 163, 99, 721, 143, 12, 31, 643, 812, 507, 771, 968, 527, 781, 488,
+ 840, 797, 242, 194, 630, 293, 810, 966, 795, 276, 435, 345, 885, 413, 599, 197, 696, 386, 643, 116,
+ 93, 322, 710, 680, 785, 538, 112, 553, 581, 960, 12, 874, 923, 48, 615, 506, 652, 898, 359, 539,
+ 261, 495, 233, 764, 609, 805, 686, 286, 539, 432, 118, 836, 560, 192, 739, 825, 20, 778, 317, 586,
+ 976, 359, 573, 352, 386, 746, 772, 11, 663, 749, 504, 5, 212, 408, 888, 643, 907, 441, 420, 368,
+ 737, 97, 516, 169, 25, 359, 219, 527, 797, 672, 716, 69, 452, 880, 692, 298, 683, 300, 459, 327,
+ 815, 923, 323, 829, 612, 816, 247, 497, 116, 243, 352, 981, 281, 917, 738, 713, 290, 653, 909, 503,
+ 645, 406, 625, 543, 932, 108, 220, 304, 685, 464, 373, 954, 876, 86, 646, 802, 412, 446, 955, 28,
+ 664, 539, 850, 655, 783, 28, 392, 470, 707, 735, 422, 941, 523, 610, 682, 451, 37, 672, 156, 237,
+ 43, 766, 767, 713, 124, 409, 549, 869, 814, 186, 251, 475, 214, 568, 212, 44, 572, 997, 898, 139,
+ 956, 456, 608, 470, 651, 566, 434, 408, 906, 756, 970, 573, 640, 877, 687, 24, 642, 506, 265, 368,
+ 271, 399, 972, 950, 814, 109, 824, 595, 121, 856, 465, 516, 468, 473, 631, 793, 281, 736, 416, 708,
+ 315, 978, 235, 530, 626, 419, 296, 548, 502, 854, 28, 184, 668, 786, 326, 228, 578, 738, 881, 265,
+ 304, 808, 415, 490, 0, 623, 199, 483, 934, 105, 212, 545, 535, 154, 40, 473, 528, 712, 835, 668,
+ 349, 235, 338, 307, 230, 334, 872, 522, 374, 225, 143, 746, 996, 144, 385, 136, 848, 545, 487, 434,
+ 587, 837, 8, 456, 487, 434, 729, 114, 944, 971, 688, 316, 871, 667, 156, 304, 624, 813, 269, 729,
+ 47, 538, 250, 756, 491, 838, 882, 404, 213, 56, 231, 471, 326, 758, 132, 493, 644, 327, 421, 992,
+ 327, 435, 57, 651, 676, 352, 519, 199, 776, 354, 235, 648, 647, 3, 95, 842, 260, 345, 713, 912,
+ 198, 781, 493, 632, 943, 142, 86, 615, 222, 95, 843, 743, 337, 942, 752, 87, 53, 121, 86, 263,
+ 889, 580, 269, 666, 187, 68, 731, 230, 538, 72, 759, 330, 961, 547, 606, 593, 10, 320, 560, 798,
+ 122, 32, 957, 646, 288, 450, 604, 161, 128, 880, 109, 220, 175, 818, 590, 425, 413, 217, 346, 205,
+ 249, 63, 635, 858, 514, 14, 799, 766, 882, 610, 939, 375, 157, 120, 886, 963, 172, 983, 974, 755,
+ 922, 571, 323, 352, 783, 866, 832, 955, 100, 492, 772, 530, 751, 361, 696, 321, 650, 69, 986, 552,
+ 192, 55, 798, 91, 39, 563, 654, 564, 761, 544, 892, 167, 801, 122, 277, 25, 451, 829, 967, 781,
+ 361, 168, 64, 397, 928, 563, 914, 336, 536, 478, 243, 257, 264, 477, 879, 390, 640, 701, 208, 328,
+ 302, 443, 295, 521, 813, 914, 573, 118, 345, 525, 964, 508, 482, 30, 606, 416, 101, 71, 121, 92,
+ 435, 284, 453, 161, 20, 361, 70, 414, 23, 804, 255, 839, 276, 586, 890, 36, 427, 246, 542, 865,
+ 622, 953, 699, 366, 773, 803, 296, 133, 277, 529, 104, 229, 80, 462, 632, 260, 815, 37, 851, 237,
+ 732, 243, 393, 866, 760, 196, 126, 631, 168, 301, 843, 613, 189, 333, 589, 247, 936, 197, 256, 594,
+ 232, 956, 75, 306, 190, 329, 424, 153, 751, 690, 757, 805, 876, 539, 48, 122, 857, 473, 770, 388,
+ 638, 125, 488, 973, 176, 203, 474, 693, 461, 82, 606, 432, 923, 70, 0, 371, 632, 206, 280, 604,
+ 928, 686, 300, 120, 451, 795, 703, 810, 711, 708, 620, 357, 443, 98, 789, 903, 611, 93, 231, 376,
+ 530, 299, 791, 1, 732, 298, 289, 131, 726, 834, 806, 249, 172, 709, 898, 123, 456, 5, 942, 462,
+ 607, 322, 801, 208, 503, 421, 741, 183, 806, 258, 633, 533, 950, 594, 948, 31, 40, 984, 353, 213,
+ 195, 50, 794, 978, 700, 217, 287, 821, 267, 734, 774, 554, 650, 361, 199, 236, 263, 99, 316, 810,
+ 946, 984, 940, 891, 603, 180, 834, 333, 639, 286, 522, 33, 256, 202, 418, 467, 266, 716, 918, 126,
+ 786, 695, 782, 408, 529, 921, 494, 207, 301, 925, 195, 804, 391, 951, 730, 552, 912, 432, 798, 33,
+ 472, 262, 826, 748, 367, 835, 115, 373, 233, 351, 850, 910, 854, 688, 551, 883, 857, 24, 314, 555,
+ 822, 986, 422, 917, 175, 172, 470, 354, 830, 208, 311, 834, 206, 653, 144, 823, 106, 126, 638, 689,
+ 134, 307, 623, 804, 439, 423, 913, 349, 602, 424, 996, 430, 555, 144, 481, 756, 226, 990, 325, 207,
+ 851, 302, 535, 825, 134, 849, 204, 683, 695, 556, 791, 763, 169, 533, 623, 194, 86, 724, 484, 440,
+ 92, 870, 471, 86, 538, 47, 303, 819, 777, 652, 702, 900, 530, 522, 459, 321, 913, 559, 963, 963,
+ 685, 369, 327, 470, 164, 284, 437, 957, 148, 616, 2, 108, 106, 296, 743, 121, 304, 131, 694, 935,
+ 503, 937, 40, 883, 39, 899, 70, 229, 637, 654, 843, 866, 259, 252, 531, 52, 492, 969, 693, 419,
+ 278, 777, 970, 442, 546, 456, 503, 69, 955, 129, 697, 623, 842, 359, 325, 515, 223, 527, 84, 469,
+ 732, 724, 319, 104, 703, 789, 980, 109, 446, 830, 892, 23, 689, 884, 100, 790, 196, 509, 343, 828,
+ 637, 580, 367, 847, 48, 435, 860, 292, 696, 523, 724, 908, 191, 805, 392, 951, 510, 163, 975, 258,
+ 569, 922, 723, 232, 692, 328, 49, 654, 48, 35, 88, 450, 900, 854, 485, 700, 424, 515, 759, 543,
+ 441, 631, 57, 346, 637, 814, 405, 885, 632, 609, 147, 952, 446, 919, 371, 154, 995, 814, 965, 875,
+ 729, 993, 734, 767, 467, 163, 690, 480, 293, 685, 687, 104, 433, 942, 363, 28, 725, 163, 738, 330,
+ 370, 129, 741, 952, 444, 241, 309, 380, 279, 336, 337, 607, 503, 132, 517, 368, 882, 87, 539, 687,
+ 146, 233, 336, 457, 789, 246, 78, 192, 367, 73, 856, 990, 423, 945, 82, 967, 921, 980, 87, 553,
+ 534, 33, 628, 565, 342, 326, 572, 430, 563, 108, 990, 429, 517, 178, 139, 847, 928, 518, 770, 160,
+ 291, 75, 224, 297, 564, 234, 704, 948, 382, 163, 596, 163, 675, 420, 231, 70, 604, 366, 722, 886,
+ 746, 635, 819, 733, 59, 372, 722, 874, 256, 26, 677, 451, 440, 204, 585, 435, 474, 580, 667, 548,
+ 93, 813, 333, 49, 924, 508, 208, 373, 769, 682, 877, 448, 823, 47, 452, 274, 321, 665, 599, 49,
+ 866, 570, 286, 442, 690, 385, 101, 478, 215, 713, 539, 238, 659, 344, 146, 142, 454, 289, 340, 764,
+ 774, 518, 540, 977, 579, 222, 726, 7, 746, 637, 597, 827, 767, 358, 470, 55, 415, 509, 858, 120,
+ 845, 984, 564, 584, 58, 755, 967, 919, 814, 110, 977, 972, 423, 34, 933, 699, 810, 94, 87, 209,
+ 362, 393, 526, 620, 121, 994, 676, 983, 367, 698, 236, 500, 684, 97, 500, 185, 617, 155, 47, 89,
+ 618, 421, 185, 340, 374, 857, 236, 765, 860, 689, 694, 441, 685, 932, 582, 271, 4, 114, 660, 955,
+ 404, 270, 635, 630, 721, 596, 631, 769, 468, 95, 153, 983, 0, 408, 689, 292, 220, 586, 430, 669,
+ 524, 188, 965, 910, 334, 575, 996, 506, 189, 133, 273, 525, 542, 881, 75, 916, 663, 610, 461, 956,
+ 943, 219, 281, 195, 347, 995, 136, 589, 142, 708, 270, 3, 867, 468, 45, 742, 844, 963, 413, 860,
+ 451, 635, 798, 906, 837, 380, 148, 279, 133, 343, 579, 170, 439, 735, 342, 918, 795, 736, 133, 859,
+ 650, 486, 856, 63, 431, 677, 686, 670, 198, 123, 512, 572, 878, 888, 346, 340, 606, 826, 844, 375,
+ 510, 824, 201, 219, 227, 201, 338, 522, 997, 76, 609, 922, 904, 270, 326, 809, 328, 285, 83, 630,
+ 550, 92, 369, 957, 719, 980, 784, 494, 472, 231, 734, 408, 917, 415, 886, 36, 728, 116, 526, 844,
+ 659, 493, 959, 395, 112, 758, 154, 664, 744, 156, 99, 767, 668, 620, 51, 747, 239, 97, 737, 399,
+ 751, 458, 16, 47, 847, 557, 937, 72, 744, 848, 78, 706, 348, 33, 505, 83, 520, 695, 572, 661,
+ 322, 123, 447, 349, 584, 433, 951, 905, 97, 416, 123, 421, 659, 843, 923, 933, 938, 291, 961, 861,
+ 145, 367, 714, 153, 66, 697, 744, 657, 477, 511, 602, 445, 950, 553, 278, 96, 937, 555, 368, 415,
+ 748, 143, 741, 771, 862, 990, 8, 295, 396, 17, 119, 236, 508, 285, 844, 914, 97, 235, 906, 118,
+ 83, 405, 190, 618, 438, 438, 706, 413, 546, 214, 807, 540, 360, 162, 426, 42, 852, 258, 765, 147,
+ 550, 13, 547, 704, 227, 733, 678, 587, 623, 795, 309, 538, 920, 372, 971, 929, 590, 466, 749, 42,
+ 662, 794, 545, 57, 747, 828, 231, 287, 655, 443, 148, 600, 71, 209, 453, 494, 560, 542, 835, 46,
+ 608, 971, 13, 600, 370, 662, 139, 818, 174, 618, 209, 609, 457, 373, 907, 959, 833, 382, 175, 136,
+ 374, 157, 417, 761, 312, 710, 389, 746, 155, 238, 941, 567, 450, 717, 282, 408, 997, 194, 918, 799,
+ 282, 750, 960, 604, 194, 310, 798, 141, 124, 492, 40, 439, 62, 389, 878, 731, 318, 580, 199, 379,
+ 512, 359, 710, 188, 909, 639, 339, 96, 542, 393, 178, 204, 590, 696, 183, 247, 618, 413, 971, 539,
+ 702, 430, 715, 949, 425, 760, 971, 207, 956, 373, 144, 106, 921, 591, 16, 774, 796, 179, 924, 709,
+ 966, 993, 625, 757, 6, 357, 6, 778, 58, 162, 524, 265, 247, 375, 595, 545, 867, 973, 219, 170,
+ 709, 920, 700, 112, 344, 213, 455, 321, 939, 165, 157, 883, 99, 258, 140, 515, 217, 311, 84, 660,
+ 715, 504, 149, 198, 566, 341, 521, 474, 351, 951, 546, 183, 603, 876, 538, 901, 754, 363, 893, 973,
+ 913, 244, 192, 799, 362, 155, 702, 637, 628, 415, 599, 177, 686, 718, 604, 550, 153, 242, 790, 152,
+ 603, 168, 465, 779, 781, 511, 172, 789, 445, 618, 502, 270, 45, 696, 185, 927, 71, 970, 448, 519,
+ 201, 918, 190, 958, 174, 835, 941, 916, 255, 575, 693, 976, 150, 665, 612, 452, 227, 259, 784, 568,
+ 780, 395, 783, 102, 179, 124, 52, 52, 824, 868, 328, 763, 679, 574, 300, 905, 404, 139, 955, 280,
+ 976, 246, 122, 692, 679, 276, 158, 735, 126, 525, 736, 824, 910, 660, 87, 908, 725, 523, 532, 92,
+ 473, 876, 886, 500, 715, 258, 458, 28, 768, 219, 382, 504, 883, 10, 716, 783, 241, 519, 576, 892,
+ 372, 241, 239, 419, 944, 465, 105, 586, 466, 234, 54, 194, 173, 833, 649, 560, 386, 589, 983, 692,
+ 652, 101, 332, 790, 640, 50, 67, 397, 773, 700, 282, 691, 728, 675, 711, 631, 81, 788, 868, 618,
+ 635, 265, 892, 617, 11, 764, 624, 990, 609, 58, 615, 781, 480, 939, 461, 611, 163, 184, 465, 314,
+ 470, 698, 619, 789, 117, 3, 311, 456, 186, 203, 721, 932, 768, 502, 143, 904, 730, 201, 423, 417,
+ 947, 154, 568, 261, 473, 775, 380, 615, 786, 193, 710, 445, 469, 943, 729, 204, 564, 117, 142, 568,
+ 342, 854, 790, 984, 824, 297, 982, 834, 21, 944, 482, 759, 312, 2, 512, 659, 599, 860, 803, 4,
+ 961, 790, 458, 362, 380, 90, 771, 389, 291, 209, 630, 440, 845, 255, 435, 550, 71, 925, 733, 659,
+ 899, 770, 914, 791, 60, 993, 984, 955, 244, 55, 935, 877, 960, 708, 628, 374, 144, 871, 8, 407,
+ 438, 591, 590, 124, 164, 402, 195, 757, 242, 435, 238, 136, 675, 569, 455, 48, 984, 938, 717, 381,
+ 82, 776, 595, 69, 112, 421, 361, 626, 719, 664, 253, 694, 944, 281, 451, 196, 345, 699, 721, 829,
+ 469, 368, 20, 825, 986, 436, 40, 577, 702, 199, 403, 623, 655, 33, 577, 927, 48, 993, 19, 741,
+ 107, 221, 193, 932, 70, 832, 172, 355, 396, 210, 191, 54, 477, 861, 755, 198, 434, 199, 481, 52,
+ 928, 347, 371, 949, 162, 11, 757, 593, 473, 558, 744, 494, 204, 113, 53, 511, 56, 924, 319, 185,
+ 102, 712, 721, 475, 548, 626, 546, 4, 280, 884, 765, 709, 159, 811, 706, 732, 944, 730, 429, 237,
+ 956, 924, 75, 24, 985, 357, 143, 86, 440, 209, 838, 576, 813, 81, 262, 809, 761, 310, 483, 447,
+ 743, 631, 464, 658, 233, 43, 279, 893, 199, 274, 380, 771, 237, 815, 88, 75, 530, 729, 761, 746,
+ 506, 900, 978, 311, 694, 480, 480, 82, 997, 729, 26, 627, 370, 540, 750, 24, 300, 664, 212, 750,
+ 374, 72, 211, 540, 554, 230, 622, 780, 364, 284, 954, 266, 382, 630, 916, 299, 909, 877, 136, 485
+};
+
diff --git a/benchmarks/memcpy/memcpy_gendata.pl b/benchmarks/memcpy/memcpy_gendata.pl
new file mode 100755
index 0000000..4efc145
--- /dev/null
+++ b/benchmarks/memcpy/memcpy_gendata.pl
@@ -0,0 +1,132 @@
+#!/usr/bin/perl -w
+#==========================================================================
+# vvadd_gendata.pl
+#
+# Author : Christopher Batten (cbatten@mit.edu)
+# Date : April 29, 2005
+#
+(our $usageMsg = <<'ENDMSG') =~ s/^\#//gm;
+#
+# Simple script which creates an input data set and the reference data
+# for the vvadd benchmark.
+#
+ENDMSG
+
+use strict "vars";
+use warnings;
+no warnings("once");
+use Getopt::Long;
+
+#--------------------------------------------------------------------------
+# Command line processing
+#--------------------------------------------------------------------------
+
+our %opts;
+
+sub usage()
+{
+
+ print "\n";
+ print " Usage: memcpy_gendata.pl [options] \n";
+ print "\n";
+ print " Options:\n";
+ print " --help print this message\n";
+ print " --size size of input data [1000]\n";
+ print " --seed random seed [1]\n";
+ print "$usageMsg";
+
+ exit();
+}
+
+sub processCommandLine()
+{
+
+ $opts{"help"} = 0;
+ $opts{"size"} = 1000;
+ $opts{"seed"} = 1;
+ Getopt::Long::GetOptions( \%opts, 'help|?', 'size:i', 'seed:i' ) or usage();
+ $opts{"help"} and usage();
+
+}
+
+#--------------------------------------------------------------------------
+# Helper Functions
+#--------------------------------------------------------------------------
+
+sub printArray
+{
+ my $arrayName = $_[0];
+ my $arrayRef = $_[1];
+
+ my $numCols = 20;
+ my $arrayLen = scalar(@{$arrayRef});
+
+ print "int ".$arrayName."[DATA_SIZE] = \n";
+ print "{\n";
+
+ if ( $arrayLen <= $numCols ) {
+ print " ";
+ for ( my $i = 0; $i < $arrayLen; $i++ ) {
+ print sprintf("%3d",$arrayRef->[$i]);
+ if ( $i != $arrayLen-1 ) {
+ print ", ";
+ }
+ }
+ print "\n";
+ }
+
+ else {
+ my $numRows = int($arrayLen/$numCols);
+ for ( my $j = 0; $j < $numRows; $j++ ) {
+ print " ";
+ for ( my $i = 0; $i < $numCols; $i++ ) {
+ my $index = $j*$numCols + $i;
+ print sprintf("%3d",$arrayRef->[$index]);
+ if ( $index != $arrayLen-1 ) {
+ print ", ";
+ }
+ }
+ print "\n";
+ }
+
+ if ( $arrayLen > ($numRows*$numCols) ) {
+ print " ";
+ for ( my $i = 0; $i < ($arrayLen-($numRows*$numCols)); $i++ ) {
+ my $index = $numCols*$numRows + $i;
+ print sprintf("%3d",$arrayRef->[$index]);
+ if ( $index != $arrayLen-1 ) {
+ print ", ";
+ }
+ }
+ print "\n";
+ }
+
+ }
+
+ print "};\n\n";
+}
+
+#--------------------------------------------------------------------------
+# Main
+#--------------------------------------------------------------------------
+
+sub main()
+{
+
+ processCommandLine();
+ srand($opts{"seed"});
+
+ my @values;
+ for ( my $i = 0; $i < $opts{"size"}; $i++ ) {
+ my $value = int(rand(999));
+ push( @values, $value );
+ }
+
+
+ print "\n\#define DATA_SIZE ".$opts{"size"}." \n\n";
+ printArray( "input_data", \@values );
+
+}
+
+main();
+
diff --git a/benchmarks/memcpy/memcpy_main.c b/benchmarks/memcpy/memcpy_main.c
new file mode 100644
index 0000000..bec85e1
--- /dev/null
+++ b/benchmarks/memcpy/memcpy_main.c
@@ -0,0 +1,39 @@
+// See LICENSE for license details.
+
+//**************************************************************************
+// Memcpy benchmark
+//--------------------------------------------------------------------------
+//
+// This benchmark tests the memcpy implementation in syscalls.c.
+// The input data (and reference data) should be generated using
+// the memcpy_gendata.pl perl script and dumped to a file named
+// dataset1.h.
+
+#include <string.h>
+#include "util.h"
+
+//--------------------------------------------------------------------------
+// Input/Reference Data
+
+#include "dataset1.h"
+
+//--------------------------------------------------------------------------
+// Main
+
+int main( int argc, char* argv[] )
+{
+ int results_data[DATA_SIZE];
+
+#if PREALLOCATE
+ // If needed we preallocate everything in the caches
+ memcpy(results_data, input_data, sizeof(int) * DATA_SIZE);
+#endif
+
+ // Do the riscv-linux memcpy
+ setStats(1);
+ memcpy(results_data, input_data, sizeof(int) * DATA_SIZE); //, DATA_SIZE * sizeof(int));
+ setStats(0);
+
+ // Check the results
+ return verify( DATA_SIZE, results_data, input_data );
+}
diff --git a/benchmarks/mt-memcpy/dataset1.h b/benchmarks/mt-memcpy/dataset1.h
new file mode 100644
index 0000000..6f6bb81
--- /dev/null
+++ b/benchmarks/mt-memcpy/dataset1.h
@@ -0,0 +1,307 @@
+
+#define DATA_SIZE 6000
+
+int input_data[DATA_SIZE] =
+{
+ 41, 454, 833, 335, 564, 1, 187, 989, 749, 365, 350, 572, 132, 64, 949, 153, 584, 216, 805, 140,
+ 621, 210, 6, 572, 931, 339, 890, 593, 392, 898, 694, 228, 961, 12, 110, 883, 116, 750, 296, 646,
+ 426, 500, 314, 436, 659, 701, 774, 812, 319, 981, 678, 150, 875, 696, 376, 564, 474, 272, 938, 258,
+ 539, 647, 569, 509, 203, 88, 280, 703, 759, 669, 606, 375, 511, 551, 657, 936, 195, 592, 81, 569,
+ 267, 952, 229, 800, 337, 584, 944, 643, 902, 368, 241, 489, 913, 328, 826, 313, 933, 592, 985, 388,
+ 195, 543, 960, 649, 566, 979, 350, 997, 649, 814, 657, 79, 181, 208, 111, 998, 859, 629, 65, 847,
+ 288, 704, 349, 997, 141, 253, 905, 715, 886, 430, 264, 415, 576, 538, 979, 700, 761, 4, 241, 494,
+ 478, 100, 499, 864, 403, 693, 222, 416, 444, 296, 721, 285, 676, 620, 317, 78, 224, 351, 937, 540,
+ 288, 646, 119, 169, 615, 527, 606, 289, 389, 796, 351, 801, 455, 720, 278, 758, 367, 745, 358, 92,
+ 584, 989, 62, 271, 985, 853, 403, 788, 346, 531, 517, 222, 559, 461, 908, 241, 775, 358, 255, 332,
+ 778, 684, 598, 740, 143, 446, 33, 311, 125, 743, 941, 557, 933, 479, 799, 557, 553, 925, 431, 796,
+ 648, 357, 952, 891, 287, 666, 19, 514, 49, 557, 86, 870, 95, 853, 441, 440, 587, 61, 614, 678,
+ 382, 396, 280, 9, 808, 17, 971, 170, 819, 291, 344, 380, 450, 536, 512, 185, 965, 917, 347, 539,
+ 808, 983, 882, 887, 537, 54, 946, 612, 701, 951, 356, 479, 567, 151, 891, 7, 22, 641, 568, 335,
+ 665, 730, 423, 95, 434, 728, 158, 280, 2, 395, 84, 688, 247, 911, 49, 476, 435, 815, 792, 729,
+ 869, 265, 486, 127, 414, 236, 369, 214, 548, 180, 518, 6, 888, 503, 682, 596, 284, 173, 264, 643,
+ 499, 346, 290, 599, 897, 68, 215, 849, 731, 658, 688, 619, 251, 121, 786, 131, 555, 828, 302, 667,
+ 528, 433, 544, 487, 322, 753, 947, 125, 287, 626, 824, 14, 304, 10, 788, 403, 733, 106, 959, 703,
+ 366, 818, 722, 964, 294, 406, 975, 874, 653, 856, 748, 86, 91, 60, 378, 660, 105, 667, 102, 153,
+ 381, 121, 651, 98, 825, 412, 840, 236, 356, 12, 148, 423, 54, 965, 140, 216, 955, 621, 343, 361,
+ 533, 921, 757, 715, 521, 647, 837, 299, 592, 886, 13, 682, 173, 36, 63, 493, 121, 551, 133, 537,
+ 758, 969, 372, 643, 951, 434, 39, 415, 129, 303, 110, 438, 847, 860, 437, 203, 255, 478, 269, 988,
+ 409, 675, 628, 719, 399, 990, 549, 338, 753, 450, 564, 633, 171, 155, 19, 646, 727, 452, 501, 427,
+ 777, 509, 43, 988, 753, 426, 81, 12, 202, 483, 853, 142, 153, 339, 760, 390, 357, 50, 943, 171,
+ 922, 601, 328, 105, 496, 968, 442, 121, 516, 879, 641, 81, 276, 870, 786, 600, 113, 603, 842, 871,
+ 907, 887, 275, 610, 237, 404, 32, 234, 784, 745, 565, 526, 357, 275, 803, 441, 819, 226, 751, 752,
+ 280, 943, 85, 726, 458, 709, 454, 201, 710, 54, 459, 758, 41, 53, 253, 397, 377, 41, 508, 141,
+ 700, 416, 860, 747, 480, 219, 741, 478, 499, 770, 709, 180, 49, 482, 371, 691, 873, 725, 945, 173,
+ 992, 186, 526, 914, 721, 1, 435, 963, 232, 247, 497, 464, 697, 362, 30, 521, 348, 233, 250, 120,
+ 350, 40, 250, 779, 573, 195, 784, 161, 749, 743, 502, 439, 823, 355, 826, 403, 170, 141, 160, 633,
+ 674, 289, 32, 782, 202, 320, 143, 636, 853, 118, 90, 852, 394, 70, 107, 816, 855, 388, 106, 954,
+ 157, 36, 6, 16, 765, 698, 204, 695, 194, 677, 574, 598, 218, 883, 526, 824, 177, 746, 239, 462,
+ 698, 511, 757, 534, 706, 440, 49, 428, 84, 732, 799, 726, 893, 702, 512, 547, 373, 86, 492, 798,
+ 14, 215, 621, 21, 83, 651, 103, 59, 794, 429, 921, 657, 643, 96, 880, 973, 834, 659, 239, 966,
+ 462, 524, 114, 62, 561, 625, 529, 303, 10, 714, 997, 409, 904, 55, 387, 728, 407, 305, 105, 436,
+ 559, 901, 936, 592, 512, 691, 409, 796, 302, 497, 202, 177, 427, 940, 613, 995, 359, 480, 521, 158,
+ 684, 822, 22, 611, 185, 680, 312, 14, 107, 111, 274, 797, 387, 185, 242, 0, 486, 718, 105, 96,
+ 698, 749, 899, 739, 770, 814, 644, 435, 80, 326, 161, 37, 407, 33, 946, 605, 30, 935, 768, 27,
+ 870, 88, 113, 441, 148, 339, 62, 344, 147, 554, 838, 365, 845, 954, 432, 639, 141, 396, 211, 991,
+ 817, 249, 821, 338, 562, 832, 364, 974, 615, 393, 495, 266, 812, 470, 916, 348, 159, 336, 430, 419,
+ 803, 249, 180, 215, 544, 542, 840, 903, 458, 636, 786, 729, 872, 581, 795, 820, 806, 671, 758, 979,
+ 104, 418, 401, 670, 254, 920, 984, 568, 136, 745, 729, 662, 584, 139, 794, 385, 414, 927, 528, 173,
+ 707, 457, 554, 316, 378, 183, 766, 477, 977, 196, 236, 399, 947, 416, 229, 805, 165, 996, 505, 270,
+ 105, 735, 704, 696, 796, 825, 140, 528, 303, 50, 795, 623, 635, 537, 560, 87, 119, 294, 8, 867,
+ 532, 110, 814, 398, 37, 781, 584, 646, 739, 375, 619, 943, 767, 897, 478, 589, 57, 44, 958, 288,
+ 784, 845, 985, 742, 837, 99, 307, 522, 67, 443, 824, 432, 996, 165, 749, 930, 171, 28, 826, 461,
+ 621, 323, 155, 272, 826, 376, 43, 340, 694, 898, 80, 158, 236, 168, 747, 443, 744, 193, 265, 631,
+ 124, 935, 731, 274, 941, 781, 425, 185, 370, 619, 320, 292, 269, 933, 542, 156, 763, 827, 752, 88,
+ 915, 987, 14, 629, 1, 649, 906, 32, 995, 1, 809, 744, 560, 399, 873, 915, 972, 791, 289, 554,
+ 509, 984, 558, 530, 970, 600, 405, 401, 579, 683, 293, 540, 251, 903, 849, 120, 129, 995, 452, 521,
+ 716, 622, 86, 224, 678, 895, 181, 530, 240, 820, 335, 651, 793, 226, 641, 96, 1, 262, 320, 569,
+ 987, 238, 646, 126, 754, 610, 958, 191, 203, 238, 142, 796, 180, 884, 299, 573, 165, 108, 761, 140,
+ 974, 789, 646, 852, 559, 23, 619, 704, 422, 890, 260, 480, 565, 52, 542, 372, 492, 201, 991, 546,
+ 745, 408, 207, 119, 372, 645, 932, 464, 664, 81, 34, 293, 533, 52, 478, 880, 908, 224, 203, 744,
+ 33, 735, 214, 886, 365, 167, 892, 1, 781, 532, 680, 321, 705, 169, 688, 485, 947, 101, 386, 177,
+ 50, 42, 101, 708, 474, 654, 399, 915, 679, 625, 330, 242, 952, 822, 471, 795, 477, 641, 725, 252,
+ 713, 245, 937, 151, 529, 876, 870, 333, 77, 601, 545, 938, 907, 775, 853, 397, 143, 233, 979, 755,
+ 239, 454, 105, 424, 365, 210, 98, 962, 54, 900, 98, 923, 440, 655, 764, 529, 315, 595, 336, 90,
+ 697, 464, 774, 685, 726, 70, 324, 754, 282, 32, 536, 494, 622, 25, 594, 389, 890, 488, 75, 37,
+ 290, 409, 496, 639, 726, 27, 449, 950, 548, 539, 135, 80, 644, 303, 838, 723, 290, 734, 767, 125,
+ 162, 552, 415, 248, 491, 107, 985, 362, 116, 48, 617, 869, 859, 144, 235, 841, 282, 724, 571, 335,
+ 913, 470, 560, 263, 194, 343, 242, 809, 782, 677, 985, 339, 728, 336, 344, 410, 430, 465, 613, 56,
+ 759, 590, 176, 485, 309, 406, 333, 993, 354, 746, 310, 238, 699, 525, 46, 336, 487, 256, 503, 134,
+ 100, 546, 393, 722, 268, 367, 314, 943, 75, 106, 345, 629, 987, 396, 600, 208, 908, 429, 384, 523,
+ 92, 130, 545, 355, 277, 990, 668, 673, 351, 991, 853, 719, 863, 449, 312, 84, 100, 616, 532, 211,
+ 567, 707, 836, 737, 370, 847, 989, 452, 461, 316, 912, 974, 182, 746, 268, 796, 160, 522, 771, 618,
+ 22, 115, 854, 727, 644, 226, 17, 165, 779, 200, 911, 830, 855, 742, 137, 187, 983, 705, 717, 671,
+ 565, 785, 719, 886, 253, 962, 785, 657, 154, 293, 196, 620, 253, 144, 447, 173, 899, 796, 5, 72,
+ 325, 678, 616, 80, 309, 793, 175, 685, 159, 637, 123, 967, 838, 241, 715, 898, 550, 693, 230, 372,
+ 82, 601, 627, 721, 324, 398, 927, 553, 103, 72, 17, 174, 966, 978, 159, 325, 177, 558, 593, 185,
+ 372, 505, 393, 859, 599, 651, 745, 573, 377, 321, 865, 349, 591, 400, 553, 890, 440, 844, 345, 885,
+ 593, 933, 290, 980, 908, 448, 544, 989, 377, 50, 456, 332, 781, 900, 110, 716, 495, 747, 896, 444,
+ 806, 6, 700, 394, 548, 285, 340, 703, 29, 450, 829, 652, 630, 771, 546, 485, 613, 534, 972, 559,
+ 116, 481, 313, 507, 904, 434, 971, 343, 607, 42, 794, 784, 169, 865, 896, 421, 507, 415, 916, 871,
+ 431, 539, 339, 162, 147, 105, 224, 481, 112, 595, 580, 115, 834, 350, 134, 964, 948, 287, 201, 232,
+ 488, 154, 396, 602, 797, 539, 478, 943, 769, 872, 574, 121, 485, 652, 339, 811, 721, 747, 451, 362,
+ 821, 340, 744, 910, 0, 206, 594, 572, 277, 505, 120, 973, 680, 961, 757, 354, 555, 627, 847, 849,
+ 517, 971, 379, 910, 505, 410, 904, 770, 246, 63, 243, 874, 394, 396, 430, 482, 214, 619, 244, 646,
+ 524, 557, 399, 328, 172, 67, 304, 884, 620, 512, 594, 972, 535, 6, 698, 513, 159, 882, 750, 562,
+ 809, 764, 454, 366, 75, 506, 93, 786, 167, 831, 16, 382, 853, 638, 494, 452, 324, 72, 78, 83,
+ 52, 59, 112, 932, 10, 929, 342, 924, 730, 961, 680, 69, 287, 797, 961, 985, 92, 854, 626, 885,
+ 912, 600, 616, 389, 860, 232, 744, 793, 744, 179, 478, 773, 615, 689, 508, 775, 914, 494, 810, 139,
+ 288, 234, 974, 431, 129, 780, 581, 371, 548, 22, 868, 653, 981, 741, 270, 815, 623, 428, 653, 139,
+ 626, 603, 990, 315, 386, 344, 323, 889, 472, 317, 164, 260, 239, 861, 189, 377, 865, 511, 231, 304,
+ 356, 70, 152, 35, 825, 854, 328, 576, 390, 490, 848, 326, 38, 303, 402, 431, 616, 813, 546, 708,
+ 206, 388, 2, 962, 783, 967, 890, 442, 815, 49, 831, 831, 665, 251, 410, 321, 94, 741, 246, 179,
+ 422, 176, 211, 117, 675, 523, 9, 764, 374, 952, 426, 704, 64, 531, 53, 804, 758, 23, 811, 611,
+ 500, 846, 437, 375, 335, 854, 328, 971, 237, 24, 415, 639, 468, 318, 684, 723, 565, 662, 305, 647,
+ 449, 281, 597, 158, 136, 294, 882, 885, 383, 734, 938, 866, 268, 471, 115, 296, 908, 673, 50, 472,
+ 952, 439, 366, 5, 397, 155, 257, 506, 231, 948, 667, 600, 35, 445, 990, 222, 443, 784, 213, 349,
+ 389, 943, 13, 150, 621, 366, 52, 444, 612, 604, 934, 720, 953, 340, 828, 972, 462, 911, 621, 321,
+ 812, 435, 522, 50, 672, 78, 57, 761, 313, 950, 352, 238, 55, 27, 972, 226, 753, 201, 416, 176,
+ 879, 877, 864, 450, 572, 879, 163, 99, 721, 143, 12, 31, 643, 812, 507, 771, 968, 527, 781, 488,
+ 840, 797, 242, 194, 630, 293, 810, 966, 795, 276, 435, 345, 885, 413, 599, 197, 696, 386, 643, 116,
+ 93, 322, 710, 680, 785, 538, 112, 553, 581, 960, 12, 874, 923, 48, 615, 506, 652, 898, 359, 539,
+ 261, 495, 233, 764, 609, 805, 686, 286, 539, 432, 118, 836, 560, 192, 739, 825, 20, 778, 317, 586,
+ 976, 359, 573, 352, 386, 746, 772, 11, 663, 749, 504, 5, 212, 408, 888, 643, 907, 441, 420, 368,
+ 737, 97, 516, 169, 25, 359, 219, 527, 797, 672, 716, 69, 452, 880, 692, 298, 683, 300, 459, 327,
+ 815, 923, 323, 829, 612, 816, 247, 497, 116, 243, 352, 981, 281, 917, 738, 713, 290, 653, 909, 503,
+ 645, 406, 625, 543, 932, 108, 220, 304, 685, 464, 373, 954, 876, 86, 646, 802, 412, 446, 955, 28,
+ 664, 539, 850, 655, 783, 28, 392, 470, 707, 735, 422, 941, 523, 610, 682, 451, 37, 672, 156, 237,
+ 43, 766, 767, 713, 124, 409, 549, 869, 814, 186, 251, 475, 214, 568, 212, 44, 572, 997, 898, 139,
+ 956, 456, 608, 470, 651, 566, 434, 408, 906, 756, 970, 573, 640, 877, 687, 24, 642, 506, 265, 368,
+ 271, 399, 972, 950, 814, 109, 824, 595, 121, 856, 465, 516, 468, 473, 631, 793, 281, 736, 416, 708,
+ 315, 978, 235, 530, 626, 419, 296, 548, 502, 854, 28, 184, 668, 786, 326, 228, 578, 738, 881, 265,
+ 304, 808, 415, 490, 0, 623, 199, 483, 934, 105, 212, 545, 535, 154, 40, 473, 528, 712, 835, 668,
+ 349, 235, 338, 307, 230, 334, 872, 522, 374, 225, 143, 746, 996, 144, 385, 136, 848, 545, 487, 434,
+ 587, 837, 8, 456, 487, 434, 729, 114, 944, 971, 688, 316, 871, 667, 156, 304, 624, 813, 269, 729,
+ 47, 538, 250, 756, 491, 838, 882, 404, 213, 56, 231, 471, 326, 758, 132, 493, 644, 327, 421, 992,
+ 327, 435, 57, 651, 676, 352, 519, 199, 776, 354, 235, 648, 647, 3, 95, 842, 260, 345, 713, 912,
+ 198, 781, 493, 632, 943, 142, 86, 615, 222, 95, 843, 743, 337, 942, 752, 87, 53, 121, 86, 263,
+ 889, 580, 269, 666, 187, 68, 731, 230, 538, 72, 759, 330, 961, 547, 606, 593, 10, 320, 560, 798,
+ 122, 32, 957, 646, 288, 450, 604, 161, 128, 880, 109, 220, 175, 818, 590, 425, 413, 217, 346, 205,
+ 249, 63, 635, 858, 514, 14, 799, 766, 882, 610, 939, 375, 157, 120, 886, 963, 172, 983, 974, 755,
+ 922, 571, 323, 352, 783, 866, 832, 955, 100, 492, 772, 530, 751, 361, 696, 321, 650, 69, 986, 552,
+ 192, 55, 798, 91, 39, 563, 654, 564, 761, 544, 892, 167, 801, 122, 277, 25, 451, 829, 967, 781,
+ 361, 168, 64, 397, 928, 563, 914, 336, 536, 478, 243, 257, 264, 477, 879, 390, 640, 701, 208, 328,
+ 302, 443, 295, 521, 813, 914, 573, 118, 345, 525, 964, 508, 482, 30, 606, 416, 101, 71, 121, 92,
+ 435, 284, 453, 161, 20, 361, 70, 414, 23, 804, 255, 839, 276, 586, 890, 36, 427, 246, 542, 865,
+ 622, 953, 699, 366, 773, 803, 296, 133, 277, 529, 104, 229, 80, 462, 632, 260, 815, 37, 851, 237,
+ 732, 243, 393, 866, 760, 196, 126, 631, 168, 301, 843, 613, 189, 333, 589, 247, 936, 197, 256, 594,
+ 232, 956, 75, 306, 190, 329, 424, 153, 751, 690, 757, 805, 876, 539, 48, 122, 857, 473, 770, 388,
+ 638, 125, 488, 973, 176, 203, 474, 693, 461, 82, 606, 432, 923, 70, 0, 371, 632, 206, 280, 604,
+ 928, 686, 300, 120, 451, 795, 703, 810, 711, 708, 620, 357, 443, 98, 789, 903, 611, 93, 231, 376,
+ 530, 299, 791, 1, 732, 298, 289, 131, 726, 834, 806, 249, 172, 709, 898, 123, 456, 5, 942, 462,
+ 607, 322, 801, 208, 503, 421, 741, 183, 806, 258, 633, 533, 950, 594, 948, 31, 40, 984, 353, 213,
+ 195, 50, 794, 978, 700, 217, 287, 821, 267, 734, 774, 554, 650, 361, 199, 236, 263, 99, 316, 810,
+ 946, 984, 940, 891, 603, 180, 834, 333, 639, 286, 522, 33, 256, 202, 418, 467, 266, 716, 918, 126,
+ 786, 695, 782, 408, 529, 921, 494, 207, 301, 925, 195, 804, 391, 951, 730, 552, 912, 432, 798, 33,
+ 472, 262, 826, 748, 367, 835, 115, 373, 233, 351, 850, 910, 854, 688, 551, 883, 857, 24, 314, 555,
+ 822, 986, 422, 917, 175, 172, 470, 354, 830, 208, 311, 834, 206, 653, 144, 823, 106, 126, 638, 689,
+ 134, 307, 623, 804, 439, 423, 913, 349, 602, 424, 996, 430, 555, 144, 481, 756, 226, 990, 325, 207,
+ 851, 302, 535, 825, 134, 849, 204, 683, 695, 556, 791, 763, 169, 533, 623, 194, 86, 724, 484, 440,
+ 92, 870, 471, 86, 538, 47, 303, 819, 777, 652, 702, 900, 530, 522, 459, 321, 913, 559, 963, 963,
+ 685, 369, 327, 470, 164, 284, 437, 957, 148, 616, 2, 108, 106, 296, 743, 121, 304, 131, 694, 935,
+ 503, 937, 40, 883, 39, 899, 70, 229, 637, 654, 843, 866, 259, 252, 531, 52, 492, 969, 693, 419,
+ 278, 777, 970, 442, 546, 456, 503, 69, 955, 129, 697, 623, 842, 359, 325, 515, 223, 527, 84, 469,
+ 732, 724, 319, 104, 703, 789, 980, 109, 446, 830, 892, 23, 689, 884, 100, 790, 196, 509, 343, 828,
+ 637, 580, 367, 847, 48, 435, 860, 292, 696, 523, 724, 908, 191, 805, 392, 951, 510, 163, 975, 258,
+ 569, 922, 723, 232, 692, 328, 49, 654, 48, 35, 88, 450, 900, 854, 485, 700, 424, 515, 759, 543,
+ 441, 631, 57, 346, 637, 814, 405, 885, 632, 609, 147, 952, 446, 919, 371, 154, 995, 814, 965, 875,
+ 729, 993, 734, 767, 467, 163, 690, 480, 293, 685, 687, 104, 433, 942, 363, 28, 725, 163, 738, 330,
+ 370, 129, 741, 952, 444, 241, 309, 380, 279, 336, 337, 607, 503, 132, 517, 368, 882, 87, 539, 687,
+ 146, 233, 336, 457, 789, 246, 78, 192, 367, 73, 856, 990, 423, 945, 82, 967, 921, 980, 87, 553,
+ 534, 33, 628, 565, 342, 326, 572, 430, 563, 108, 990, 429, 517, 178, 139, 847, 928, 518, 770, 160,
+ 291, 75, 224, 297, 564, 234, 704, 948, 382, 163, 596, 163, 675, 420, 231, 70, 604, 366, 722, 886,
+ 746, 635, 819, 733, 59, 372, 722, 874, 256, 26, 677, 451, 440, 204, 585, 435, 474, 580, 667, 548,
+ 93, 813, 333, 49, 924, 508, 208, 373, 769, 682, 877, 448, 823, 47, 452, 274, 321, 665, 599, 49,
+ 866, 570, 286, 442, 690, 385, 101, 478, 215, 713, 539, 238, 659, 344, 146, 142, 454, 289, 340, 764,
+ 774, 518, 540, 977, 579, 222, 726, 7, 746, 637, 597, 827, 767, 358, 470, 55, 415, 509, 858, 120,
+ 845, 984, 564, 584, 58, 755, 967, 919, 814, 110, 977, 972, 423, 34, 933, 699, 810, 94, 87, 209,
+ 362, 393, 526, 620, 121, 994, 676, 983, 367, 698, 236, 500, 684, 97, 500, 185, 617, 155, 47, 89,
+ 618, 421, 185, 340, 374, 857, 236, 765, 860, 689, 694, 441, 685, 932, 582, 271, 4, 114, 660, 955,
+ 404, 270, 635, 630, 721, 596, 631, 769, 468, 95, 153, 983, 0, 408, 689, 292, 220, 586, 430, 669,
+ 524, 188, 965, 910, 334, 575, 996, 506, 189, 133, 273, 525, 542, 881, 75, 916, 663, 610, 461, 956,
+ 943, 219, 281, 195, 347, 995, 136, 589, 142, 708, 270, 3, 867, 468, 45, 742, 844, 963, 413, 860,
+ 451, 635, 798, 906, 837, 380, 148, 279, 133, 343, 579, 170, 439, 735, 342, 918, 795, 736, 133, 859,
+ 650, 486, 856, 63, 431, 677, 686, 670, 198, 123, 512, 572, 878, 888, 346, 340, 606, 826, 844, 375,
+ 510, 824, 201, 219, 227, 201, 338, 522, 997, 76, 609, 922, 904, 270, 326, 809, 328, 285, 83, 630,
+ 550, 92, 369, 957, 719, 980, 784, 494, 472, 231, 734, 408, 917, 415, 886, 36, 728, 116, 526, 844,
+ 659, 493, 959, 395, 112, 758, 154, 664, 744, 156, 99, 767, 668, 620, 51, 747, 239, 97, 737, 399,
+ 751, 458, 16, 47, 847, 557, 937, 72, 744, 848, 78, 706, 348, 33, 505, 83, 520, 695, 572, 661,
+ 322, 123, 447, 349, 584, 433, 951, 905, 97, 416, 123, 421, 659, 843, 923, 933, 938, 291, 961, 861,
+ 145, 367, 714, 153, 66, 697, 744, 657, 477, 511, 602, 445, 950, 553, 278, 96, 937, 555, 368, 415,
+ 748, 143, 741, 771, 862, 990, 8, 295, 396, 17, 119, 236, 508, 285, 844, 914, 97, 235, 906, 118,
+ 83, 405, 190, 618, 438, 438, 706, 413, 546, 214, 807, 540, 360, 162, 426, 42, 852, 258, 765, 147,
+ 550, 13, 547, 704, 227, 733, 678, 587, 623, 795, 309, 538, 920, 372, 971, 929, 590, 466, 749, 42,
+ 662, 794, 545, 57, 747, 828, 231, 287, 655, 443, 148, 600, 71, 209, 453, 494, 560, 542, 835, 46,
+ 608, 971, 13, 600, 370, 662, 139, 818, 174, 618, 209, 609, 457, 373, 907, 959, 833, 382, 175, 136,
+ 374, 157, 417, 761, 312, 710, 389, 746, 155, 238, 941, 567, 450, 717, 282, 408, 997, 194, 918, 799,
+ 282, 750, 960, 604, 194, 310, 798, 141, 124, 492, 40, 439, 62, 389, 878, 731, 318, 580, 199, 379,
+ 512, 359, 710, 188, 909, 639, 339, 96, 542, 393, 178, 204, 590, 696, 183, 247, 618, 413, 971, 539,
+ 702, 430, 715, 949, 425, 760, 971, 207, 956, 373, 144, 106, 921, 591, 16, 774, 796, 179, 924, 709,
+ 966, 993, 625, 757, 6, 357, 6, 778, 58, 162, 524, 265, 247, 375, 595, 545, 867, 973, 219, 170,
+ 709, 920, 700, 112, 344, 213, 455, 321, 939, 165, 157, 883, 99, 258, 140, 515, 217, 311, 84, 660,
+ 715, 504, 149, 198, 566, 341, 521, 474, 351, 951, 546, 183, 603, 876, 538, 901, 754, 363, 893, 973,
+ 913, 244, 192, 799, 362, 155, 702, 637, 628, 415, 599, 177, 686, 718, 604, 550, 153, 242, 790, 152,
+ 603, 168, 465, 779, 781, 511, 172, 789, 445, 618, 502, 270, 45, 696, 185, 927, 71, 970, 448, 519,
+ 201, 918, 190, 958, 174, 835, 941, 916, 255, 575, 693, 976, 150, 665, 612, 452, 227, 259, 784, 568,
+ 780, 395, 783, 102, 179, 124, 52, 52, 824, 868, 328, 763, 679, 574, 300, 905, 404, 139, 955, 280,
+ 976, 246, 122, 692, 679, 276, 158, 735, 126, 525, 736, 824, 910, 660, 87, 908, 725, 523, 532, 92,
+ 473, 876, 886, 500, 715, 258, 458, 28, 768, 219, 382, 504, 883, 10, 716, 783, 241, 519, 576, 892,
+ 372, 241, 239, 419, 944, 465, 105, 586, 466, 234, 54, 194, 173, 833, 649, 560, 386, 589, 983, 692,
+ 652, 101, 332, 790, 640, 50, 67, 397, 773, 700, 282, 691, 728, 675, 711, 631, 81, 788, 868, 618,
+ 635, 265, 892, 617, 11, 764, 624, 990, 609, 58, 615, 781, 480, 939, 461, 611, 163, 184, 465, 314,
+ 470, 698, 619, 789, 117, 3, 311, 456, 186, 203, 721, 932, 768, 502, 143, 904, 730, 201, 423, 417,
+ 947, 154, 568, 261, 473, 775, 380, 615, 786, 193, 710, 445, 469, 943, 729, 204, 564, 117, 142, 568,
+ 342, 854, 790, 984, 824, 297, 982, 834, 21, 944, 482, 759, 312, 2, 512, 659, 599, 860, 803, 4,
+ 961, 790, 458, 362, 380, 90, 771, 389, 291, 209, 630, 440, 845, 255, 435, 550, 71, 925, 733, 659,
+ 899, 770, 914, 791, 60, 993, 984, 955, 244, 55, 935, 877, 960, 708, 628, 374, 144, 871, 8, 407,
+ 438, 591, 590, 124, 164, 402, 195, 757, 242, 435, 238, 136, 675, 569, 455, 48, 984, 938, 717, 381,
+ 82, 776, 595, 69, 112, 421, 361, 626, 719, 664, 253, 694, 944, 281, 451, 196, 345, 699, 721, 829,
+ 469, 368, 20, 825, 986, 436, 40, 577, 702, 199, 403, 623, 655, 33, 577, 927, 48, 993, 19, 741,
+ 107, 221, 193, 932, 70, 832, 172, 355, 396, 210, 191, 54, 477, 861, 755, 198, 434, 199, 481, 52,
+ 928, 347, 371, 949, 162, 11, 757, 593, 473, 558, 744, 494, 204, 113, 53, 511, 56, 924, 319, 185,
+ 102, 712, 721, 475, 548, 626, 546, 4, 280, 884, 765, 709, 159, 811, 706, 732, 944, 730, 429, 237,
+ 956, 924, 75, 24, 985, 357, 143, 86, 440, 209, 838, 576, 813, 81, 262, 809, 761, 310, 483, 447,
+ 743, 631, 464, 658, 233, 43, 279, 893, 199, 274, 380, 771, 237, 815, 88, 75, 530, 729, 761, 746,
+ 506, 900, 978, 311, 694, 480, 480, 82, 997, 729, 26, 627, 370, 540, 750, 24, 300, 664, 212, 750,
+ 374, 72, 211, 540, 554, 230, 622, 780, 364, 284, 954, 266, 382, 630, 916, 299, 909, 877, 136, 485,
+ 213, 493, 665, 781, 985, 966, 542, 434, 679, 146, 265, 777, 792, 762, 390, 474, 492, 437, 32, 478,
+ 642, 543, 655, 959, 288, 51, 536, 986, 289, 368, 437, 964, 486, 494, 405, 802, 729, 759, 243, 372,
+ 110, 465, 647, 774, 967, 115, 543, 226, 850, 102, 997, 58, 669, 902, 668, 638, 418, 692, 895, 415,
+ 936, 819, 896, 21, 333, 786, 530, 542, 677, 931, 609, 855, 898, 288, 764, 948, 135, 515, 486, 769,
+ 29, 35, 888, 351, 238, 704, 30, 157, 975, 575, 868, 448, 303, 332, 162, 239, 786, 335, 184, 407,
+ 534, 282, 225, 979, 464, 137, 373, 402, 487, 526, 494, 979, 433, 71, 174, 48, 313, 521, 229, 63,
+ 851, 76, 459, 645, 206, 16, 349, 39, 754, 155, 240, 729, 923, 450, 88, 798, 770, 77, 680, 536,
+ 617, 10, 310, 682, 401, 584, 389, 657, 536, 118, 783, 839, 441, 550, 289, 317, 324, 585, 348, 148,
+ 142, 315, 981, 432, 743, 920, 810, 57, 160, 400, 855, 858, 667, 311, 385, 672, 150, 121, 145, 994,
+ 74, 611, 693, 257, 112, 201, 772, 218, 627, 263, 633, 298, 241, 336, 77, 473, 118, 463, 942, 271,
+ 78, 809, 475, 706, 686, 21, 872, 215, 237, 668, 696, 711, 287, 323, 246, 303, 815, 709, 453, 415,
+ 282, 513, 49, 643, 893, 455, 355, 578, 420, 514, 888, 656, 193, 615, 391, 375, 694, 789, 840, 506,
+ 48, 55, 554, 352, 739, 817, 688, 230, 341, 119, 24, 810, 503, 78, 90, 400, 927, 273, 886, 755,
+ 887, 4, 958, 400, 411, 429, 523, 161, 952, 720, 238, 616, 796, 969, 653, 456, 37, 635, 267, 184,
+ 710, 465, 522, 824, 865, 839, 168, 213, 350, 286, 862, 100, 309, 119, 18, 787, 285, 864, 81, 811,
+ 941, 823, 91, 402, 552, 121, 571, 188, 992, 218, 120, 945, 233, 670, 202, 740, 574, 992, 370, 739,
+ 825, 788, 773, 377, 300, 513, 258, 666, 319, 742, 708, 887, 545, 32, 441, 891, 781, 14, 293, 3,
+ 638, 522, 546, 257, 680, 182, 576, 207, 192, 39, 199, 960, 909, 659, 389, 900, 659, 456, 576, 772,
+ 665, 294, 54, 534, 944, 294, 522, 643, 906, 869, 30, 848, 548, 830, 128, 253, 130, 876, 141, 402,
+ 315, 91, 806, 711, 563, 523, 41, 181, 307, 418, 72, 389, 716, 878, 270, 163, 716, 227, 670, 575,
+ 395, 161, 589, 405, 15, 244, 219, 486, 937, 702, 271, 361, 724, 3, 214, 935, 431, 797, 704, 876,
+ 304, 609, 152, 862, 95, 694, 937, 543, 639, 832, 481, 768, 852, 282, 796, 856, 541, 374, 297, 54,
+ 359, 594, 798, 954, 473, 802, 21, 163, 388, 110, 382, 516, 452, 946, 757, 462, 533, 2, 908, 803,
+ 705, 786, 693, 744, 652, 850, 464, 698, 174, 728, 682, 319, 321, 122, 753, 40, 444, 955, 103, 709,
+ 858, 603, 287, 513, 981, 971, 192, 92, 149, 343, 587, 844, 839, 792, 324, 711, 568, 132, 411, 78,
+ 166, 277, 114, 728, 826, 413, 797, 260, 864, 937, 794, 100, 408, 609, 326, 963, 813, 203, 74, 341,
+ 618, 273, 126, 663, 833, 497, 531, 286, 939, 97, 42, 176, 468, 716, 689, 235, 512, 811, 819, 14,
+ 268, 621, 64, 210, 93, 213, 388, 727, 911, 438, 895, 393, 740, 89, 55, 81, 969, 481, 721, 190,
+ 848, 606, 960, 120, 560, 930, 674, 806, 852, 804, 212, 75, 422, 983, 176, 638, 94, 186, 927, 301,
+ 208, 486, 698, 274, 895, 63, 830, 388, 871, 806, 389, 413, 821, 227, 154, 926, 107, 134, 669, 545,
+ 497, 693, 327, 381, 713, 631, 341, 794, 110, 803, 351, 965, 620, 854, 361, 953, 902, 688, 814, 401,
+ 45, 638, 205, 354, 545, 173, 209, 993, 947, 209, 642, 892, 268, 524, 599, 482, 484, 637, 851, 211,
+ 25, 43, 709, 727, 642, 863, 0, 790, 765, 413, 181, 417, 639, 425, 829, 433, 106, 877, 94, 612,
+ 922, 735, 323, 440, 287, 766, 854, 138, 826, 199, 214, 583, 340, 650, 179, 543, 19, 715, 982, 828,
+ 816, 395, 237, 594, 903, 157, 974, 673, 248, 697, 980, 23, 23, 215, 460, 835, 755, 255, 289, 588,
+ 339, 604, 755, 21, 883, 601, 856, 328, 9, 991, 57, 437, 757, 747, 688, 231, 863, 177, 201, 761,
+ 148, 238, 623, 503, 382, 979, 445, 285, 878, 877, 618, 981, 339, 27, 237, 36, 282, 427, 348, 246,
+ 721, 106, 91, 801, 87, 795, 311, 459, 690, 69, 948, 78, 217, 814, 787, 994, 589, 299, 799, 155,
+ 433, 515, 918, 456, 24, 628, 935, 741, 705, 928, 658, 796, 41, 186, 928, 760, 434, 834, 563, 852,
+ 288, 105, 314, 193, 411, 540, 225, 759, 845, 172, 16, 170, 476, 747, 625, 386, 99, 478, 730, 782,
+ 380, 765, 881, 170, 628, 902, 854, 491, 274, 892, 617, 434, 583, 766, 61, 351, 572, 543, 708, 574,
+ 444, 314, 278, 710, 703, 799, 221, 292, 361, 791, 667, 478, 375, 423, 197, 405, 510, 743, 178, 543,
+ 546, 997, 316, 603, 24, 823, 369, 412, 280, 807, 607, 961, 86, 838, 528, 705, 951, 249, 91, 904,
+ 732, 984, 517, 701, 147, 62, 659, 817, 745, 218, 423, 717, 668, 448, 556, 470, 780, 485, 821, 773,
+ 726, 155, 521, 955, 524, 122, 411, 627, 341, 984, 58, 891, 259, 47, 818, 966, 372, 742, 295, 223,
+ 677, 515, 638, 293, 434, 583, 602, 97, 161, 118, 132, 764, 115, 842, 462, 896, 46, 368, 572, 76,
+ 566, 922, 96, 741, 563, 720, 912, 250, 531, 530, 993, 442, 263, 95, 319, 106, 321, 566, 816, 158,
+ 727, 26, 110, 11, 69, 295, 84, 773, 283, 357, 822, 469, 831, 974, 709, 318, 252, 12, 462, 28,
+ 771, 982, 706, 588, 990, 723, 437, 970, 679, 663, 324, 496, 622, 799, 361, 273, 566, 471, 467, 586,
+ 853, 891, 669, 329, 928, 762, 500, 560, 784, 507, 964, 40, 541, 508, 440, 644, 877, 454, 91, 951,
+ 323, 530, 100, 106, 600, 734, 231, 257, 897, 348, 956, 258, 338, 431, 703, 659, 963, 602, 404, 851,
+ 295, 9, 743, 274, 487, 113, 556, 823, 42, 40, 265, 982, 13, 5, 978, 10, 269, 808, 484, 900,
+ 131, 41, 542, 570, 85, 418, 356, 929, 220, 229, 103, 549, 874, 988, 942, 672, 122, 16, 866, 214,
+ 370, 294, 202, 330, 331, 893, 96, 562, 36, 732, 218, 625, 609, 54, 293, 643, 351, 795, 517, 153,
+ 673, 779, 114, 169, 809, 354, 991, 62, 769, 653, 36, 210, 756, 896, 894, 412, 462, 278, 254, 646,
+ 261, 564, 524, 71, 960, 156, 351, 441, 273, 216, 514, 557, 650, 532, 54, 734, 271, 38, 76, 809,
+ 269, 555, 774, 227, 429, 132, 179, 455, 349, 810, 706, 295, 118, 389, 380, 792, 130, 383, 960, 822,
+ 170, 445, 958, 363, 129, 894, 582, 785, 973, 895, 83, 695, 954, 604, 344, 205, 855, 70, 954, 506,
+ 761, 521, 881, 214, 659, 569, 280, 435, 927, 676, 62, 621, 677, 450, 954, 151, 183, 152, 514, 543,
+ 281, 427, 544, 511, 406, 173, 858, 389, 729, 700, 7, 290, 751, 627, 517, 715, 599, 54, 108, 885,
+ 602, 646, 926, 259, 216, 683, 166, 332, 77, 462, 615, 744, 271, 807, 61, 882, 461, 633, 881, 910,
+ 546, 491, 948, 411, 0, 847, 733, 570, 286, 263, 746, 885, 927, 959, 347, 401, 291, 62, 253, 210,
+ 495, 612, 567, 620, 259, 741, 717, 809, 7, 760, 832, 631, 251, 899, 773, 409, 566, 717, 522, 255,
+ 395, 31, 922, 628, 315, 868, 882, 140, 121, 126, 171, 151, 428, 24, 614, 554, 279, 628, 992, 436,
+ 34, 497, 689, 796, 477, 323, 524, 156, 525, 412, 169, 126, 826, 122, 795, 822, 441, 354, 640, 218,
+ 104, 905, 828, 340, 193, 509, 381, 884, 21, 544, 642, 537, 463, 613, 491, 954, 860, 986, 568, 105,
+ 3, 569, 96, 989, 304, 806, 780, 729, 895, 406, 129, 784, 612, 961, 614, 640, 104, 294, 366, 377,
+ 719, 548, 89, 231, 244, 729, 144, 669, 938, 279, 995, 888, 102, 622, 635, 593, 188, 13, 106, 674,
+ 348, 937, 642, 188, 619, 132, 282, 52, 283, 779, 618, 850, 513, 790, 783, 412, 213, 235, 28, 521,
+ 133, 25, 623, 755, 228, 125, 221, 518, 993, 529, 621, 527, 736, 813, 705, 302, 658, 460, 701, 264,
+ 122, 566, 76, 469, 746, 952, 67, 407, 236, 568, 900, 887, 310, 198, 115, 365, 306, 597, 517, 988,
+ 110, 795, 331, 660, 977, 520, 72, 888, 613, 821, 972, 807, 880, 231, 97, 187, 735, 493, 13, 358,
+ 108, 392, 605, 7, 428, 580, 712, 425, 395, 361, 958, 88, 235, 735, 174, 876, 685, 961, 764, 497,
+ 845, 734, 406, 307, 939, 355, 653, 863, 492, 213, 762, 821, 725, 136, 82, 836, 761, 860, 87, 677,
+ 188, 885, 233, 883, 13, 177, 534, 809, 427, 878, 675, 394, 146, 868, 856, 323, 184, 312, 704, 530,
+ 903, 639, 848, 94, 35, 422, 170, 188, 214, 669, 794, 731, 922, 134, 172, 968, 378, 326, 4, 297,
+ 977, 406, 208, 32, 25, 742, 934, 300, 45, 300, 250, 317, 863, 722, 998, 756, 241, 871, 724, 648,
+ 205, 64, 848, 246, 169, 418, 584, 903, 109, 811, 862, 227, 116, 252, 479, 552, 828, 114, 568, 109,
+ 680, 140, 554, 549, 873, 352, 943, 951, 791, 786, 521, 790, 646, 949, 908, 956, 24, 258, 500, 80,
+ 87, 796, 817, 357, 421, 8, 564, 825, 194, 554, 433, 687, 796, 314, 46, 492, 583, 189, 694, 869,
+ 628, 213, 469, 166, 493, 941, 580, 52, 196, 731, 355, 481, 761, 653, 470, 607, 599, 88, 296, 521,
+ 332, 729, 749, 275, 621, 772, 400, 261, 807, 309, 826, 965, 208, 880, 625, 582, 387, 173, 324, 400,
+ 483, 849, 584, 867, 323, 711, 17, 323, 829, 797, 117, 718, 641, 855, 938, 751, 516, 981, 285, 397,
+ 483, 175, 234, 400, 793, 523, 503, 169, 869, 536, 485, 120, 148, 418, 160, 857, 85, 562, 701, 9,
+ 623, 31, 477, 548, 155, 854, 640, 571, 733, 734, 297, 589, 95, 406, 888, 196, 515, 82, 188, 722,
+ 686, 876, 930, 998, 685, 911, 538, 430, 569, 437, 493, 44, 710, 95, 288, 375, 325, 704, 598, 790,
+ 824, 210, 561, 76, 51, 886, 77, 623, 700, 275, 752, 841, 670, 618, 801, 259, 486, 847, 544, 331,
+ 804, 152, 512, 859, 437, 169, 920, 6, 628, 474, 905, 695, 184, 789, 511, 183, 520, 670, 626, 307,
+ 971, 63, 468, 348, 704, 334, 883, 178, 892, 168, 673, 891, 322, 113, 686, 97, 195, 880, 264, 443,
+ 517, 549, 116, 532, 240, 127, 352, 545, 222, 216, 625, 553, 617, 479, 326, 489, 272, 760, 80, 45,
+ 156, 123, 328, 759, 366, 894, 151, 233, 353, 526, 324, 669, 186, 557, 718, 829, 797, 968, 682, 473,
+ 680, 430, 126, 401, 730, 345, 347, 427, 86, 747, 505, 970, 776, 155, 471, 32, 810, 880, 882, 181,
+ 226, 407, 879, 961, 689, 476, 469, 816, 13, 233, 810, 984, 425, 29, 338, 897, 616, 366, 205, 513,
+ 296, 656, 697, 53, 746, 295, 211, 311, 284, 474, 81, 362, 553, 804, 688, 253, 873, 438, 97, 446,
+ 523, 839, 234, 995, 659, 722, 808, 94, 968, 101, 643, 848, 786, 694, 426, 371, 190, 554, 809, 158,
+ 990, 367, 769, 752, 993, 75, 743, 16, 651, 726, 861, 509, 217, 796, 797, 173, 874, 704, 93, 263,
+ 318, 317, 190, 627, 52, 692, 634, 348, 886, 823, 616, 466, 756, 387, 161, 401, 153, 379, 77, 191,
+ 110, 454, 485, 352, 149, 36, 33, 945, 937, 965, 413, 843, 249, 215, 682, 767, 150, 825, 978, 946,
+ 203, 780, 433, 236, 766, 403, 234, 920, 616, 542, 621, 645, 937, 450, 934, 683, 97, 507, 166, 177,
+ 115, 926, 802, 604, 887, 43, 87, 327, 244, 771, 491, 219, 903, 290, 792, 267, 517, 798, 70, 450
+};
+
diff --git a/benchmarks/mt-memcpy/memcpy_gendata.pl b/benchmarks/mt-memcpy/memcpy_gendata.pl
new file mode 100755
index 0000000..4efc145
--- /dev/null
+++ b/benchmarks/mt-memcpy/memcpy_gendata.pl
@@ -0,0 +1,132 @@
+#!/usr/bin/perl -w
+#==========================================================================
+# vvadd_gendata.pl
+#
+# Author : Christopher Batten (cbatten@mit.edu)
+# Date : April 29, 2005
+#
+(our $usageMsg = <<'ENDMSG') =~ s/^\#//gm;
+#
+# Simple script which creates an input data set and the reference data
+# for the vvadd benchmark.
+#
+ENDMSG
+
+use strict "vars";
+use warnings;
+no warnings("once");
+use Getopt::Long;
+
+#--------------------------------------------------------------------------
+# Command line processing
+#--------------------------------------------------------------------------
+
+our %opts;
+
+sub usage()
+{
+
+ print "\n";
+ print " Usage: memcpy_gendata.pl [options] \n";
+ print "\n";
+ print " Options:\n";
+ print " --help print this message\n";
+ print " --size size of input data [1000]\n";
+ print " --seed random seed [1]\n";
+ print "$usageMsg";
+
+ exit();
+}
+
+sub processCommandLine()
+{
+
+ $opts{"help"} = 0;
+ $opts{"size"} = 1000;
+ $opts{"seed"} = 1;
+ Getopt::Long::GetOptions( \%opts, 'help|?', 'size:i', 'seed:i' ) or usage();
+ $opts{"help"} and usage();
+
+}
+
+#--------------------------------------------------------------------------
+# Helper Functions
+#--------------------------------------------------------------------------
+
+sub printArray
+{
+ my $arrayName = $_[0];
+ my $arrayRef = $_[1];
+
+ my $numCols = 20;
+ my $arrayLen = scalar(@{$arrayRef});
+
+ print "int ".$arrayName."[DATA_SIZE] = \n";
+ print "{\n";
+
+ if ( $arrayLen <= $numCols ) {
+ print " ";
+ for ( my $i = 0; $i < $arrayLen; $i++ ) {
+ print sprintf("%3d",$arrayRef->[$i]);
+ if ( $i != $arrayLen-1 ) {
+ print ", ";
+ }
+ }
+ print "\n";
+ }
+
+ else {
+ my $numRows = int($arrayLen/$numCols);
+ for ( my $j = 0; $j < $numRows; $j++ ) {
+ print " ";
+ for ( my $i = 0; $i < $numCols; $i++ ) {
+ my $index = $j*$numCols + $i;
+ print sprintf("%3d",$arrayRef->[$index]);
+ if ( $index != $arrayLen-1 ) {
+ print ", ";
+ }
+ }
+ print "\n";
+ }
+
+ if ( $arrayLen > ($numRows*$numCols) ) {
+ print " ";
+ for ( my $i = 0; $i < ($arrayLen-($numRows*$numCols)); $i++ ) {
+ my $index = $numCols*$numRows + $i;
+ print sprintf("%3d",$arrayRef->[$index]);
+ if ( $index != $arrayLen-1 ) {
+ print ", ";
+ }
+ }
+ print "\n";
+ }
+
+ }
+
+ print "};\n\n";
+}
+
+#--------------------------------------------------------------------------
+# Main
+#--------------------------------------------------------------------------
+
+sub main()
+{
+
+ processCommandLine();
+ srand($opts{"seed"});
+
+ my @values;
+ for ( my $i = 0; $i < $opts{"size"}; $i++ ) {
+ my $value = int(rand(999));
+ push( @values, $value );
+ }
+
+
+ print "\n\#define DATA_SIZE ".$opts{"size"}." \n\n";
+ printArray( "input_data", \@values );
+
+}
+
+main();
+
diff --git a/benchmarks/mt-memcpy/mt-memcpy.c b/benchmarks/mt-memcpy/mt-memcpy.c
new file mode 100644
index 0000000..404d0bf
--- /dev/null
+++ b/benchmarks/mt-memcpy/mt-memcpy.c
@@ -0,0 +1,68 @@
+// See LICENSE for license details.
+
+//**************************************************************************
+// Memcpy benchmark
+//--------------------------------------------------------------------------
+// Author : Jerry Zhao
+// TA :
+// Student :
+//
+// This benchmark tests the memcpy implementation in syscalls.c.
+// The input data (and reference data) should be generated using
+// the memcpy_gendata.pl perl script and dumped to a file named
+// dataset1.h.
+
+
+//--------------------------------------------------------------------------
+// Includes
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+
+//--------------------------------------------------------------------------
+// Input/Reference Data
+
+#include "dataset1.h"
+
+
+//--------------------------------------------------------------------------
+// Basic Utilities and Multi-thread Support
+
+#include "util.h"
+
+
+
+//--------------------------------------------------------------------------
+// Main
+//
+// all threads start executing thread_entry(). Use their "coreid" to
+// differentiate between threads (each thread is running on a separate core).
+
+void thread_entry(int cid, int nc)
+{
+ // static allocates data in the binary, which is visible to both threads
+ static int results_data[DATA_SIZE];
+
+ size_t block = (DATA_SIZE / nc) + 1;
+ size_t n = (nc == cid + 1) ? DATA_SIZE - cid * block : block;
+
+
+ // First do out-of-place vvadd
+#if PREALLOCATE
+ barrier(nc);
+ memcpy(results_data + block * cid, input_data + block * cid, sizeof(int) * n);
+#endif
+
+ barrier(nc);
+ stats(memcpy(results_data + block * cid, input_data + block * cid, sizeof(int) * n); barrier(nc), DATA_SIZE);
+ /* barrier(nc); */
+ /* if(cid == 0) { */
+ /* int res = verify(DATA_SIZE, results_data, input_data); */
+ /* if(res) exit(res); */
+ /* } */
+
+ barrier(nc);
+ exit(0);
+}