########################################################################## # makefike ########################################################################## .ONESHELL: ########################################################################## EXE = $(basename $(SRC)) LOG = $(EXE:=.log) SRC = $(wildcard *.cc) STA = $(EXE:=.sta) TXT = $(EXE:=.txt) W1 = 12 W2 = 8 W3 != bc <<< "$(W1) + $(W2) * 9" ########################################################################## CXXFLAGS = -fanalyzer -O3 -std=c++20 -Wall ########################################################################## all: @if make -qs $(TXT); then make -s sort else make -s stat fi clave: @printf '%$(W3)s\n' | tr ' ' '-' # echo -e "clave: una calavera ('☠') tras el nombre indica error" echo "clave: una símbolo ('#') tras el nombre indica error" echo " n : número de hebras que atraviesan la barrera" echo " t : tiempo real de ejecución" echo " amin : mínimo número de antes" echo " amax : máximo número de antes" echo " dmin : mínimo número de después" echo " dmax : máximo número de después" echo " msg : número total de mensajes" echo " cpu : tiempo de cpu promedio de 10 ejecuciones (ms)" echo " ratio : msg / tiempo (msg/ms)" clean: -rm -fv $(EXE) $(LOG) $(STA) $(TXT) core* *~ -find -mindepth 2 -maxdepth 2 -name makefile -execdir make $@ \; exe: $(EXE) sort: clave @declare -a N=(2 8 9 10) declare -a F=('n' 'msg' 'cpu' 'ratio') declare -a R=('r' 'r' '' 'r') for (( i=0; i<$${#N[@]}; ++i )); do printf '%$(W3)s\n' | tr ' ' '-' head -n 1 $(firstword $(TXT)) | sed "s/ $${F[$$i]}/\[$${F[$$i]}\]/" printf '%$(W3)s\n' | tr ' ' '-' make stat | grep -v ':' | grep -E -w "$$(echo $(EXE) | tr ' ' '|')" | sort -k$${N[$$i]},$${N[$$i]}$${R[$$i]} -k14,14nr -k13,13n -k5,5nr -s done printf '%$(W3)s\n' | tr ' ' '-' stat: clave @printf '%$(W3)s\n' | tr ' ' '-' for i in $(TXT); do make -s $$i if [[ "$$i" == "$(firstword $(TXT))" ]]; then head -n1 $$i printf '%$(W3)s\n' | tr ' ' '-' fi tail -n1 $$i done printf '%$(W3)s\n' | tr ' ' '-' ########################################################################## boost: LDLIBS+=-lboost_system -lboost_thread ########################################################################## %.log: % @./$< | sort -k1,1n -k2,2g | uniq -c > $@ || true %.sta: % @LC_ALL=C perf stat -r 10 -- ./$< 1> /dev/null 2> >(grep -m 1 -o '[[:digit:].]* msec task-clock' | cut -d' ' -f1 > $@) %.txt: %.log %.sta @LC_ALL=C n=$$(grep después $*.log | wc -l) t=$$(sed -n 's/^ std::this_thread::sleep_for(\(.*\));/\1/p' $*.cc) amin=$$(grep antes $*.log | sort | head -n1 | sed 's/\(.*\) .* .*/\1/') amax=$$(grep antes $*.log | sort | tail -n1 | sed 's/\(.*\) .* .*/\1/') dmin=$$(grep después $*.log | sort | head -n1 | sed 's/\(.*\) .* .*/\1/') dmax=$$(grep después $*.log | sort | tail -n1 | sed 's/\(.*\) .* .*/\1/') msg=$$(cat $*.log | tr -s ' ' | cut -d' ' -f2 | paste -sd+ | bc) cpu=$$(printf '%.1f' $$(cat $*.sta)) ratio=$$(printf '%.1f' $$(bc -l <<< "$$msg / $$cpu")) if (( n == 0 )); then amin=$${amin:=0} amax=$${amax:=0} dmin=$${dmin:=0} dmax=$${dmax:=0} fi if (( (amax - dmin) > 2 )); then prog="$*#"; else prog="$*"; fi printf '%$(W1)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s\n' programa n t amin amax dmin dmax msg cpu ratio > $@ printf '%$(W1)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s%$(W2)s\n' $$prog $$n $$t $$amin $$amax $$dmin $$dmax $$msg $$cpu $$ratio >> $@ ########################################################################## n%: $(SRC) @n=$@ sed --follow-symlinks -i "s/const size_t N = .*;/const size_t N = $${n:1};/" $^ %ms: $(SRC) @sed --follow-symlinks -i "s/^ std::this_thread::sleep_for(.*);/ std::this_thread::sleep_for($@);/" $^ ########################################################################## .PHONY: all clean clave exe sort stat .PRECIOUS: $(LOG) $(STA) $(TXT) ##########################################################################