| ##===- poolalloc/TEST.cputrack.Makefile --------------------*- Makefile -*-===## | |
| # | |
| # Makefile for measuring cache miss rates with the Solaris cputrack utility | |
| # | |
| ##===----------------------------------------------------------------------===## | |
| TESTNAME = $* | |
| CURDIR := $(shell cd .; pwd) | |
| PROGDIR := $(shell cd $(LLVM_SRC_ROOT)/projects/llvm-test; pwd)/ | |
| RELDIR := $(subst $(PROGDIR),,$(CURDIR)) | |
| # | |
| # The Solaris cputrack command samples the performance counters every x number | |
| # of ticks (by default, I believe one tick == 1 second). | |
| # | |
| # Use the cputrack command and set the interval to the maximum amount of time | |
| # that the program is allowed to run. | |
| # | |
| # Care must be taken to ensure that the counters do not wrap around. So | |
| # far, I don't believe this has happened, as that would require over | |
| # 4 billion events per execution. | |
| # | |
| CPUTRACK := cputrack -T $(RUNTIMELIMIT) | |
| # | |
| # Events for the Ultrasparc IIIi processor. | |
| # | |
| # EVENTS_DC_RD: | |
| # Read accesses and misses on the L1 Data Cache. | |
| # | |
| # EVENTS_DC_WR: | |
| # Write accesses and misses on the L1 Data Cache. This probably isn't as | |
| # valuable as it sounds because the cache is write through, non allocate. | |
| # So, as I understand it, the L2 and Write Caches are where the write action | |
| # is. | |
| # | |
| # EVENTS_EC_MISS: | |
| # Read misses and overall misses for the L2 Cache (aka the Embedded Cache). | |
| # | |
| EVENTS_DC_RD := -c pic0=DC_rd,pic1=DC_rd_miss | |
| EVENTS_DC_WR := -c pic0=DC_wr,pic1=DC_wr_miss | |
| EVENTS_EC_MISS := -c pic0=EC_rd_miss,pic1=EC_misses | |
| EVENTS_TLB := -c pic0=EC_rd_miss,pic1=DTLB_miss | |
| EVENTS_WC := -c pic0=Cycle_cnt,pic1=WC_miss | |
| ############################################################################ | |
| # Rules for running the tests | |
| ############################################################################ | |
| ifndef PROGRAMS_HAVE_CUSTOM_RUN_RULES | |
| # | |
| # Generate events for Pool Allocated CBE | |
| # | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.dcrd): \ | |
| Output/$(TEST).pa.%.dcrd: Output/%.poolalloc.cbe | |
| @echo "=========================================" | |
| @echo "Running '$(TEST)' test on '$(TESTNAME)' program" | |
| $(VERB) $(CPUTRACK) $(EVENTS_DC_RD) -o $@ $< $(RUN_OPTIONS) < $(STDIN_FILENAME) > /dev/null 2>&1 | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.ec): \ | |
| Output/$(TEST).pa.%.ec: Output/%.poolalloc.cbe | |
| @echo "=========================================" | |
| @echo "Running '$(TEST)' test on '$(TESTNAME)' program" | |
| $(VERB) $(CPUTRACK) $(EVENTS_EC_MISS) -o $@ $< $(RUN_OPTIONS) < $(STDIN_FILENAME) > /dev/null 2>&1 | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.wc): \ | |
| Output/$(TEST).pa.%.wc: Output/%.poolalloc.cbe | |
| @echo "=========================================" | |
| @echo "Running '$(TEST)' test on '$(TESTNAME)' program" | |
| $(VERB) $(CPUTRACK) $(EVENTS_WC) -o $@ $< $(RUN_OPTIONS) < $(STDIN_FILENAME) > /dev/null 2>&1 | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.tlb): \ | |
| Output/$(TEST).pa.%.tlb: Output/%.poolalloc.cbe | |
| @echo "=========================================" | |
| @echo "Running '$(TEST)' test on '$(TESTNAME)' program" | |
| $(VERB) $(CPUTRACK) $(EVENTS_TLB) -o $@ $< $(RUN_OPTIONS) < $(STDIN_FILENAME) > /dev/null 2>&1 | |
| # | |
| # Generate events for CBE | |
| # | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.dcrd): \ | |
| Output/$(TEST).%.dcrd: Output/%.nonpa.cbe | |
| @echo "=========================================" | |
| @echo "Running '$(TEST)' test on '$(TESTNAME)' program" | |
| $(VERB) $(CPUTRACK) $(EVENTS_DC_RD) -o $@ $< $(RUN_OPTIONS) < $(STDIN_FILENAME) > /dev/null 2>&1 | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.ec): \ | |
| Output/$(TEST).%.ec: Output/%.nonpa.cbe | |
| @echo "=========================================" | |
| @echo "Running '$(TEST)' test on '$(TESTNAME)' program" | |
| $(VERB) $(CPUTRACK) $(EVENTS_EC_MISS) -o $@ $< $(RUN_OPTIONS) < $(STDIN_FILENAME) > /dev/null 2>&1 | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.wc): \ | |
| Output/$(TEST).%.wc: Output/%.nonpa.cbe | |
| @echo "=========================================" | |
| @echo "Running '$(TEST)' test on '$(TESTNAME)' program" | |
| $(VERB) $(CPUTRACK) $(EVENTS_WC) -o $@ $< $(RUN_OPTIONS) < $(STDIN_FILENAME) > /dev/null 2>&1 | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.tlb): \ | |
| Output/$(TEST).%.tlb: Output/%.nonpa.cbe | |
| @echo "=========================================" | |
| @echo "Running '$(TEST)' test on '$(TESTNAME)' program" | |
| $(VERB) $(CPUTRACK) $(EVENTS_TLB) -o $@ $< $(RUN_OPTIONS) < $(STDIN_FILENAME) > /dev/null 2>&1 | |
| else | |
| # This rule runs the generated executable, generating timing information, for | |
| # SPEC | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.dcrd): \ | |
| Output/$(TEST).pa.%.dcrd: Output/%.poolalloc.cbe | |
| -$(SPEC_SANDBOX) poolalloccbe-$(RUN_TYPE) $@.out $(REF_IN_DIR) \ | |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ | |
| $(CPUTRACK) $(EVENTS_DC_RD) -o $(BUILD_OBJ_DIR)/$@ $(BUILD_OBJ_DIR)/$< $(RUN_OPTIONS) | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.ec): \ | |
| Output/$(TEST).pa.%.ec: Output/%.poolalloc.cbe | |
| -$(SPEC_SANDBOX) poolalloccbe-$(RUN_TYPE) $@.out $(REF_IN_DIR) \ | |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ | |
| $(CPUTRACK) $(EVENTS_EC_MISS) -o $(BUILD_OBJ_DIR)/$@ $(BUILD_OBJ_DIR)/$< $(RUN_OPTIONS) | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.wc): \ | |
| Output/$(TEST).pa.%.wc: Output/%.poolalloc.cbe | |
| -$(SPEC_SANDBOX) poolalloccbe-$(RUN_TYPE) $@.out $(REF_IN_DIR) \ | |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ | |
| $(CPUTRACK) $(EVENTS_WC) -o $(BUILD_OBJ_DIR)/$@ $(BUILD_OBJ_DIR)/$< $(RUN_OPTIONS) | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.tlb): \ | |
| Output/$(TEST).pa.%.tlb: Output/%.poolalloc.cbe | |
| -$(SPEC_SANDBOX) poolalloccbe-$(RUN_TYPE) $@.out $(REF_IN_DIR) \ | |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ | |
| $(CPUTRACK) $(EVENTS_TLB) -o $(BUILD_OBJ_DIR)/$@ $(BUILD_OBJ_DIR)/$< $(RUN_OPTIONS) | |
| # This rule runs the generated executable, generating timing information, for | |
| # SPEC | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.dcrd): \ | |
| Output/$(TEST).%.dcrd: Output/%.nonpa.cbe | |
| -$(SPEC_SANDBOX) nonpacbe-$(RUN_TYPE) $@.out $(REF_IN_DIR) \ | |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ | |
| $(CPUTRACK) $(EVENTS_DC_RD) -o $(BUILD_OBJ_DIR)/$@ $(BUILD_OBJ_DIR)/$< $(RUN_OPTIONS) | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.ec): \ | |
| Output/$(TEST).%.ec: Output/%.nonpa.cbe | |
| -$(SPEC_SANDBOX) nonpacbe-$(RUN_TYPE) $@.out $(REF_IN_DIR) \ | |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ | |
| $(CPUTRACK) $(EVENTS_EC_MISS) -o $(BUILD_OBJ_DIR)/$@ $(BUILD_OBJ_DIR)/$< $(RUN_OPTIONS) | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.wc): \ | |
| Output/$(TEST).%.wc: Output/%.nonpa.cbe | |
| -$(SPEC_SANDBOX) nonpacbe-$(RUN_TYPE) $@.out $(REF_IN_DIR) \ | |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ | |
| $(CPUTRACK) $(EVENTS_WC) -o $(BUILD_OBJ_DIR)/$@ $(BUILD_OBJ_DIR)/$< $(RUN_OPTIONS) | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.tlb): \ | |
| Output/$(TEST).%.tlb: Output/%.nonpa.cbe | |
| -$(SPEC_SANDBOX) nonpacbe-$(RUN_TYPE) $@.out $(REF_IN_DIR) \ | |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ | |
| $(CPUTRACK) $(EVENTS_TLB) -o $(BUILD_OBJ_DIR)/$@ $(BUILD_OBJ_DIR)/$< $(RUN_OPTIONS) | |
| endif | |
| ############################################################################ | |
| # Report Targets | |
| ############################################################################ | |
| $(PROGRAMS_TO_TEST:%=Output/%.$(TEST).report.txt): \ | |
| Output/%.$(TEST).report.txt: \ | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.dcrd) \ | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.dcrd) \ | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.wc) \ | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.wc) \ | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.ec) \ | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.ec) \ | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).%.tlb) \ | |
| $(PROGRAMS_TO_TEST:%=Output/$(TEST).pa.%.tlb) \ | |
| $(PROGRAMS_TO_TEST:%=Output/%.poolalloc.out-cbe.time) \ | |
| $(PROGRAMS_TO_TEST:%=Output/%.nonpa.out-cbe.time) | |
| @echo "Program:" $* > $@ | |
| @echo "-------------------------------------------------------------" >> $@ | |
| @printf "CBE-PA-L1-Data-Reads: " >> $@ | |
| @cat Output/$(TEST).pa.$*.dcrd | tail -1 | awk '{print $$4}' >> $@ | |
| @printf "CBE-PA-L1-Data-Misses: " >> $@ | |
| @cat Output/$(TEST).pa.$*.dcrd | tail -1 | awk '{print $$5}' >> $@ | |
| @printf "CBE-L1-Data-Reads: " >> $@ | |
| @cat Output/$(TEST).$*.dcrd | tail -1 | awk '{print $$4}' >> $@ | |
| @printf "CBE-L1-Data-Misses: " >> $@ | |
| @cat Output/$(TEST).$*.dcrd | tail -1 | awk '{print $$5}' >> $@ | |
| @printf "CBE-PA-WCache-Misses: " >> $@ | |
| @cat Output/$(TEST).pa.$*.wc | tail -1 | awk '{print $$5}' >> $@ | |
| @printf "CBE-WCache-Misses: " >> $@ | |
| @cat Output/$(TEST).$*.wc | tail -1 | awk '{print $$5}' >> $@ | |
| @printf "CBE-PA-L2-Data-Read-Misses: " >> $@ | |
| @cat Output/$(TEST).pa.$*.ec | tail -1 | awk '{print $$4}' >> $@ | |
| @printf "CBE-PA-L2-Data-Misses: " >> $@ | |
| @cat Output/$(TEST).pa.$*.ec | tail -1 | awk '{print $$5}' >> $@ | |
| @printf "CBE-L2-Data-Read-Misses: " >> $@ | |
| @cat Output/$(TEST).$*.ec | tail -1 | awk '{print $$4}' >> $@ | |
| @printf "CBE-L2-Data-Misses: " >> $@ | |
| @cat Output/$(TEST).$*.ec | tail -1 | awk '{print $$5}' >> $@ | |
| @printf "CBE-PA-DTLB-Misses: " >> $@ | |
| @cat Output/$(TEST).pa.$*.tlb | tail -1 | awk '{print $$5}' >> $@ | |
| @printf "CBE-DTLB-Misses: " >> $@ | |
| @cat Output/$(TEST).$*.tlb | tail -1 | awk '{print $$5}' >> $@ | |
| @printf "CBE-RUN-TIME: " >> $@ | |
| @grep "^program" Output/$*.nonpa.out-cbe.time >> $@ | |
| @printf "CBE-PA-RUN-TIME: " >> $@ | |
| @grep "^program" Output/$*.poolalloc.out-cbe.time >> $@ | |
| $(PROGRAMS_TO_TEST:%=test.$(TEST).%): \ | |
| test.$(TEST).%: Output/%.$(TEST).report.txt | |
| @echo "---------------------------------------------------------------" | |
| @echo ">>> ========= '$(RELDIR)/$*' Program" | |
| @echo "---------------------------------------------------------------" | |
| @cat $< | |
| REPORT_DEPENDENCIES := $(PROGRAMS_TO_TEST:%=Output/%.poolalloc.out-cbe.time) \ | |
| $(PROGRAMS_TO_TEST:%=Output/%.nonpa.out-cbe.time) |