| ##===- 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) |