blob: a40008c818926c64d366938267877cfd1baa7be5 [file] [log] [blame]
##===- 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)