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