annotate contrib/bench-stringop @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 #!/bin/bash
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 # Script to measure memset and memcpy for different sizes and strategies.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 # Contributed by Jan Hubicka <jh@suse.cz>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 # Copyright (C) 2019 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 # This file is part of GCC.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 # GCC is free software; you can redistribute it and/or modify
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 # it under the terms of the GNU General Public License as published by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 # the Free Software Foundation; either version 3, or (at your option)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 # any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 # GCC is distributed in the hope that it will be useful,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 # GNU General Public License for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 # You should have received a copy of the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 # along with GCC; see the file COPYING. If not, write to
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 # the Free Software Foundation, 51 Franklin Street, Fifth Floor,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 # Boston, MA 02110-1301, USA.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 # This script will search a line starting with 'spawn' that includes the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 # pattern you are looking for (typically a source file name).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 # Once it finds that pattern, it re-executes the whole command
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 # in the spawn line. If the pattern matches more than one spawn
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 # command, it asks which one you want.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 test()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 rm -f a.out
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 cat <<END | $1 -x c -O3 $3 -DAVG_SIZE=$2 $STRINGOP -DMEMORY_COPIES=$memsize -
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 #define BUFFER_SIZE (16*1024*1024 + AVG_SIZE*2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 /*#define MEMORY_COPIES (1024*1024*64*(long long)10)*/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 $type t[BUFFER_SIZE];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 int main()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 unsigned int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 for (i=0;i<((long long)MEMORY_COPIES + AVG_SIZE * 2 - 1)/AVG_SIZE*2;i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 #ifdef test_memset
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 __builtin_memset (t+(i*1024*1024+i*1)%(BUFFER_SIZE - AVG_SIZE*2), i, (AVG_SIZE + i) % (AVG_SIZE * 2 + 0));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 __builtin_memcpy (t+(i*1024*1024+i*1)%(BUFFER_SIZE - AVG_SIZE*2), t+((i+1)*1024*1024*4+i*1)%(BUFFER_SIZE - AVG_SIZE *2), (AVG_SIZE + i) % (AVG_SIZE * 2 + 0));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 END
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 TIME=`/usr/bin/time -f "%E" ./a.out 2>&1`
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 echo -n " "$TIME
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 echo $TIME $4 >>/tmp/accum
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 test2()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 rm -f a.out
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 cat <<END | clang -x c -O3 $3 -DAVG_SIZE=$2 $STRINGOP -DMEMORY_COPIES=$memsize 2>/dev/null -
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 #define BUFFER_SIZE (16*1024*1024 + AVG_SIZE*2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 /*#define MEMORY_COPIES (1024*1024*64*(long long)10)*/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 $type t[BUFFER_SIZE];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 int main()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 unsigned int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 for (i=0;i<((long long)MEMORY_COPIES + AVG_SIZE * 2 - 1)/AVG_SIZE*2;i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 #ifdef test_memset
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 __builtin_memset (t+(i*1024*1024+i*1)%(BUFFER_SIZE - AVG_SIZE*2), i, (AVG_SIZE + i) % (AVG_SIZE * 2 + 0));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 __builtin_memcpy (t+(i*1024*1024+i*1)%(BUFFER_SIZE - AVG_SIZE*2), t+((i+1)*1024*1024*4+i*1)%(BUFFER_SIZE - AVG_SIZE *2), (AVG_SIZE + i) % (AVG_SIZE * 2 + 0));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 END
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 TIME=`/usr/bin/time -f "%E" ./a.out 2>&1`
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 echo -n " "$TIME
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 echo $TIME $4 >>/tmp/accum
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 testrow()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 echo -n "" >/tmp/accum
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 printf "%12i " $3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 test "$2" "$3" "-mstringop-strategy=libcall" libcall
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 test "$2" "$3" "-mstringop-strategy=rep_byte -malign-stringops" rep1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 test "$2" "$3" "-mstringop-strategy=rep_byte -mno-align-stringops" rep1noalign
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 test "$2" "$3" "-mstringop-strategy=rep_4byte -malign-stringops" rep4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 test "$2" "$3" "-mstringop-strategy=rep_4byte -mno-align-stringops" rep4noalign
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 if [ "$mode" == 64 ]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 test "$2" "$3" "-mstringop-strategy=rep_8byte -malign-stringops" rep8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 test "$2" "$3" "-mstringop-strategy=rep_8byte -mno-align-stringops" rep8noalign
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 fi
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 test "$2" "$3" "-mstringop-strategy=loop -malign-stringops" loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 test "$2" "$3" "-mstringop-strategy=loop -mno-align-stringops" loopnoalign
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 test "$2" "$3" "-mstringop-strategy=unrolled_loop -malign-stringops" unrl
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 test "$2" "$3" "-mstringop-strategy=unrolled_loop -mno-align-stringops" unrlnoalign
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 test "$2" "$3" "-mstringop-strategy=vector_loop -malign-stringops" sse
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 test "$2" "$3" "-mstringop-strategy=vector_loop -mno-align-stringops -msse2" ssenoalign
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 #test2 "$2" "$3" ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 test "$2" "$3" "-mstringop-strategy=byte_loop" byte
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 best=`cat /tmp/accum | sort | head -1`
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 test "$2" "$3" " -fprofile-generate" >/dev/null 2>&1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 test "$2" "$3" " -fprofile-use"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 test "$2" "$3" " -minline-stringops-dynamically"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 echo " $best"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 test_all_sizes()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 if [ "$mode" == 64 ]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 echo " block size libcall rep1 noalg rep4 noalg rep8 noalg loop noalg unrl noalg sse noalg byte PGO dynamic BEST"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 echo " block size libcall rep1 noalg rep4 noalg loop noalg unrl noalg sse noalg byte PGO dynamic BEST"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 fi
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 #for size in 1 2 3 4 6 8 10 12 14 16 24 32 48 64 128 256 512 1024 4096 8192 81920 819200 8192000
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 #for size in 8192000 819200 81920 8192 4096 2048 1024 512 256 128 64 48 32 24 16 14 12 10 8 6 5 4 3 2 1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 for size in 8192000 819200 81920 20480 8192 4096 2048 1024 512 256 128 64 48 32 24 16 14 12 10 8 6 4 1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 #for size in 128 256 1024 4096 8192 81920 819200
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 do
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 testrow "$1" "$2" $size
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 done
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 mode=$1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 shift
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 export memsize=$1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 shift
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 cmdline=$*
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 if [ "$mode" != 32 ]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 if [ "$mode" != 64 ]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 echo "Usage:"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 echo "test_stringop mode size cmdline"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 echo "mode is either 32 or 64"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 echo "size is amount of memory copied in each test. Should be chosed small enough so runtime is less than minute for each test and sorting works"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 echo "Example: test_stringop 32 640000000 ./xgcc -B ./ -march=pentium3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 exit
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 fi
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 fi
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 echo "memcpy"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 export STRINGOP=""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 type=char
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 test_all_sizes $mode "$cmdline -m$mode"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 echo "Aligned"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 type=long
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 test_all_sizes $mode "$cmdline -m$mode"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 echo "memset"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 export STRINGOP="-Dtest_memset=1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 type=char
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 test_all_sizes $mode "$cmdline -m$mode"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 echo "Aligned"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 type=long
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 test_all_sizes $mode "$cmdline -m$mode"