#!/bin/csh -f
#
# komplette_messreihe <programm.c> <prozessorzahl> <groesse>
#
# Fuehrt fuer gegebenes Programm die Parallelisierung durch
# und misst es dann fuer gegebene Eingabegroesse mit verschiedenen
# Strategien durch
#
# S.Haenssgen  05-nov-97
#
# 06-nov-97	Debugging (outfile nicht ueberschreiben!)
#		Verwendung von tmpfile (csh hat kein '|&', nur '>>&'...)
#		Auch Prozessorzahl uebergeben (und ausgeben)
#		Auswertung gleich mit vornehmen, Daten kondensieren
# 10-nov-97	CPU-Zahl auch in Messdateinamen merken
#		Thread-Erzeugungsfehler merken, Coredumpsize limit
# 13-nov-97	Debug (check auf Fehler war zu eng)
#		Reihenfolge geaendert: erst Neverever, dann never, always, rest
#
# 

limit coredumpsize 10

if ( $#argv != 3) then
  echo "Benoetige Programm, Prozessorzahl und Eingabegroesse fuer Messreihe"
  exit 1
endif

set     prog=$1
set     cpus=$2
set     size="$3"
set  parprog="`basename $prog '.c'`_parallel.c"
set messprog="`basename $prog '.c'`_messreihe.c"
set messexec="`basename $messprog '.c'`"
set  outfile="messreihe_`basename $prog '.c'`_`echo $size | tr ' ' '-'`"_"$cpus"cpu_`date +'%y-%m-%d_%H:%M'`
set  tmpfile="/tmp/messreihe_$$"

if ( ! -f $prog ) then
  echo "Quellcode '$prog' nicht gefunden"
  exit 2
endif

# Programm parallelisieren
#
parallelize_program.perl -out $parprog $prog
echo "Program parallelized -> '$parprog' ..."

# Alle Messungen laufen lassen
#
echo "Running measurements -> '$outfile' ..."
foreach strat (\
    "neverever 1"\
    "never 1"\
    "always 1"\
    "first 1" "first 2" "first 4" "first 7"\
    "keep 1" "keep 2" "keep 3" "keep 4" "keep 5" "keep 6" "keep 7" "keep 8" "keep 9" "keep 10" "keep 11" "keep 12" "keep 13" "keep 14" "keep 15" "keep 16" "keep 17" "keep 18" "keep 19" "keep 20"\
    "active 1" "active 2" "active 3" "active 4" "active 5" "active 6" "active 7" "active 8" "active 9" "active 10" "active 11" "active 12" "active 13" "active 14" "active 15" "active 16" "active 17" "active 18" "active 19" "active 20"\
    "depth 1" "depth 2" "depth 3" "depth 4" "depth 5" "depth 6" "depth 7" "depth 8" "depth 9" "depth 10" "depth 11" "depth 12" "depth 13" "depth 14" "depth 15" "depth 16" "depth 17" "depth 18" "depth 19" "depth 20"\
  )
  #
  # Strategie-Parameter im Quellcode aendern ung Ergebnis uebersetzen
  #
  set_strategy_parameters $strat $parprog > $messprog
  echo gcc -g -o $messexec $messprog -D_REENTRANT profile.o -lm -lthread
  gcc -g -o $messexec $messprog -D_REENTRANT profile.o -lm -lthread 
  #
  # Alle Durchlaeufe fuer diese Einstellungen durchfuehren
  #
  foreach run (1 2 3)
    echo -n "PROG $prog CPUS $cpus STRAT $strat SIZE $size RUN $run" >>$outfile
    echo -n "PROG $prog CPUS $cpus STRAT $strat SIZE $size RUN $run"
    #
    # Einzelmessung durchfuehren, gleich auswerten
    #
    setenv T_CPU_NUM $cpus
    (time $messexec $size ) >& $tmpfile
    set threads=`fgrep "threads created = " $tmpfile | cut -d= -f2 | cut -c2-`
    set runtime=`tail -1 $tmpfile | cut -d% -f1`%
    set abort1=`fgrep -i aborting $tmpfile | wc -c`
    set abort2=`fgrep 'Error creating thread' $tmpfile | uniq | wc -c`
    if ( `expr $abort1 + $abort2` != 0 ) then
        echo " THREADS $threads TIME 0.0u 0.0s 0:00 0%" >> $outfile
        echo " THREADS $threads TIME 0.0u 0.0s 0:00 0%"
        echo "(Thread-Erzeugungsfehler in vorheriger Messung, wurde als '0' markiert)"
    else
       echo " THREADS $threads TIME $runtime" >> $outfile
       echo " THREADS $threads TIME $runtime"
    endif
    rm -f $tmpfile
  end
end

