xref: /OK3568_Linux_fs/yocto/scripts/contrib/bb-perf/bb-matrix-plot.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# Copyright (c) 2011, Intel Corporation.
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-or-later
6*4882a593Smuzhiyun#
7*4882a593Smuzhiyun# DESCRIPTION
8*4882a593Smuzhiyun# This script operates on the .dat file generated by bb-matrix.sh. It tolerates
9*4882a593Smuzhiyun# the header by skipping the first line, but error messages and bad data records
10*4882a593Smuzhiyun# need to be removed first. It will generate three views of the plot, and leave
11*4882a593Smuzhiyun# an interactive view open for further analysis.
12*4882a593Smuzhiyun#
13*4882a593Smuzhiyun# AUTHORS
14*4882a593Smuzhiyun# Darren Hart <dvhart@linux.intel.com>
15*4882a593Smuzhiyun#
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun# Setup the defaults
18*4882a593SmuzhiyunDATFILE="bb-matrix.dat"
19*4882a593SmuzhiyunXLABEL="BB_NUMBER_THREADS"
20*4882a593SmuzhiyunYLABEL="PARALLEL_MAKE"
21*4882a593SmuzhiyunFIELD=3
22*4882a593SmuzhiyunDEF_TITLE="Elapsed Time (seconds)"
23*4882a593SmuzhiyunPM3D_FRAGMENT="unset surface; set pm3d at s hidden3d 100"
24*4882a593SmuzhiyunSIZE="640,480"
25*4882a593Smuzhiyun
26*4882a593Smuzhiyunfunction usage {
27*4882a593SmuzhiyunCMD=$(basename $0)
28*4882a593Smuzhiyuncat <<EOM
29*4882a593SmuzhiyunUsage: $CMD [-d datfile] [-f field] [-h] [-t title] [-w]
30*4882a593Smuzhiyun  -d datfile    The data file generated by bb-matrix.sh (default: $DATFILE)
31*4882a593Smuzhiyun  -f field      The field index to plot as the Z axis from the data file
32*4882a593Smuzhiyun                (default: $FIELD, "$DEF_TITLE")
33*4882a593Smuzhiyun  -h            Display this help message
34*4882a593Smuzhiyun  -s W,H        PNG and window size in pixels (default: $SIZE)
35*4882a593Smuzhiyun  -t title      The title to display, should describe the field (-f) and units
36*4882a593Smuzhiyun                (default: "$DEF_TITLE")
37*4882a593Smuzhiyun  -w            Render the plot as wireframe with a 2D colormap projected on the
38*4882a593Smuzhiyun                XY plane rather than as the texture for the surface
39*4882a593SmuzhiyunEOM
40*4882a593Smuzhiyun}
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun# Parse and validate arguments
43*4882a593Smuzhiyunwhile getopts "d:f:hs:t:w" OPT; do
44*4882a593Smuzhiyun	case $OPT in
45*4882a593Smuzhiyun	d)
46*4882a593Smuzhiyun		DATFILE="$OPTARG"
47*4882a593Smuzhiyun		;;
48*4882a593Smuzhiyun	f)
49*4882a593Smuzhiyun		FIELD="$OPTARG"
50*4882a593Smuzhiyun		;;
51*4882a593Smuzhiyun	h)
52*4882a593Smuzhiyun		usage
53*4882a593Smuzhiyun		exit 0
54*4882a593Smuzhiyun		;;
55*4882a593Smuzhiyun	s)
56*4882a593Smuzhiyun		SIZE="$OPTARG"
57*4882a593Smuzhiyun		;;
58*4882a593Smuzhiyun	t)
59*4882a593Smuzhiyun		TITLE="$OPTARG"
60*4882a593Smuzhiyun		;;
61*4882a593Smuzhiyun	w)
62*4882a593Smuzhiyun		PM3D_FRAGMENT="set pm3d at b"
63*4882a593Smuzhiyun		W="-w"
64*4882a593Smuzhiyun		;;
65*4882a593Smuzhiyun	*)
66*4882a593Smuzhiyun		usage
67*4882a593Smuzhiyun		exit 1
68*4882a593Smuzhiyun		;;
69*4882a593Smuzhiyun	esac
70*4882a593Smuzhiyundone
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun# Ensure the data file exists
73*4882a593Smuzhiyunif [ ! -f "$DATFILE" ]; then
74*4882a593Smuzhiyun	echo "ERROR: $DATFILE does not exist"
75*4882a593Smuzhiyun	usage
76*4882a593Smuzhiyun	exit 1
77*4882a593Smuzhiyunfi
78*4882a593SmuzhiyunPLOT_BASENAME=${DATFILE%.*}-f$FIELD$W
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun# Set a sane title
81*4882a593Smuzhiyun# TODO: parse the header and define titles for each format parameter for TIME(1)
82*4882a593Smuzhiyunif [ -z "$TITLE" ]; then
83*4882a593Smuzhiyun	if [ ! "$FIELD" == "3" ]; then
84*4882a593Smuzhiyun		TITLE="Field $FIELD"
85*4882a593Smuzhiyun	else
86*4882a593Smuzhiyun		TITLE="$DEF_TITLE"
87*4882a593Smuzhiyun	fi
88*4882a593Smuzhiyunfi
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun# Determine the dgrid3d mesh dimensions size
91*4882a593SmuzhiyunMIN=$(tail -n +2 "$DATFILE" | cut -d ' ' -f 1 | sed 's/^0*//' | sort -n | uniq | head -n1)
92*4882a593SmuzhiyunMAX=$(tail -n +2 "$DATFILE" | cut -d ' ' -f 1 | sed 's/^0*//' | sort -n | uniq | tail -n1)
93*4882a593SmuzhiyunBB_CNT=$[${MAX} - $MIN + 1]
94*4882a593SmuzhiyunMIN=$(tail -n +2 "$DATFILE" | cut -d ' ' -f 2 | sed 's/^0*//' | sort -n | uniq | head -n1)
95*4882a593SmuzhiyunMAX=$(tail -n +2 "$DATFILE" | cut -d ' ' -f 2 | sed 's/^0*//' | sort -n | uniq | tail -n1)
96*4882a593SmuzhiyunPM_CNT=$[${MAX} - $MIN + 1]
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun(cat <<EOF
100*4882a593Smuzhiyunset title "$TITLE"
101*4882a593Smuzhiyunset xlabel "$XLABEL"
102*4882a593Smuzhiyunset ylabel "$YLABEL"
103*4882a593Smuzhiyunset style line 100 lt 5 lw 1.5
104*4882a593Smuzhiyun$PM3D_FRAGMENT
105*4882a593Smuzhiyunset dgrid3d $PM_CNT,$BB_CNT splines
106*4882a593Smuzhiyunset ticslevel 0.2
107*4882a593Smuzhiyun
108*4882a593Smuzhiyunset term png size $SIZE
109*4882a593Smuzhiyunset output "$PLOT_BASENAME.png"
110*4882a593Smuzhiyunsplot "$DATFILE" every ::1 using 1:2:$FIELD with lines ls 100
111*4882a593Smuzhiyun
112*4882a593Smuzhiyunset view 90,0
113*4882a593Smuzhiyunset output "$PLOT_BASENAME-bb.png"
114*4882a593Smuzhiyunreplot
115*4882a593Smuzhiyun
116*4882a593Smuzhiyunset view 90,90
117*4882a593Smuzhiyunset output "$PLOT_BASENAME-pm.png"
118*4882a593Smuzhiyunreplot
119*4882a593Smuzhiyun
120*4882a593Smuzhiyunset view 60,30
121*4882a593Smuzhiyunset term wxt size $SIZE
122*4882a593Smuzhiyunreplot
123*4882a593SmuzhiyunEOF
124*4882a593Smuzhiyun) | gnuplot --persist
125