source: doc/theses/mike_brooks_MMath/benchmarks/list/Makefile@ 5ba1356

Last change on this file since 5ba1356 was 2b0e754, checked in by Michael Brooks <mlbrooks@…>, 3 months ago

Continue disabling harness features, achieving best-case times that match Peter's, on the three tests with new CSVs here.

The fully-disabled harness probably still fools the optimizer because it uses the Buhr-Dice "pass function" trick in place of the disabled observation and iterators array. That these times are now often beating Peter's requires further investigation.

Make STL run with (cpp-sltref) and without (cpp-stlrefAlloGlib) llheap.
Include peter-*.csv from runs on Swift. (Thesis still builds with original numbers from labpc.)
Add data post-processing for sorting and aggregation, leveraging thesis's plots' framework.

Add makefile-saved setups for matching Peter.
Add ability to disable "observation" (use of volatiles) and iterators array (support for remelem).
Add integrated clean-build-run targets for varying the "disable" switches.
Strengthen disable-interleaving mode to avoid the extra loops on remove.

Still to entertain some of this stripping being unnecessary for achieving near Peter-match.
Still to compare costs of the relevant stripped features, and recommend harness variation(s) to for use in thesis.

  • Property mode set to 100644
File size: 14.6 KB
Line 
1# For correctness, see test-correctness.sh.
2# For performance, example:
3# pushd ~/cfax
4# . ~/setcfa build-fast
5# popd
6# make perfprogs CFA=$cfa -j8 MODE=performance
7# make results-latest.csv RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=common5
8# cp results-latest.csv results-baseline.csv
9# For performance, see also: `results-smoketest.csv`, `make thesis`, and more such applied targets at the end
10
11CFA ?= cfa
12CC ?= gcc-11
13CXX ?= g++-11
14UXX ?= ~/u++/u++-7.0.0/bin/u++
15
16MODE?=performance
17EXTRA_COMP_FLAGS?=
18RUN_NUM_REPS?=3
19RUN_DATA_SIZE_MODE?=none
20RUN_DURATION_SEC?=5
21RUN_TASKSET_CPULIST?=6
22
23LLHEAP_LIB=../llheap/libllheap.so
24
25ifeq "$(MODE)" "performance"
26PERFFLAGS_CFA = -DNDEBUG -O3 -nodebug
27PERFFLAGS_CC = -DNDEBUG -O3
28else ifeq "$(MODE)" "correctness"
29PERFFLAGS_CFA = -O0 -g -nodebug -D__CFA_DEBUG__ # shortcut for not also building debug cfa
30PERFFLAGS_CC = -O0 -g
31else
32$(error Bad MODE ($(MODE)); should be performance or correctness)
33endif
34
35PERFFLAGS_CXX = $(PERFFLAGS_CC)
36PERFFLAGS_UXX = $(PERFFLAGS_CFA)
37
38CFLAGS=$(PERFFLAGS_CC) $(EXTRA_COMP_FLAGS)
39
40SHELL = /usr/bin/bash
41
42# function: project an element from a filename that contains a delimited tuple
43# (call proj,-,a-b-c.hfa,3)
44# is
45# c
46define proj
47$(word $(3),$(subst $(1), ,$(basename $(2))))
48endef
49
50# functions: cross two lists, adding given delimiter between
51# (call cross,-,a b c,1 2)
52# is
53# a-1 a-2 b-1 b-2 c-1 c-2
54define cross
55$(foreach x,$(2),$(foreach xs,$(3),$(x)$(1)$(xs)))
56endef
57define cross3
58$(call cross,$(1),$(2),$(call cross,$(1),$(3),$(4)))
59endef
60define cross4
61$(call cross,$(1),$(2),$(call cross3,$(1),$(3),$(4),$(5)))
62endef
63define cross5
64$(call cross,$(1),$(2),$(call cross4,$(1),$(3),$(4),$(5),$(6)))
65endef
66
67OP_MOVEMENTS?=stack queue
68OP_POLARITIES?=insfirst inslast
69OP_ACCESSORS?=allhead inselem remelem
70RUN_INTERLEAVE_PCTS?=0
71
72
73FX_SOLUTIONS?=lq-tailq lq-list cfa-cfa cfa-mandHead cfa-noListed cfa-noIter cfa-likeLq cfa-strip upp-upp cpp-stlref
74
75OPS=$(call cross3,-,$(OP_MOVEMENTS),$(OP_POLARITIES),$(OP_ACCESSORS))
76FXS=$(FX_SOLUTIONS)
77
78all : perfprogs results-latest.csv
79
80# Want to add functional dependency:
81# if current FX_SOLUTION is lq-list then
82# current OP_MOVEMENT must be stack and
83# current OP_POLARITY must be insfirst
84LQ_LIST_INCOMPAT_OP_MOVEMENTS=$(filter-out stack,$(OP_MOVEMENTS))
85LQ_LIST_INCOMPAT_OP_POLARITIES=$(filter-out insfirst,$(OP_POLARITIES))
86LQ_LIST_INCOMPAT_OPS=$(call cross3,-,$(LQ_LIST_INCOMPAT_OP_MOVEMENTS),$(OP_POLARITIES),$(OP_ACCESSORS)) \
87 $(call cross3,-,$(OP_MOVEMENTS),$(LQ_LIST_INCOMPAT_OP_POLARITIES),$(OP_ACCESSORS))
88INCOMPAT=$(call cross,--,lq-list,$(LQ_LIST_INCOMPAT_OPS))
89define filterFds
90$(filter-out $(INCOMPAT),$(1))
91endef
92
93
94CORES_FULL=$(call cross,--,$(FXS),$(OPS)) # lq-tailq--stack-inslast-allhead
95CORES=$(call filterFds,$(CORES_FULL)) # lq-tailq--stack-inslast-allhead
96
97.SECONDEXPANSION: # allow $$ expansion for dynamic dependencies
98
99
100PERFPROGS=$(call cross,--,perfexp,$(CORES))
101
102perfprogs : $(PERFPROGS)
103
104perfexp--% driver--%.o result--%.1csv : FX=$(call proj,--,$@,2)
105perfexp--% driver--%.o result--%.1csv : FX_COARSE=$(call proj,-,$(FX),1)
106perfexp--% driver--%.o result--%.1csv : OP=$(call proj,--,$@,3)
107perfexp--% driver--%.o result--%.1csv : OP_MOVEMENT=$(call proj,-,$(OP),1)
108perfexp--% driver--%.o result--%.1csv : OP_POLARITY=$(call proj,-,$(OP),2)
109perfexp--% driver--%.o result--%.1csv : OP_ACCESSOR=$(call proj,-,$(OP),3)
110perfexp--% driver--%.o result--%.1csv : OP_DEFINES=-DOP_MOVEMENT=$(OP_MOVEMENT) -DOP_POLARITY=$(OP_POLARITY) -DOP_ACCESSOR=$(OP_ACCESSOR)
111
112perfexp--cfa-% driver--cfa-%.o : COMPILER=$(CFA) $(PERFFLAGS_CFA)
113perfexp--lq-% driver--lq-%.o : COMPILER=$(CC) $(PERFFLAGS_CC)
114perfexp--cpp-% driver--cpp-%.o : COMPILER=$(CXX) $(PERFFLAGS_CXX)
115perfexp--upp-% driver--upp-%.o : COMPILER=$(UXX) $(PERFFLAGS_UXX)
116perfexp--% driver--%.o : COMPILER=NO-COMPILER-FOR-$(FX_COARSE)
117
118USE_LLHEAP=no
119perfexp--cpp-% driver--cpp-%.o : USE_LLHEAP=yes
120perfexp--cpp-%AllocGlib driver--cpp-%AllocGlib.o : USE_LLHEAP=no
121
122LLHEAP_LIB_COND=$(if $(filter $(USE_LLHEAP),yes),$(LLHEAP_LIB))
123LLHEAP_PRELOAD_COND=$(if $(filter $(USE_LLHEAP),yes),LD_PRELOAD=$(LLHEAP_LIB))
124
125$(dir $(LLHEAP_LIB)) :
126 $(error Manual action required: clone llheap into $@)
127
128$(LLHEAP_LIB) : $$(dir $$@)
129 $(MAKE) -C $< $(notdir $@)
130
131# Without this %.d rule, ordinary make runs have noise about the recipe for driver--%.o being ill-formed when called on a *.d.
132# https://stackoverflow.com/questions/3714041/why-does-this-makefile-execute-a-target-on-make-clean
133# Whatever you -include gets called as a target first.
134# One such example is driver--upp-upp--stack-insfirst-allhead.d
135# Without this %.d rule, `make make driver--upp-upp--stack-insfirst-allhead.d` leads to the rule for driver--%.o firing.
136# Though my dumb human eyes don't see the pattern as matching.
137%.d:
138 @touch $@
139
140ifeq "$(MAKE_DISABLE_OBSERVATION)" "yes"
141OBSERVATION_COMP_FLAG= -DDISABLE_OBSERVATION
142OBSERVATION_OBJ_COND=
143else
144OBSERVATION_COMP_FLAG=
145OBSERVATION_OBJ_COND= observation.o
146endif
147
148perfexp--% : $$(LLHEAP_LIB_COND) driver--%.o $(OBSERVATION_OBJ_COND)
149 $(COMPILER) $(EXTRA_COMP_FLAGS) $^ -o $@
150
151driver--%.o : driver.c
152 $(COMPILER) $(EXTRA_COMP_FLAGS) $(OBSERVATION_COMP_FLAG) -c $< $(OP_DEFINES) -include op-$(OP).h -include fx-$(FX).h -o $@ -MMD
153
154
155# troubleshooting, e.g. `make echo_DEMOS` runs `echo $(DEMOS)`
156echo_% :
157 @echo '$($(@:echo_%=%))'
158
159
160ifeq "$(RUN_DATA_SIZE_MODE)" "manual"
161 ifeq "$(RUN_DATA_SIZES)" ""
162 $(error RUN_DATA_SIZE_MODE is manual but RUN_DATA_SIZES not given)
163 endif
164endif
165
166RUN_DATA_SIZES = \
167$(if $(filter $(RUN_DATA_SIZE_MODE),common5), \
168 7-1000000 \
169 71-100000 \
170 809-10000 \
171 9051-1000 \
172 72421-100 \
173, $(if $(filter $(RUN_DATA_SIZE_MODE),thorough), \
174 1-1000000 \
175 2-1000000 \
176 3-1000000 \
177 5-1000000 \
178 7-1000000 \
179 11-100000 \
180 13-100000 \
181 19-100000 \
182 29-100000 \
183 37-100000 \
184 53-100000 \
185 71-100000 \
186 101-10000 \
187 149-10000 \
188 211-10000 \
189 283-10000 \
190 401-10000 \
191 569-10000 \
192 809-10000 \
193 1151-1000 \
194 1601-1000 \
195 2267-1000 \
196 3203-1000 \
197 4547-1000 \
198 6473-1000 \
199 9051-1000 \
200 12809-100 \
201 18119-100 \
202 25601-100 \
203 36209-100 \
204 51203-100 \
205 72421-100 \
206 102407-10 \
207 144817-10 \
208 204803-10 \
209 289637-10 \
210 409609-10 \
211 579263-10 \
212 819229-10 \
213 1158613-1 \
214 1638431-1 \
215 2317057-1 \
216 3276803-1 \
217 4634111-1 \
218 6553621-1 \
219 9268211-1 \
220, $(if $(filter $(RUN_DATA_SIZE_MODE),bignquick), \
221 3-1000000 \
222 29-100000 \
223 283-10000 \
224 3203-1000 \
225 25601-100 \
226 289637-10 \
227 1000000-1 \
228 3276803-1 \
229 10000000-1 \
230, $(if $(filter $(RUN_DATA_SIZE_MODE),bignthorough), \
231 1-1000000 \
232 3-1000000 \
233 7-1000000 \
234 13-100000 \
235 29-100000 \
236 53-100000 \
237 101-10000 \
238 211-10000 \
239 401-10000 \
240 809-10000 \
241 1601-1000 \
242 3203-1000 \
243 6473-1000 \
244 12809-100 \
245 25601-100 \
246 51203-100 \
247 102407-10 \
248 204803-10 \
249 409609-10 \
250 819229-10 \
251 1638431-1 \
252 3276803-1 \
253 6553621-1 \
254 12809000-1 \
255 25601000-1 \
256 51203000-1 \
257 102407000-1 \
258 204803000-1 \
259 409609000-1 \
260, $(if $(filter $(RUN_DATA_SIZE_MODE),moderate), \
261 1-1000000 \
262 3-1000000 \
263 7-1000000 \
264 13-100000 \
265 29-100000 \
266 53-100000 \
267 101-10000 \
268 211-10000 \
269 401-10000 \
270 1601-1000 \
271 6473-1000 \
272 25601-100 \
273, $(if $(filter $(RUN_DATA_SIZE_MODE),sweetspot), \
274 1-1000000 \
275 2-1000000 \
276 3-1000000 \
277 5-1000000 \
278 7-1000000 \
279 11-100000 \
280 13-100000 \
281 19-100000 \
282 29-100000 \
283 37-100000 \
284 53-100000 \
285 71-100000 \
286 101-10000 \
287 149-10000 \
288, $(if $(filter $(RUN_DATA_SIZE_MODE),peter), \
289 4-1000000 \
290 8-1000000 \
291 16-100000 \
292 32-100000 \
293 64-100000 \
294 128-10000 \
295 256-10000 \
296 512-10000 \
297 1024-1000 \
298 2048-1000 \
299 4096-1000 \
300 8192-1000 \
301 16384-100 \
302 32768-100 \
303 65536-100 \
304 131072-10 \
305 262144-10 \
306 524288-10 \
307 1048576-1 \
308 2097152-1 \
309 4194304-1 \
310 8388608-1 \
311 16777216-1 \
312, $(if $(filter $(RUN_DATA_SIZE_MODE),none), \
313, $(error Bad RUN_DATA_SIZE_MODE ($(RUN_DATA_SIZE_MODE)); see list of accepted values in Makefile's RUN_DATA_SIZES defimition) \
314))))))))
315
316RUN_REP_IDS=$(shell echo {1..$(RUN_NUM_REPS)}) # 1 2 3
317RUN_REP_EXTS=$(call cross3,,run,$(RUN_REP_IDS),.1csv) # run1.1csv run2.1csv run3.1csv
318
319RUN_LAUNCHES=$(call cross3,--,$(RUN_DATA_SIZES),$(RUN_INTERLEAVE_PCTS),$(RUN_REP_EXTS))
320
321
322RESULT1S=$(call cross,.,$(CORES),$(RUN_LAUNCHES)) # lq-tailq--stack-inslast-allhead.run2.1csv
323
324
325RESULT1S_SHUFD=$(shell shuf -e $(RESULT1S))
326
327%.1csv : CORE=$(basename $(basename $@))
328%.1csv : LAUNCH=$(subst .,,$(suffix $(basename $@)))
329%.1csv : SIZING=$(call proj,--,$(LAUNCH),1)
330%.1csv : NUMNODES=$(call proj,-,$(SIZING),1)
331%.1csv : CHECKDONE=$(call proj,-,$(SIZING),2)
332%.1csv : RUN_INTERLEAVE_PCT=$(call proj,--,$(LAUNCH),2)
333%.1csv : RUN_INTERLEAVE_FRAC=$(shell echo "scale=2; $(RUN_INTERLEAVE_PCT) / 100" | bc)
334%.1csv : REP_ID=$(subst run,,$(call proj,--,$(LAUNCH),3))
335%.1csv : SEED=$(REP_ID)
336%.1csv : RUN_ARGS=$(if $(filter none,$(SIZING)),,$(RUN_DURATION_SEC) $(CHECKDONE) $(NUMNODES) -1 $(SEED) $(RUN_INTERLEAVE_FRAC)) # use REP_ID as seed
337%.1csv : REP_TIME=$(shell date '+%F %H:%M:%S')
338%.1csv : FX=$(call proj,--,$(CORE),1)
339%.1csv : IS_CPP=$(filter cpp-%,$(FX))
340%.1csv : IS_NOT_EXPLICIT_GLIB=$(filter-out %AllocGlib,$(FX))
341%.1csv : USE_LLHEAP=$(if $(and $(IS_CPP),$(IS_NOT_EXPLICIT_GLIB)),yes,no)
342%.1csv : perfprogs FORCE
343# @echo $(FX) $(IS_CPP) $(IS_NOT_EXPLICIT_GLIB) $(USE_LLHEAP) $(LLHEAP_PRELOAD_COND)
344 taskset --cpu-list $(RUN_TASKSET_CPULIST) sh -c '$(LLHEAP_PRELOAD_COND) ./perfexp--$(CORE) $(RUN_ARGS)' | xargs -n 1 printf '%s,%s,%s,%s\n' "$(REP_TIME)" "$(REP_ID)" "$(RUN_ARGS)" | tee -a $(RESULT)
345
346# := for evaluate once and save
347# = for letting cmdline override
348BATCHTIME:=$(shell date '+%F--%H-%M-%S')
349RESULT=results--$(BATCHTIME).csv
350
351sub_make=$(MAKE) --no-print-directory $(1); cat $(1) >> $(2); rm $(1);
352
353
354export RESULT1S_SHUFD # used by sh loop in $(RESULT) recipe
355export RUN_DURATION_SEC # used by sub make; occurs free in %.1csv's variable bindings (not extracted from target name)
356
357
358NTESTS=$(words $(RESULT1S_SHUFD))
359RUNDUR = $(shell expr $(NTESTS) \* $(RUN_DURATION_SEC))
360ETA = $(shell date -d "+$(RUNDUR) seconds" +"%H:%M:%S")
361
362$(RESULT) :
363 @echo running $(NTESTS) tests, eta $(ETA)
364 for r in $$RESULT1S_SHUFD; do $(MAKE) --no-print-directory RESULT=$(RESULT) $$r; done
365
366results-latest.csv : $(RESULT)
367 rm -f $@
368 ln -s $< $@
369
370
371
372clean :
373 rm -f *.o *.d perfexp--*
374
375# The FORCE business means any target that mentions it is also phony
376# https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html says: To always rebuild a pattern rule consider using a “force target” (see [https://www.gnu.org/software/make/manual/html_node/Force-Targets.html]).
377.PHONY: all perfprogs results-latest.csv clean
378FORCE:
379
380.PRECIOUS: result--%.1csv driver--%.o perfexp--% %.o
381
382-include *.d
383
384results-general.csv: FORCE cleanbuild
385 $(MAKE) results-latest.csv RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=sweetspot OP_ACCESSORS=remelem RUN_INTERLEAVE_PCTS='0 50' FX_SOLUTIONS='lq-tailq lq-list cfa-cfa cfa-mandHead'
386 cat results-latest.csv >> $@
387 $(MAKE) results-latest.csv RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=sweetspot OP_ACCESSORS='allhead inselem' RUN_INTERLEAVE_PCTS='0' FX_SOLUTIONS='lq-tailq lq-list cfa-cfa cfa-mandHead'
388 cat results-latest.csv >> $@
389 $(MAKE) results-latest.csv RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=sweetspot OP_ACCESSORS=remelem RUN_INTERLEAVE_PCTS='0 50' FX_SOLUTIONS='cfa-noListed cfa-noIter cfa-likeLq'
390 cat results-latest.csv >> $@
391 $(MAKE) results-latest.csv RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=sweetspot OP_ACCESSORS='allhead inselem' RUN_INTERLEAVE_PCTS='0' FX_SOLUTIONS='cfa-noListed cfa-noIter cfa-likeLq'
392 cat results-latest.csv >> $@
393 $(MAKE) results-latest.csv RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=sweetspot OP_ACCESSORS=remelem RUN_INTERLEAVE_PCTS='0 50' FX_SOLUTIONS='cfa-strip upp-upp cpp-stlref'
394 cat results-latest.csv >> $@
395 $(MAKE) results-latest.csv RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=sweetspot OP_ACCESSORS='allhead inselem' RUN_INTERLEAVE_PCTS='0' FX_SOLUTIONS='cfa-strip upp-upp cpp-stlref'
396 cat results-latest.csv >> $@
397
398results-zoomout-noshuf.csv: EXTRA_COMP_FLAGS+= -DTINY_USER_ITEMS
399results-zoomout-noshuf.csv: FORCE cleanbuild
400 make results-latest.csv RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=bignthorough OPS=stack-insfirst-allhead FX_SOLUTIONS='lq-tailq cfa-cfa upp-upp cpp-stlref cfa-strip' SEED=-1
401 cp results-latest.csv $@
402
403results-zoomout-shuf.csv: EXTRA_COMP_FLAGS+= -DTINY_USER_ITEMS
404results-zoomout-shuf.csv: FORCE cleanbuild
405 make results-latest.csv RUN_DURATION_SEC=5 RUN_NUM_REPS=5 RUN_DATA_SIZE_MODE=bignthorough OPS=stack-insfirst-allhead FX_SOLUTIONS='lq-tailq cfa-cfa upp-upp cpp-stlref cfa-strip'
406 cp results-latest.csv $@
407
408thesis:
409 $(MAKE) results-general.csv
410 $(MAKE) results-zoomout-noshuf.csv
411 $(MAKE) results-zoomout-shuf.csv
412
413results-smoketest.csv: RUN_DATA_SIZE_MODE=bignquick
414results-smoketest.csv: RUN_NUM_REPS=1
415results-smoketest.csv: RUN_DURATION_SEC=1
416results-smoketest.csv: OP_MOVEMENTS=stack
417results-smoketest.csv: OP_POLARITIES=insfirst
418results-smoketest.csv: OP_ACCESSORS=allhead
419results-smoketest.csv: $(RESULT)
420 mv $< $@
421
422CPUS_AVAIL=8
423
424export RUN_DATA_SIZE_MODE
425export RUN_NUM_REPS
426export RUN_DURATION_SEC
427export OP_MOVEMENTS
428export OP_POLARITIES
429export OP_ACCESSORS
430export EXTRA_COMP_FLAGS
431export FX_SOLUTIONS
432export MAKE_DISABLE_OBSERVATION
433
434cleanbuild: FORCE clean
435 $(MAKE) -j $(CPUS_AVAIL) perfprogs
436
437# equivalents to peter's tests
438
439peter-all:
440 $(MAKE) results-peter-linear.csv
441 $(MAKE) results-peter-random2.csv
442 $(MAKE) results-peter-removeHere.csv
443
444# debatable FX_SOLUTIONS using cfa-cfa or cfa-mandhead
445# cfa-cfa faster on allhead (so I thought from thesis analysis; doubting that now under minimal harness), slower on remelem
446# cfa-mandhead IS what Peter's using
447results-peter-%.csv: RUN_DATA_SIZE_MODE=peter
448results-peter-%.csv: RUN_NUM_REPS=3
449results-peter-%.csv: RUN_DURATION_SEC=3
450results-peter-%.csv: OP_MOVEMENTS=stack
451results-peter-%.csv: OP_POLARITIES=insfirst
452results-peter-%.csv: OP_ACCESSORS=allhead
453results-peter-%.csv: FX_SOLUTIONS=cfa-mandHead cpp-stlref cpp-stlrefAllocGlib
454results-peter-%.csv: MAKE_DISABLE_OBSERVATION=yes
455results-peter-%.csv: cleanbuild $(RESULT)
456 mv $(RESULT) $@
457
458results-peter-linear.csv: EXTRA_COMP_FLAGS=-DDISABLE_INTERLEAVING -DDISABLE_SHUFFLING_INDIRECTION -DDISABLE_ITERS_AR -DTINY_USER_ITEMS
459
460results-peter-random2.csv: EXTRA_COMP_FLAGS=-DDISABLE_INTERLEAVING -DDISABLE_ITERS_AR -DTINY_USER_ITEMS
461
462results-peter-removeHere.csv: EXTRA_COMP_FLAGS=-DDISABLE_INTERLEAVING -DDISABLE_SHUFFLING_INDIRECTION -DTINY_USER_ITEMS
463results-peter-removeHere.csv: OP_ACCESSORS=remelem
464
465peter-summary.txt: FORCE
466 rm -f $@
467 printf '#size\tmean\tstd\tmin\tmax\tntrials\tignore\tignore\n' >> $@
468 echo >> $@
469 for f in results-peter*.csv; do echo -------------- $$f ---------------- >> $@; python3 qplot.py $$f >> $@; done
Note: See TracBrowser for help on using the repository browser.