# # $Id: Makefile.Workload 124 2009-06-17 12:11:25Z rosiere $ # # [ Description ] # # Makefile # ifeq ($(origin BENCHS), undefined) $(error "variable BENCHS is undefined") endif ifeq ($(origin NB_THREAD_MAX),, undefined) $(error "variable NB_THREAD_MAX is undefined") endif #-----[ Variables ]--------------------------------------------------------------- FILE_WORKLOAD_LOG = workload.txt FILE_WORKLOAD_SCRIPT = workload.sh FILE_BENCH = $(DIR_INC)/workload.h FILE_BENCH_SED = $(DIR_INC)/workload.h.sed #-----[ Rules ]------------------------------------------------------------------- list : @\ for bench in $(BENCHS); do \ $(ECHO) $${bench}; \ done; print : @$(CAT) $(FILE_BENCH); define : @ \ $(ECHO) "Give a Number of thread (1 by default, Max : $(NB_THREAD_MAX)) : "; \ declare -i NB_THREAD=0; \ $(READ) NB_THREAD; \ \ if $(TEST) "$$NB_THREAD" -ge "$(NB_THREAD_MAX)"; \ then \ NB_THREAD=$(NB_THREAD_MAX); \ else \ if $(TEST) "$$NB_THREAD" -eq 0; \ then \ NB_THREAD=1; \ fi; \ fi; \ \ $(ECHO) "You want $$NB_THREAD thread(s)"; \ $(ECHO) ""; \ declare -i NUM_THREAD=0; \ declare WORKLOAD=""; \ declare -i PREVIOUS=1; \ declare -i CPT=2; \ declare -a BENCHS; \ \ BENCHS[0]="previous choose"; \ BENCHS[1]="none"; \ for benchs in $(BENCHS); do \ BENCHS[$$CPT]=$${benchs/"."/"_"}; \ CPT=$$(($$CPT+1)); \ done; \ \ $(ECHO) "For each Thread, you must select a number of benchmark (0 by default)";\ $(ECHO) ""; \ \ while [ $$NUM_THREAD -lt $$NB_THREAD ]; \ do \ if $(TEST) $$NUM_THREAD -ne 0; \ then \ WORKLOAD=$$WORKLOAD",\n"; \ fi; \ \ $(ECHO) "For Thread[$$NUM_THREAD] ....."; \ declare -i NUM_BENCH; \ \ $(ECHO) "0) previous choose : $${BENCHS[$$PREVIOUS]}"; \ CPT=1; \ while [ $$CPT -lt $${#BENCHS[*]} ]; \ do \ $(ECHO) "$$CPT) $${BENCHS[$$CPT]}"; \ CPT=$$(($$CPT+1)); \ done; \ $(READ) NUM_BENCH; \ \ if $(TEST) "$$NUM_BENCH" -ge "$$CPT"; \ then \ NUM_BENCH=0; \ fi; \ \ if $(TEST) "$$NUM_BENCH" -eq "0"; \ then \ NUM_BENCH=$$PREVIOUS; \ else \ PREVIOUS=$$NUM_BENCH; \ fi; \ \ $(ECHO) "Benchmark selected : $${BENCHS[$$NUM_BENCH]}"; \ $(ECHO) ""; \ \ WORKLOAD=$$WORKLOAD"\t(void *) run_$${BENCHS[$$NUM_BENCH]}"; \ NUM_THREAD=$$(($$NUM_THREAD+1)); \ done; \ $(ECHO) ""; \ $(ECHO) "Generate the file : $(FILE_BENCH)"; \ $(CAT) $(FILE_BENCH_SED) |$(SED) "s/@WORKLOAD/$$WORKLOAD/" > $(FILE_BENCH); \ $(RM) $$$$; \ $(ECHO) ""; workload : @ \ $(ECHO) "Give a Number of thread (1 by default, Max : $(NB_THREAD_MAX)) : "; \ declare -i NB_THREAD=0; \ $(READ) NB_THREAD; \ \ if $(TEST) "$$NB_THREAD" -ge "$(NB_THREAD_MAX)"; \ then \ NB_THREAD=$(NB_THREAD_MAX); \ else \ if $(TEST) "$$NB_THREAD" -eq 0; \ then \ NB_THREAD=1; \ fi; \ fi; \ \ $(ECHO) " * You want $$NB_THREAD thread(s)"; \ $(ECHO) ""; \ $(ECHO) "List of all Benchmark"; \ declare -i CPT=1; \ declare -a BENCHS; \ \ for benchs in $(BENCHS); do \ $(ECHO) " $$CPT) $$benchs"; \ BENCHS[$$CPT]=$${benchs/"."/"_"}; \ CPT=$$(($$CPT+1)); \ done; \ $(ECHO) ""; \ $(ECHO) "Enter the list benchmark (0 to stop)"; \ declare -i NUM_BENCH; \ CPT=1; \ declare -a -i WORKLOAD; \ \ rm -f $(FILE_WORKLOAD_SCRIPT); \ $(ECHO) -n "$(ECHO) -e \"$$NB_THREAD\n" > $(FILE_WORKLOAD_SCRIPT); \ \ while $(TEST) 1; do \ $(READ) NUM_BENCH; \ \ $(ECHO) -n "$$NUM_BENCH\n" >> $(FILE_WORKLOAD_SCRIPT); \ \ if $(TEST) $$NUM_BENCH -eq 0; then \ break; \ fi; \ \ if $(TEST) $$NUM_BENCH -gt $${#BENCHS[*]}; then \ $(ECHO) " * Out of limit, retry ..."; \ else \ echo " * $${BENCHS[$$NUM_BENCH]}"; \ WORKLOAD[$$CPT]=$$NUM_BENCH; \ CPT=$$(($$CPT+1)); \ fi; \ done; \ \ $(ECHO) "\" | $(MAKE) $@" >> $(FILE_WORKLOAD_SCRIPT); \ $(CHMOD) +x $(FILE_WORKLOAD_SCRIPT); \ \ if $(TEST) $$NB_THREAD -gt $${#WORKLOAD[*]}; then \ $(ECHO) "Error : The number of bench in the workload ($${#WORKLOAD[*]}) is < at the number of thread ($$NB_THREAD)"; \ exit; \ fi; \ $(ECHO) ""; \ $(ECHO) "Generate the workload"; \ \ declare -i NB_ITERATION=1; \ CPT=$$(($$NB_THREAD+1)); \ while $(TEST) $$CPT -le $${#WORKLOAD[*]}; do \ NB_ITERATION=$$(($$NB_ITERATION*$$CPT)); \ CPT=$$(($$CPT+1)); \ done; \ CPT=$$(($${#WORKLOAD[*]}-$$NB_THREAD)); \ while $(TEST) $$CPT -gt 0; do \ NB_ITERATION=$$(($$NB_ITERATION/$$CPT)); \ CPT=$$(($$CPT-1)); \ done; \ $(ECHO) " * $$NB_ITERATION Workloads (n!/(p!*(n-p)!))"; \ \ declare -a -i PTR; \ CPT=1; \ while $(TEST) $$CPT -le $$NB_THREAD; do \ PTR[$$CPT]=$$(($$NB_THREAD-$$CPT+1)); \ CPT=$$(($$CPT+1)); \ done; \ \ CPT=0; \ declare -i IT; \ declare -a -i OVF; \ declare -a -i NB_OVF; \ rm -f $(FILE_WORKLOAD_LOG); \ \ while $(TEST) $$CPT -lt $$NB_ITERATION; do \ declare COMMAND="$$NB_THREAD\n"; \ $(ECHO) -ne " - [$$CPT]\t"; \ \ OVF[0]=0; \ NB_OVF=0; \ if $(TEST) $${PTR[1]} -ge $${#WORKLOAD[*]}; then \ OVF[0]=1; \ fi; \ \ declare WORKLOAD_CURRENT=""; \ IT=1; \ while $(TEST) $$IT -le $$NB_THREAD; do \ WORKLOAD_CURRENT="$${WORKLOAD_CURRENT} $${BENCHS[$${WORKLOAD[$${PTR[$$IT]}]}]}";\ $(ECHO) -ne " $${BENCHS[$${WORKLOAD[$${PTR[$$IT]}]}]}\t"; \ \ COMMAND="$${COMMAND}$$(($${WORKLOAD[$${PTR[$$IT]}]}+1))\n"; \ OVF[$$(($$IT))]=0; \ if $(TEST) $${OVF[$$(($$IT-1))]} -eq 1 ; then \ if $(TEST) $$(($${PTR[$$IT]}+$$NB_OVF)) -ge $${#WORKLOAD[*]}; then \ OVF[$$IT]=1; \ NB_OVF=$$(($$NB_OVF+1)); \ fi; \ fi; \ \ IT=$$(($$IT+1)); \ done; \ echo ""; \ \ $(ECHO) "$(EXE)_$${CPT}.x : $${WORKLOAD_CURRENT}" >> $(FILE_WORKLOAD_LOG); \ $(MAKE) clean; \ $(ECHO) -e $${COMMAND} | $(MAKE) define; \ $(MAKE) $(DIR_BIN)/$(EXE)_$${CPT}.x; \ \ PTR[1]=$$(($${PTR[1]}+1)); \ IT=$$NB_THREAD; \ while $(TEST) $$IT -ge 1; do \ if $(TEST) $${OVF[$$IT]} -eq 1 ; then \ PTR[$$(($$IT))]=$${PTR[$$(($$IT+1))]}; \ fi; \ \ if $(TEST) $${OVF[$$(($$IT-1))]} -eq 1 ; then \ PTR[$$(($$IT))]=$$(($${PTR[$$IT]}+1)); \ fi; \ IT=$$(($$IT-1)); \ done; \ \ CPT=$$(($$CPT+1)); \ done;