#!/bin/bash
set -u

DIR="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)"
MYSQLITE3="$DIR"/sqlite3.26.0

# check number of arguments
if [ $# -ne 1 ]; then
    echo " usage: cudaAPIStats [SQLite DB file exported from NSys QDREP file]"
    exit 1
fi

# check if file exists
if [ ! -f "$1" ]
then
    echo "$1 file not found. Exiting"
    exit 1
fi

# check if file opened is DB; if not, exit
# The sqlite3 file format is defined at https://www.sqlite.org/draft/fileformat.html
HEADER=$(head -c 16 "$1")
if [ "$HEADER" != "SQLite format 3" ]
then
    echo "$1 is not an SQlite DB file. Exiting."
    exit 1
fi

# check if DB contains cuda API data; if not, exit
COUNT=$("$MYSQLITE3" "$1" "SELECT COUNT(*) FROM CUPTI_ACTIVITY_KIND_RUNTIME");
if [ $COUNT -eq 0 ]
then
    echo "CUDA trace data was not collected."
    exit 0
fi

# check if cudaAPIStats table exists
if [ "$("$MYSQLITE3" "$1" "SELECT name FROM sqlite_master WHERE type='table' AND name='cudaAPIStats';")" != "cudaAPIStats" ]
then
    printf "\nGenerating cuda API Statistics...\n"
    "$MYSQLITE3" "$1" <<GenerateSummary
    PRAGMA SYNCHRONOUS=OFF;
    CREATE TABLE cudaAPIStats (nameId INTEGER, num INTEGER, min INTEGER, max INTEGER, avg INTEGER, total INTEGER);
    INSERT INTO cudaAPIStats SELECT nameId, count(nameId), min(end-start), max(end-start), avg(end-start), sum(end-start)
        FROM CUPTI_ACTIVITY_KIND_RUNTIME GROUP BY nameId;
GenerateSummary
fi

printf "cuda API Statistics\n\n"
TOTALTIME=$("$MYSQLITE3" "$1" "SELECT sum(total) FROM cudaAPIStats");

# substr(value, 1, length(value)-6) trims the last 6 characters
#  (i.e. _vXXXX where XXXX is a version number) off of the API name
echo -e ".width 0 12 0 14 12 12 80 \n SELECT round((total*100.0)/$TOTALTIME,1) as 'Time(%)',
    total as 'Time (ns)', num as Calls, round(avg,1) as 'Avg (ns)', min as 'Min (ns)', max as 'Max (ns)',
    (CASE substr(value, -6, 2)
        WHEN '_v' THEN substr(value, 1, length(value)-6)
        ELSE value
    END) as Name
    FROM cudaAPIStats INNER JOIN StringIds ON StringIds.id = cudaAPIStats.nameId
    ORDER BY total DESC;" | "$MYSQLITE3" -column -header "$1"

printf "\n\n"
