summaryrefslogtreecommitdiff
path: root/ghc/utils/parallel/gr2ps.bash
blob: 4d4d3da3e6a74b74147db0cd514bad98f14b0b0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/usr/local/bin/bash
##############################################################################
# Time-stamp: <Wed Jul 24 1996 22:11:13 Stardate: [-31]7859.41 hwloidl>
#
# Usage: gr2ps [options] <gr-file>
#
# Create an overall activity graph from a GrAnSim (or GUM) profile.
# Transform the log file of a GrAnSim run (a .gr file) into a quasi-parallel
# profile (a .qp file) using gr2qp and then into a PostScript file using qp2ps.
# The generated PostScript file shows essentially the number of running, 
# runnable and blocked tasks during the execution of the program.
#
# Options:
#  -o <file> ... write .ps file to <file>
#  -I <str>  ... queues to be displayed (in the given order) with the encoding
#                 'a' ... active (running)
#                 'r' ... runnable
#                 'b' ... blocked
#                 'f' ... fetching
#                 'm' ... migrating
#                 's' ... sparks
#                (e.g. -I "arb" shows active, runnable, blocked tasks)
#  -i <int>  ... info level from 1 to 7; number of queues to display
#  -m        ... create mono PostScript file instead a color one.
#  -O        ... optimise the produced .ps w.r.t. size
#		 NB: With this option info is lost. If there are several values
#		     with same x value only the first one is printed, all 
#		     others are dropped.
#  -s <str>  ... print <str> in the top right corner of the generated graph
#  -S        ... improved version of sorting events
#  -l <int>  ... length of slice in the .ps file; (default: 100)
#                small value => less memory consumption of .ps file & script
#  -d        ... Print date instead of average parallelism
#  -v        ... be talkative. 
#  -h        ... print help message (this header).
#
##############################################################################

progname="`basename $0`"
args="$*"

verb=0
help=0
mono=""
psfile=""
debug=""
optimise=""
info_level=""
info_mask=""
string=""
length=""
force_date=""
hack=""

getopts "hvmDCOHSdl:s:o:i:I:" name
while [ "$name" != "?" ] ; do
  case $name in
   h) help=1;;
   v) verb=1;;
   m) mono="-m";;
   D) debug="-D";;
   C) check="-C";;
   O) optimise="-O";;
   d) force_date="-d";;
   H) hack="-H";;
   S) improved_sort="-S";;
   s) string="-s $OPTARG";;
   l) length="-l $OPTARG";;
   i) info_level="-i $OPTARG";;
   I) info_mask="-I $OPTARG";;
   o) psfile=$OPTARG;;
  esac 
  getopts "hvmDCOHSdl:s:o:i:I:" name
done

opts_qp="$debug $info_level $info_mask $improved_sort "
opts_ps="$debug $check $optimise $mono $string $length $info_level $info_mask $force_date $hack "

shift $[ $OPTIND - 1 ]

if [ $help -eq 1 ]
 then no_of_lines=`cat $0 | awk 'BEGIN { n = 0; } \
                                 /^$/ { print n; \
                                        exit; } \
                                      { n++; }'`
      echo "`head -$no_of_lines $0`"
      exit 
fi

if [ -z "$1" ]
 then echo "Usage: $progname [options] file[.gr]"
      echo "Use -h option for details"
      exit 1;
fi

f="`basename $1 .gr`"
grfile="$f".gr
qpfile="${TMPDIR:-.}/$f".qp
ppfile="${TMPDIR:-.}/$f".pp

if [ -z "$psfile" ]
  then psfile="$f".ps
fi

if [ $verb -eq 1 ]
  then echo "Input file: $grfile"
       echo "Quasi-parallel file: $qpfile"
       echo "PP file: $ppfile"
       echo "PostScript file: $psfile"
       if [ -n "$mono" ]
         then echo "Producing monochrome PS file"
         else echo "Producing color PS file"
       fi
       if [ -n "$optimise" ]
         then echo "Optimisation is ON"
         else echo "Optimisation is OFF"
       fi
       if [ -n "$debug" ]
         then echo "Debugging is turned ON"
         else echo "Debugging is turned OFF"
       fi
       if [ -n "$improved_sort" ]
         then echo "Improved sort is turned ON"
         else echo "Improved sort is turned OFF"
       fi
       verb_opt="-v "
       opts_qp="${opts_qp} $verb_opt "
       opts_ps="${opts_ps} $verb_opt "
       echo "Options for gr2qp: ${opts_qp}"
       echo "Options for qp2ps: ${opts_ps}"
fi


# unset noclobber
if [ ! -f "$grfile" ] 
 then
  echo "$grfile does not exist"
  exit 1
 else
  rm -f "$qpfile" "$psfile"
  prog=`head -1 "$grfile" | sed -e 's/Granularity Simulation for //'`
  echo "$prog" >| "$qpfile"
  if [ $verb -eq 1 ] 
    then echo "Executed program: $prog" 
  fi
  date >> "$qpfile"
  #date="`date`"                     # This is the date of running the script
  date="`tail +2 $grfile | head -1 | sed -e 's/Start time: //'`"
  cat "$grfile" | gr2qp ${opts_qp} >> "$qpfile"
  # Sorting is part of gr2qp now.
  #  | ghc-fool-sort | sort -n +0 -1 | ghc-unfool-sort >> "$qpfile"
  # max=`tail -2 "$qpfile" | awk '!/^Number of threads:/ { print $1; }'`
  xmax=`tail -1 "$qpfile" | awk '{ print $2; }'`
  ymax=`tail -1 "$qpfile" | awk '{ print $4; }'`
  if [ $verb -eq 1 ] 
    then echo "Total runtime: $xmax"
	 echo "Maximal number of tasks: $ymax"
  fi
  tail +3 "$qpfile" | qp2ps ${opts_ps} "$xmax" "$ymax" "$prog" "$date" >| "$psfile"
  rm -f "$qpfile"
  if [ $verb -eq 1 ] 
    then echo "Scaling (maybe): ps-scale-y $psfile " 
  fi
  ps-scale-y "$psfile"
fi