1 | # Usage
|
---|
2 | # $cfabuild/driver/cfa -nodebug -quiet -c -x c /dev/null && rm null.o || echo Need to fix \$cfabuild
|
---|
3 | # make CFABUILD=$cfabuild -j8 # compile
|
---|
4 | # make measurement CFA_APILEVELS=ll OPERATIONS='pta peq pbv' CORPORI='corpus-100-*-1.txt corpus-1-*-1.txt' # append-pbv
|
---|
5 | # make measurement2 CFA_APILEVELS=ll OPERATIONS='pall' PLATFORMS=cfa CFA_SHARINGS=share CORPORI='corpus-1-*-1.txt' # allocate-speed-cfa
|
---|
6 | # make measurement2 CFA_APILEVELS=ll OPERATIONS='pall' PLATFORMS=stl CFA_EXPANSIONS=-1.0 CORPORI='corpus-1-*-1.txt' # allocate-speed-stl
|
---|
7 | # make measurement3 CFA_APILEVELS=ll OPERATIONS='pall' PLATFORMS=cfa CFA_SHARINGS=share CORPORI='corpus-1-*-1.txt' # allocate-space-cfa
|
---|
8 | # make measurement3 CFA_APILEVELS=ll OPERATIONS='pall' PLATFORMS=stl CFA_EXPANSIONS=-1.0 CORPORI='corpus-1-*-1.txt' # allocate-space-stl
|
---|
9 | # make measurement4 CFA_APILEVELS=ll OPERATIONS='pall' PLATFORMS=cfa CFA_EXPANSIONS=0.2 CFA_SHARINGS=share CORPORI='corpus-1-*-1.txt' # allocate-attrib-cfa
|
---|
10 | # make measurement4 CFA_APILEVELS=ll OPERATIONS='pall' PLATFORMS=stl CFA_EXPANSIONS=-1.0 CORPORI='corpus-1-*-1.txt' # allocate-attrib-stl
|
---|
11 |
|
---|
12 | CFABUILD = ~/cfa2/build-perf
|
---|
13 | LIBCFA = $(CFABUILD)/libcfa/*/src/.libs/libcfa.so
|
---|
14 |
|
---|
15 | CFA = $(CFABUILD)/driver/cfa
|
---|
16 | PERFFLAGS_CFA = -nodebug -O2
|
---|
17 | PERFFLAGS_CXX = -DNDEBUG -O2 -Wl,--no-as-needed -ldl
|
---|
18 |
|
---|
19 |
|
---|
20 | # function: convert to upper case
|
---|
21 | define uc
|
---|
22 | $(shell echo $(1) | tr '[:lower:]' '[:upper:]')
|
---|
23 | endef
|
---|
24 |
|
---|
25 | # function: project numbered element of filename named by hyphen-delimited tuple
|
---|
26 | # (call hyphProj,q-w-e-r.txt,1) is Q
|
---|
27 | define ucHyphProj
|
---|
28 | $(call uc,$(word $(2),$(subst -, ,$(basename $(1)))))
|
---|
29 | endef
|
---|
30 |
|
---|
31 | # function: cross two lists, adding hyphen delimiters
|
---|
32 | # (call hyphCross,a b c,1 2) is a-1 a-2 b-1 b-2 c-1 c-2
|
---|
33 | define hyphCross
|
---|
34 | $(foreach x,$(1),$(foreach xs,$(2),$(x)-$(xs)))
|
---|
35 | endef
|
---|
36 |
|
---|
37 | define hyphCross3
|
---|
38 | $(call hyphCross,$(1),$(call hyphCross,$(2),$(3)))
|
---|
39 | endef
|
---|
40 |
|
---|
41 | define hyphCross4
|
---|
42 | $(call hyphCross,$(1),$(call hyphCross3,$(2),$(3),$(4)))
|
---|
43 | endef
|
---|
44 |
|
---|
45 | define hyphCross5
|
---|
46 | $(call hyphCross,$(1),$(call hyphCross4,$(2),$(3),$(4),$(5)))
|
---|
47 | endef
|
---|
48 |
|
---|
49 | OPERATIONS=pta peq pbv pall #pno
|
---|
50 | ALLOCS=reuse fresh
|
---|
51 | CFA_APILEVELS=hl ll
|
---|
52 | CFA_SHARINGS=share noshare
|
---|
53 | PLATFORMS=cfa stl #buhr94
|
---|
54 |
|
---|
55 | ifneq ($(filter cfa,$(PLATFORMS)),)
|
---|
56 | CFA_APIS=$(call hyphCross,$(CFA_APILEVELS),$(CFA_SHARINGS))
|
---|
57 | endif
|
---|
58 |
|
---|
59 | ifneq ($(filter stl,$(PLATFORMS)),)
|
---|
60 | STL_APIS=na-na
|
---|
61 | endif
|
---|
62 |
|
---|
63 | ifneq ($(filter buhr94,$(PLATFORMS)),)
|
---|
64 | BUHR94_APIS=na-na
|
---|
65 | endif
|
---|
66 |
|
---|
67 | APIS = $(CFA_APIS) $(STL_APIS) $(BUHR94_APIS)
|
---|
68 |
|
---|
69 | OPERATIONS_USING_ALLOCS=pta peq
|
---|
70 | define enrichOperationsAllocs
|
---|
71 | $(call hyphCross3,$(filter peq pta,$(OPERATIONS)),$(1),$(ALLOCS)) $(call hyphCross3,$(filter-out peq pta,$(OPERATIONS)),$(1),na)
|
---|
72 | endef
|
---|
73 |
|
---|
74 | CFA_PERFPROGS=$(call hyphCross,perfexp-cfa,$(call enrichOperationsAllocs,$(CFA_APIS)))
|
---|
75 | STL_PERFPROGS=$(call hyphCross,perfexp-stl,$(call enrichOperationsAllocs,$(STL_APIS)))
|
---|
76 | BUHR94_PERFPROGS=$(call hyphCross,perfexp-buhr94,$(call enrichOperationsAllocs,$(BUHR94_APIS)))
|
---|
77 |
|
---|
78 | PERFPROGS = $(CFA_PERFPROGS) $(STL_PERFPROGS) $(BUHR94_PERFPROGS)
|
---|
79 |
|
---|
80 | all : $(PERFPROGS)
|
---|
81 |
|
---|
82 | PP_SPLIT := $(shell echo "${PERFPROGS}" | sed -e 's/ /\\n/g')
|
---|
83 | echoPerfProgs:
|
---|
84 | echo -e '$(PP_SPLIT)'
|
---|
85 |
|
---|
86 | perfexp-%.o: API=$(call ucHyphProj,$@,2)
|
---|
87 | perfexp-%.o: OPERATION=$(call ucHyphProj,$@,3)
|
---|
88 | perfexp-%.o: CFA_APILEVEL=$(call ucHyphProj,$@,4)
|
---|
89 | perfexp-%.o: CFA_SHARING=$(call ucHyphProj,$@,5)
|
---|
90 | perfexp-%.o: ALLOC=$(call ucHyphProj,$@,6)
|
---|
91 | perfexp-%.o: SCENARIO_SWITCH=-DIMPL_$(API)_$(CFA_APILEVEL)_$(CFA_SHARING) -DOP_$(OPERATION) -DALLOC_$(ALLOC)
|
---|
92 |
|
---|
93 | perfexp-cfa-%.o: CMD=$(CFA) -c $(PERFFLAGS_CFA) $< -o $@ $(SCENARIO_SWITCH)
|
---|
94 | perfexp-stl-%.o: CMD=$(CXX) -c -xc++ $(PERFFLAGS_CXX) $< -o $@ $(SCENARIO_SWITCH)
|
---|
95 | perfexp-buhr94-%.o: CMD=$(CXX) -xc++ -c $(PERFFLAGS_CXX) $< -o $@ $(SCENARIO_SWITCH)
|
---|
96 |
|
---|
97 | perfexp-cfa-peq-%.o: prog.cfa $(LIBCFA)
|
---|
98 | $(CMD)
|
---|
99 | perfexp-cfa-pta-%.o: prog.cfa $(LIBCFA)
|
---|
100 | $(CMD)
|
---|
101 | perfexp-cfa-pbv-%.o: prog-passbyval.cfa $(LIBCFA)
|
---|
102 | $(CMD)
|
---|
103 | perfexp-cfa-pb%.o: prog-passbyX.cfa $(LIBCFA)
|
---|
104 | $(CMD)
|
---|
105 | perfexp-cfa-pfi-%.o: prog-find.cfa $(LIBCFA)
|
---|
106 | $(CMD)
|
---|
107 | perfexp-cfa-pall-%.o: prog-allocn.cfa $(LIBCFA)
|
---|
108 | $(CMD)
|
---|
109 | perfexp-cfa-pno-%.o: prog-normalize.cfa $(LIBCFA)
|
---|
110 | $(CMD)
|
---|
111 | perfexp-stl-peq-%.o: prog.cfa
|
---|
112 | $(CMD)
|
---|
113 | perfexp-stl-pta-%.o: prog.cfa
|
---|
114 | $(CMD)
|
---|
115 | perfexp-stl-pbv-%.o: prog-passbyval.cfa
|
---|
116 | $(CMD)
|
---|
117 | perfexp-stl-pfi-%.o: prog-find.cfa
|
---|
118 | $(CMD)
|
---|
119 | perfexp-stl-pall-%.o: prog-allocn.cfa
|
---|
120 | $(CMD)
|
---|
121 | perfexp-stl-pno-%.o: prog-normalize.cfa
|
---|
122 | $(CMD)
|
---|
123 | perfexp-buhr94-peq-%.o: prog.cfa buhr94-string.o buhr94-VbyteSM.o
|
---|
124 | $(CMD)
|
---|
125 | perfexp-buhr94-pta-%.o: prog.cfa buhr94-string.o buhr94-VbyteSM.o
|
---|
126 | $(CMD)
|
---|
127 | perfexp-buhr94-pta-%.o: prog-passbyval.cfa buhr94-string.o buhr94-VbyteSM.o
|
---|
128 | $(CMD)
|
---|
129 | perfexp-buhr94-pall-%.o: prog-allocn.cfa buhr94-string.o buhr94-VbyteSM.o
|
---|
130 | $(CMD)
|
---|
131 | perfexp-buhr94-pno-%.o: prog-normalize.cfa buhr94-string.o buhr94-VbyteSM.o
|
---|
132 | $(CMD)
|
---|
133 |
|
---|
134 | # one of the pbx cases also needs to link with not_string_res.o (handling manually)
|
---|
135 | perfexp-cfa-%: perfexp-cfa-%.o $(LIBCFA)
|
---|
136 | $(CFA) $(PERFFLAGS_CFA) $< -o $@
|
---|
137 | perfexp-stl-%: perfexp-stl-%.o $(LIBCFA)
|
---|
138 | $(CFA) $(PERFFLAGS_CFA) $< /lib/x86_64-linux-gnu/libstdc++.so.6 -o $@
|
---|
139 | perfexp-buhr94-% : perfexp-buhr94-%.o buhr94-string.o buhr94-VbyteSM.o
|
---|
140 | $(CXX) $(PERFFLAGS_CXX) $^ -o $@
|
---|
141 |
|
---|
142 | buhr94-string.o:
|
---|
143 | $(CXX) -xc++ -c $(PERFFLAGS_CXX) ~/usys1/sm/string/StringSharing/src/string.cc -o $@
|
---|
144 |
|
---|
145 | buhr94-VbyteSM.o:
|
---|
146 | $(CXX) -xc++ -c $(PERFFLAGS_CXX) ~/usys1/sm/string/StringSharing/src/VbyteSM.cc -o $@
|
---|
147 |
|
---|
148 | clean:
|
---|
149 | rm -f *.o perfexp*
|
---|
150 |
|
---|
151 | MEASURE = $(PERFPROGS)
|
---|
152 | CORPORI = corpus-100-*-1.txt
|
---|
153 |
|
---|
154 | RUN_TASKSET_CPULIST=6
|
---|
155 |
|
---|
156 | # General timing
|
---|
157 | # Output file gets concatenation of program outputs
|
---|
158 | measurement: $(MEASURE)
|
---|
159 | tofile=measurement-`date '+%F--%H-%M-%S'`.csv ; \
|
---|
160 | echo $$tofile ; \
|
---|
161 | for prog in $(MEASURE) ; do \
|
---|
162 | for corpus in $(CORPORI) ; do \
|
---|
163 | corpusbody=`cat $$corpus` ; \
|
---|
164 | resulttext=`taskset --cpu-list $(RUN_TASKSET_CPULIST) ./$$prog 100 10 $$corpusbody` ; \
|
---|
165 | echo $$prog,$$corpus,$$resulttext >> $$tofile ; \
|
---|
166 | echo $$prog,$$corpus,$$resulttext ; \
|
---|
167 | done ; \
|
---|
168 | done
|
---|
169 |
|
---|
170 | CFA_EXPANSIONS=0.02 0.05 0.1 0.2 0.4 0.5 0.9 0.98
|
---|
171 |
|
---|
172 | # Special-case timing with extra IV for CFA_EXPANSIONS
|
---|
173 | # Output file gets concatenation of program outputs (one line per run)
|
---|
174 | measurement2: $(MEASURE)
|
---|
175 | tofile=measurement-`date '+%F--%H-%M-%S'`.csv ; \
|
---|
176 | for prog in $(MEASURE) ; do \
|
---|
177 | for corpus in $(CORPORI) ; do \
|
---|
178 | for expansion in $(CFA_EXPANSIONS) ; do \
|
---|
179 | corpusbody= ; \
|
---|
180 | echo ./$$prog 1000 1.006 $$expansion 10 \`cat $$corpus\` ; \
|
---|
181 | done ; \
|
---|
182 | done ; \
|
---|
183 | done ; \
|
---|
184 | echo $$tofile ; \
|
---|
185 | for prog in $(MEASURE) ; do \
|
---|
186 | for corpus in $(CORPORI) ; do \
|
---|
187 | for expansion in $(CFA_EXPANSIONS) ; do \
|
---|
188 | corpusbody=`cat $$corpus` ; \
|
---|
189 | printed=`./$$prog 1000 1.006 $$expansion 10 $$corpusbody` ; \
|
---|
190 | echo $$prog,$$corpus,$$expansion,$$printed >> $$tofile ; \
|
---|
191 | echo $$prog,$$corpus,$$expansion,$$printed ; \
|
---|
192 | done ; \
|
---|
193 | done ; \
|
---|
194 | done
|
---|
195 |
|
---|
196 | # Space, with the IV for CFA_EXPANSIONS
|
---|
197 | # Runs Mubeen's malloc interceptor to get malloc-request state
|
---|
198 | # Output file gets concatenation of the interceptor's output (one line per run); program's output ignorred
|
---|
199 | # Expect and ignore crashes; they're during shutdown, after everything we care about is over
|
---|
200 | measurement3: $(MEASURE)
|
---|
201 | tofile=measurement-`date '+%F--%H-%M-%S'`.ssv ; \
|
---|
202 | for prog in $(MEASURE) ; do \
|
---|
203 | for corpus in $(CORPORI) ; do \
|
---|
204 | for expansion in $(CFA_EXPANSIONS) ; do \
|
---|
205 | corpusbody=`cat $$corpus` ; \
|
---|
206 | LD_PRELOAD=~/plg2/mubeen-stat-shim/malloc/mallocWrappers.so ./$$prog 1000 1.006 $$expansion 10 $$corpusbody ; \
|
---|
207 | printed=`tail -n 1 preload_dump.txt` ; \
|
---|
208 | echo $$prog $$corpus $$expansion $$printed >> $$tofile ; \
|
---|
209 | echo $$prog $$corpus $$expansion $$printed ; \
|
---|
210 | rm preload_dump.txt ; \
|
---|
211 | done ; \
|
---|
212 | done ; \
|
---|
213 | done
|
---|
214 |
|
---|
215 | # Time attribution, with the IV for CFA_EXPANSIONS
|
---|
216 | # Runs the SUT under perf, then crunches the perf result
|
---|
217 | # Output file gets concatenation of perf summaries (several lines per run); program's output ignorred
|
---|
218 | # Expect and ignore output "addr2line: DWARF error: section .debug_info is larger than its filesize!"
|
---|
219 | measurement4: $(MEASURE)
|
---|
220 | RUNID=`date '+%F--%H-%M-%S'` ; \
|
---|
221 | tofile=measurement-$$RUNID.ssv ; \
|
---|
222 | echo $$tofile ; \
|
---|
223 | for prog in $(MEASURE) ; do \
|
---|
224 | for corpus in $(CORPORI) ; do \
|
---|
225 | for expansion in $(CFA_EXPANSIONS) ; do \
|
---|
226 | SLUG=measurement--$$prog--$$corpus--$$expansion--$$RUNID ; \
|
---|
227 | corpusbody=`cat $$corpus` ; \
|
---|
228 | perf record --call-graph dwarf -m16M ./$$prog 1000 1.006 $$expansion 10 $$corpusbody ; \
|
---|
229 | mv perf.data $$SLUG.data ; \
|
---|
230 | perf script -i $$SLUG.data > $$SLUG.perf ; \
|
---|
231 | ~/flamegraph/FlameGraph/stackcollapse-perf.pl $$SLUG.perf > $$SLUG.folded ; \
|
---|
232 | ~/flamegraph/FlameGraph/flamegraph.pl $$SLUG.folded > $$SLUG.svg ; \
|
---|
233 | python3 process-allocn-attrib.py $$SLUG.folded | xargs -L1 echo $$prog $$corpus $$expansion >> $$tofile ; \
|
---|
234 | done ; \
|
---|
235 | done ; \
|
---|
236 | done
|
---|