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