Files
rocm-systems/source/share/rocprofiler-sdk-rocpd/summary_views.sql
T
Madsen, Jonathan 7afedc63be [rocprofv3] SQLite3 database output (rocpd) support + rocprofiler-sdk-rocpd (#403)
* [rocprofv3] rocpd SQLite3 database output support

* Move counters xml and yaml to source/share/rocprofiler-sdk

- more representative of install hierarchy

* Add share/rocprofiler-sdk/rocpd SQL files

* Experimental rocprofiler-sdk SQL API

* rocprofv3 default output format is rocpd

* Fix rocpd event ids for counter collection w/o kernel dispatch

* Remove fktable entries from rocpd_tables.sql

* Fix rocpd schema path

* Fix install component for roctx python bindings

* rocprofiler-sdk-rocpd

- create include/rocprofiler-sdk-rocpd
- create rocprofiler-sdk-rocpd library, package, etc.
- default all "guid" fields to "{{guid}}" in tables
- remove "{{view_uuid}}" support (always unused)

* Migrate rocprofv3 to use rocprofiler-sdk-rocpd

* Fix missing foreign key reference

* Revert change

* Fix cmake comment

* Fix maybe-uninitialized compiler warning

* Fix maybe-uninitialized compiler warning

* Add logging to rocpd_sql_load_schema

* Improve string sanitization when inserting json strings

* Initialize rocpd logging on rocprofiler-sdk-rocpd library load

* Revert lib/output/generatePerfetto.cpp changes

* [temporary] Tweak rocprofv3-test-list-avail-trace-execute test log level

* Update get_install_path for lib/rocprofiler-sdk-rocpd/sql.cpp

- try to resolve issues on RHEL/SLES for dladdr

* Update lib/common/logging.cpp

- enable environ overrides

* dlsym for rocpd_sql_load_schema

* Make dl_info.dli_fname lexically normal

* Implement node_info alternatives if /etc/machine-id does not exist

* Misc include fixes

* SHA256 and UUIDv7 support

* Implement UUIDv7 in generateRocpd.cpp

* Support push/pop environment variables

* Minor tweak

* Fix glog segfaults when unsetting glog env

* Updated CHANGELOG

* Updates tests/pytest-packages

- rocpd_reader.py: RocpdReader

* Update tests / marker_views.sql

- add test_rocpd_data

* Update rocpd_tables.sql

- Use AUTOINCREMENT
- insert "uuid" and "guid" into rocpd_metadata

* Minor updates to generateRocpd.cpp

- don't quote GUID
- use sqlite3_open_v2
- use sqlite3_close_v2

* Update execute_raw_sql_statements_impl

- uses sqlite3_last_insert_rowid for autoincrement

* Update SQL deferred_transaction

- CI check for nullptr to connection

* Apply suggestions from code review

Co-authored-by: Welton, Benjamin <Benjamin.Welton@amd.com>

* Code review updates

- formatting
- replace if with switch
- remove loop for {{uuid}}

* Fix pmc_groups handling in rocprofv3

* Address code review feedback

- Include rocm_version in rocprofv3 version info
- Note `--version` option for `rocprofv3` in CHANGELOG.md
- remove commented out code

* Fix packaging dependencies

* Fix install package step of CI workflow

* Fix install package step of CI workflow

---------

Co-authored-by: Jonathan R. Madsen <jonathanrmadsen@gmail.com>
Co-authored-by: Welton, Benjamin <Benjamin.Welton@amd.com>
2025-05-30 00:13:19 -05:00

1390 líneas
39 KiB
SQL

--
-- Useful summary views
--
--
-- Sorted list of kernels which consume the most overall time
CREATE VIEW IF NOT EXISTS
`top_kernels` AS
SELECT
S.display_name AS name,
COUNT(K.kernel_id) AS total_calls,
SUM(K.end - K.start) / 1000 AS total_duration,
(SUM(K.end - K.start) / COUNT(K.kernel_id)) / 1000 AS average,
SUM(K.end - K.start) * 100.0 / (
SELECT
SUM(A.end - A.start)
FROM
`rocpd_kernel_dispatch` A
) AS percentage
FROM
`rocpd_kernel_dispatch` K
INNER JOIN `rocpd_info_kernel_symbol` S ON S.id = K.kernel_id
AND S.guid = K.guid
GROUP BY
name
ORDER BY
total_duration DESC;
--
-- GPU utilization metrics including kernels and memory copy operations
CREATE VIEW IF NOT EXISTS
`busy` AS
SELECT
A.agent_id,
AG.type,
GpuTime,
WallTime,
GpuTime * 1.0 / WallTime AS Busy
FROM
(
SELECT
agent_id,
SUM(END - start) AS GpuTime
FROM
(
SELECT
agent_id,
END,
start
FROM
`rocpd_kernel_dispatch`
UNION ALL
SELECT
dst_agent_id AS agent_id,
END,
start
FROM
`rocpd_memory_copy`
)
GROUP BY
agent_id
) A
INNER JOIN (
SELECT
MAX(END) - MIN(start) AS WallTime
FROM
(
SELECT
END,
start
FROM
`rocpd_kernel_dispatch`
UNION ALL
SELECT
END,
start
FROM
`rocpd_memory_copy`
)
) W ON 1 = 1
INNER JOIN `rocpd_info_agent` AG ON AG.id = A.agent_id
AND AG.guid = A.guid;
--
-- Overall performance summary including kernels and memory copy operations
CREATE VIEW
`top` AS
SELECT
name,
COUNT(*) AS total_calls,
SUM(duration) / 1000.0 AS total_duration,
(SUM(duration) / COUNT(*)) / 1000.0 AS average,
SUM(duration) * 100.0 / total_time AS percentage
FROM
(
-- Kernel operations
SELECT
ks.display_name AS name,
(kd.end - kd.start) AS duration
FROM
`rocpd_kernel_dispatch` kd
INNER JOIN `rocpd_info_kernel_symbol` ks ON kd.kernel_id = ks.id
AND kd.guid = ks.guid
UNION ALL
-- Memory operations
SELECT
rs.string AS name,
(END - start) AS duration
FROM
`rocpd_memory_copy` mc
INNER JOIN `rocpd_string` rs ON rs.id = mc.name_id
AND rs.guid = mc.guid
UNION ALL
-- Regions
SELECT
rs.string AS name,
(END - start) AS duration
FROM
`rocpd_region` rr
INNER JOIN `rocpd_string` rs ON rs.id = rr.name_id
AND rs.guid = rr.guid
) operations
CROSS JOIN (
SELECT
SUM(END - start) AS total_time
FROM
(
SELECT
END,
start
FROM
`rocpd_kernel_dispatch`
UNION ALL
SELECT
END,
start
FROM
`rocpd_memory_copy`
UNION ALL
SELECT
END,
start
FROM
`rocpd_region`
)
) TOTAL
GROUP BY
name
ORDER BY
total_duration DESC;
--
-- summaries
--
--
-- Kernel summary by name
CREATE VIEW
`kernel_summary` AS
WITH
avg_data AS (
SELECT
name,
AVG(duration) AS avg_duration
FROM
`kernels`
GROUP BY
name
),
aggregated_data AS (
SELECT
K.name,
COUNT(*) AS calls,
SUM(K.duration) AS total_duration,
CAST(SUM(K.duration * K.duration) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(K.duration) AS min_duration,
MAX(K.duration) AS max_duration,
SUM((K.duration - A.avg_duration) * (K.duration - A.avg_duration)) / (COUNT(*) - 1) AS variance_duration,
SQRT(SUM((K.duration - A.avg_duration) * (K.duration - A.avg_duration)) / (COUNT(*) - 1)) AS std_dev_duration
FROM
`kernels` K
JOIN avg_data A ON K.name = A.name
GROUP BY
K.name
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
aggregated_data
)
SELECT
AD.name AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.average_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
aggregated_data AD
CROSS JOIN total_duration TD;
--
-- Kernel summary by region name
CREATE VIEW
`kernel_summary_region` AS
WITH
avg_data AS (
SELECT
region,
AVG(duration) AS avg_duration
FROM
`kernels`
GROUP BY
region
),
aggregated_data AS (
SELECT
K.region AS name,
COUNT(*) AS calls,
SUM(K.duration) AS total_duration,
CAST(SUM(K.duration * K.duration) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(K.duration) AS min_duration,
MAX(K.duration) AS max_duration,
SUM((K.duration - A.avg_duration) * (K.duration - A.avg_duration)) / (COUNT(*) - 1) AS variance_duration,
SQRT(SUM((K.duration - A.avg_duration) * (K.duration - A.avg_duration)) / (COUNT(*) - 1)) AS std_dev_duration
FROM
`kernels` K
JOIN avg_data A ON K.region = A.region
GROUP BY
K.region
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
aggregated_data
)
SELECT
AD.name AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.average_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
aggregated_data AD
CROSS JOIN total_duration TD;
--
-- Memory copy summary
CREATE VIEW
`memory_copy_summary` AS
WITH
avg_data AS (
SELECT
name,
AVG(duration) AS avg_duration
FROM
`memory_copies`
GROUP BY
name
),
aggregated_data AS (
SELECT
MC.name,
COUNT(*) AS calls,
SUM(MC.duration) AS total_duration,
CAST(SUM(MC.duration * MC.duration) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(MC.duration) AS min_duration,
MAX(MC.duration) AS max_duration,
SUM((MC.duration - A.avg_duration) * (MC.duration - A.avg_duration)) / (COUNT(*) - 1) AS variance_duration,
SQRT(SUM((MC.duration - A.avg_duration) * (MC.duration - A.avg_duration)) / (COUNT(*) - 1)) AS std_dev_duration
FROM
`memory_copies` MC
JOIN avg_data A ON MC.name = A.name
GROUP BY
MC.name
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
aggregated_data
)
SELECT
AD.name AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.average_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
aggregated_data AD
CROSS JOIN total_duration TD;
--
-- Memory allocation summary
CREATE VIEW
`memory_allocation_summary` AS
WITH
avg_data AS (
SELECT
type AS name,
AVG(duration) AS avg_duration
FROM
`memory_allocations`
GROUP BY
type
),
aggregated_data AS (
SELECT
MA.type AS name,
COUNT(*) AS calls,
SUM(MA.duration) AS total_duration,
CAST(SUM(MA.duration * MA.duration) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(MA.duration) AS min_duration,
MAX(MA.duration) AS max_duration,
SUM((MA.duration - A.avg_duration) * (MA.duration - A.avg_duration)) / (COUNT(*) - 1) AS variance_duration,
SQRT(SUM((MA.duration - A.avg_duration) * (MA.duration - A.avg_duration)) / (COUNT(*) - 1)) AS std_dev_duration
FROM
`memory_allocations` MA
JOIN avg_data A ON MA.type = A.name
GROUP BY
MA.type
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
aggregated_data
)
SELECT
'MEMORY_ALLOCATION_' || AD.name AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.average_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
aggregated_data AD
CROSS JOIN total_duration TD;
--
-- Scratch Memory summary
CREATE VIEW
`scratch_memory_summary` AS
WITH
avg_data AS (
SELECT
operation AS name,
AVG(END - start) AS avg_duration
FROM
`scratch_memory`
GROUP BY
operation
),
aggregated_data AS (
SELECT
SM.operation AS name,
COUNT(*) AS calls,
SUM(SM.end - SM.start) AS total_duration,
CAST(SUM((SM.end - SM.start) * (SM.end - SM.start)) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(SM.end - SM.start) AS min_duration,
MAX(SM.end - SM.start) AS max_duration,
SUM((SM.end - SM.start - A.avg_duration) * (SM.end - SM.start - A.avg_duration)) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM((SM.end - SM.start - A.avg_duration) * (SM.end - SM.start - A.avg_duration)) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`scratch_memory` SM
JOIN avg_data A ON SM.operation = A.name
GROUP BY
SM.operation
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
aggregated_data
)
SELECT
AD.name AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.average_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
aggregated_data AD
CROSS JOIN total_duration TD
ORDER BY
AD.total_duration DESC;
--
-- HIP summary
CREATE VIEW
`hip_api_summary` AS
WITH
avg_data AS (
SELECT
name,
AVG(duration) AS avg_duration
FROM
`regions`
WHERE
category LIKE 'HIP_%'
GROUP BY
name
),
aggregated_data AS (
SELECT
R.name,
COUNT(*) AS calls,
SUM(R.duration) AS total_duration,
CAST(SUM(R.duration * R.duration) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(R.duration) AS min_duration,
MAX(R.duration) AS max_duration,
SUM((R.duration - A.avg_duration) * (R.duration - A.avg_duration)) / (COUNT(*) - 1) AS variance_duration,
SQRT(SUM((R.duration - A.avg_duration) * (R.duration - A.avg_duration)) / (COUNT(*) - 1)) AS std_dev_duration
FROM
`regions` R
JOIN avg_data A ON R.name = A.name
WHERE
R.category LIKE 'HIP_%'
GROUP BY
R.name
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
aggregated_data
)
SELECT
AD.name AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.average_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
aggregated_data AD
CROSS JOIN total_duration TD;
--
-- HSA summary
CREATE VIEW
`hsa_api_summary` AS
WITH
avg_data AS (
SELECT
name,
AVG(duration) AS avg_duration
FROM
`regions`
WHERE
category LIKE 'HSA_%'
GROUP BY
name
),
aggregated_data AS (
SELECT
R.name,
COUNT(*) AS calls,
SUM(R.duration) AS total_duration,
CAST(SUM(R.duration * R.duration) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(R.duration) AS min_duration,
MAX(R.duration) AS max_duration,
SUM((R.duration - A.avg_duration) * (R.duration - A.avg_duration)) / (COUNT(*) - 1) AS variance_duration,
SQRT(SUM((R.duration - A.avg_duration) * (R.duration - A.avg_duration)) / (COUNT(*) - 1)) AS std_dev_duration
FROM
`regions` R
JOIN avg_data A ON R.name = A.name
WHERE
R.category LIKE 'HSA_%'
GROUP BY
R.name
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
aggregated_data
)
SELECT
AD.name AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.average_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
aggregated_data AD
CROSS JOIN total_duration TD;
--
-- RCCL API summary
CREATE VIEW
`rccl_summary` AS
WITH
avg_data AS (
SELECT
name,
AVG(duration) AS avg_duration
FROM
`regions`
WHERE
category LIKE 'RCCL_%'
GROUP BY
name
),
aggregated_data AS (
SELECT
R.name,
COUNT(*) AS calls,
SUM(R.duration) AS total_duration,
CAST(SUM(R.duration * R.duration) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(R.duration) AS min_duration,
MAX(R.duration) AS max_duration,
SUM((R.duration - A.avg_duration) * (R.duration - A.avg_duration)) / (COUNT(*) - 1) AS variance_duration,
SQRT(SUM((R.duration - A.avg_duration) * (R.duration - A.avg_duration)) / (COUNT(*) - 1)) AS std_dev_duration
FROM
`regions` R
JOIN avg_data A ON R.name = A.name
WHERE
R.category LIKE 'RCCL_%'
GROUP BY
R.name
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
aggregated_data
)
SELECT
AD.name AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.average_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
aggregated_data AD
CROSS JOIN total_duration TD
ORDER BY
AD.total_duration DESC;
--
-- ROCJPEG API summary
CREATE VIEW
`rocjpeg_summary` AS
WITH
avg_data AS (
SELECT
name,
AVG(duration) AS avg_duration
FROM
`regions`
WHERE
category LIKE 'ROCJPEG_%'
GROUP BY
name
),
aggregated_data AS (
SELECT
R.name,
COUNT(*) AS calls,
SUM(R.duration) AS total_duration,
CAST(SUM(R.duration * R.duration) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(R.duration) AS min_duration,
MAX(R.duration) AS max_duration,
SUM((R.duration - A.avg_duration) * (R.duration - A.avg_duration)) / (COUNT(*) - 1) AS variance_duration,
SQRT(SUM((R.duration - A.avg_duration) * (R.duration - A.avg_duration)) / (COUNT(*) - 1)) AS std_dev_duration
FROM
`regions` R
JOIN avg_data A ON R.name = A.name
WHERE
R.category LIKE 'ROCJPEG_%'
GROUP BY
R.name
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
aggregated_data
)
SELECT
AD.name AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.average_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
aggregated_data AD
CROSS JOIN total_duration TD
ORDER BY
AD.total_duration DESC;
--
-- ROCDECODE API summary
CREATE VIEW
`rocdecode_summary` AS
WITH
avg_data AS (
SELECT
name,
AVG(duration) AS avg_duration
FROM
`regions`
WHERE
category LIKE 'ROCDECODE_%'
GROUP BY
name
),
aggregated_data AS (
SELECT
R.name,
COUNT(*) AS calls,
SUM(R.duration) AS total_duration,
CAST(SUM(R.duration * R.duration) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(R.duration) AS min_duration,
MAX(R.duration) AS max_duration,
SUM((R.duration - A.avg_duration) * (R.duration - A.avg_duration)) / (COUNT(*) - 1) AS variance_duration,
SQRT(SUM((R.duration - A.avg_duration) * (R.duration - A.avg_duration)) / (COUNT(*) - 1)) AS std_dev_duration
FROM
`regions` R
JOIN avg_data A ON R.name = A.name
WHERE
R.category LIKE 'ROCDECODE_%'
GROUP BY
R.name
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
aggregated_data
)
SELECT
AD.name AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.average_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
aggregated_data AD
CROSS JOIN total_duration TD
ORDER BY
AD.total_duration DESC;
--
-- Domain summary
CREATE VIEW
`domain_summary` AS
WITH
kernel_times AS (
WITH
kernel_avg AS (
SELECT
AVG(duration) AS avg_duration
FROM
`kernels`
)
SELECT
'KERNEL_DISPATCH' AS domain,
COUNT(*) AS calls,
SUM(duration) AS total_duration,
CAST(SUM(duration * duration) AS REAL) AS sqr_duration,
(
SELECT
avg_duration
FROM
kernel_avg
) AS avg_duration,
MIN(duration) AS min_duration,
MAX(duration) AS max_duration,
SUM(
(
duration - (
SELECT
avg_duration
FROM
kernel_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
kernel_avg
)
)
) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM(
(
duration - (
SELECT
avg_duration
FROM
kernel_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
kernel_avg
)
)
) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`kernels`
),
mcopy_times AS (
WITH
mcopy_avg AS (
SELECT
AVG(duration) AS avg_duration
FROM
`memory_copies`
)
SELECT
'MEMORY_COPY' AS domain,
COUNT(*) AS calls,
SUM(duration) AS total_duration,
CAST(SUM(duration * duration) AS REAL) AS sqr_duration,
(
SELECT
avg_duration
FROM
mcopy_avg
) AS avg_duration,
MIN(duration) AS min_duration,
MAX(duration) AS max_duration,
SUM(
(
duration - (
SELECT
avg_duration
FROM
mcopy_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
mcopy_avg
)
)
) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM(
(
duration - (
SELECT
avg_duration
FROM
mcopy_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
mcopy_avg
)
)
) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`memory_copies`
),
malloc_times AS (
WITH
malloc_avg AS (
SELECT
AVG(duration) AS avg_duration
FROM
`memory_allocations`
)
SELECT
'MEMORY_ALLOCATION' AS domain,
COUNT(*) AS calls,
SUM(duration) AS total_duration,
CAST(SUM(duration * duration) AS REAL) AS sqr_duration,
(
SELECT
avg_duration
FROM
malloc_avg
) AS avg_duration,
MIN(duration) AS min_duration,
MAX(duration) AS max_duration,
SUM(
(
duration - (
SELECT
avg_duration
FROM
malloc_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
malloc_avg
)
)
) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM(
(
duration - (
SELECT
avg_duration
FROM
malloc_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
malloc_avg
)
)
) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`memory_allocations`
),
scratch_times AS (
WITH
scratch_avg AS (
SELECT
AVG(END - start) AS avg_duration
FROM
`scratch_memory`
)
SELECT
'SCRATCH_MEMORY' AS domain,
COUNT(*) AS calls,
SUM(END - start) AS total_duration,
CAST(SUM((END - start) * (END - start)) AS REAL) AS sqr_duration,
(
SELECT
avg_duration
FROM
scratch_avg
) AS avg_duration,
MIN(END - start) AS min_duration,
MAX(END - start) AS max_duration,
SUM(
(
END - start - (
SELECT
avg_duration
FROM
scratch_avg
)
) * (
END - start - (
SELECT
avg_duration
FROM
scratch_avg
)
)
) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM(
(
END - start - (
SELECT
avg_duration
FROM
scratch_avg
)
) * (
END - start - (
SELECT
avg_duration
FROM
scratch_avg
)
)
) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`scratch_memory`
),
hip_api_times AS (
WITH
hip_avg AS (
SELECT
AVG(duration) AS avg_duration
FROM
`regions`
WHERE
category LIKE 'HIP_%'
)
SELECT
'HIP_API' AS domain,
COUNT(*) AS calls,
SUM(duration) AS total_duration,
CAST(SUM(duration * duration) AS REAL) AS sqr_duration,
(
SELECT
avg_duration
FROM
hip_avg
) AS avg_duration,
MIN(duration) AS min_duration,
MAX(duration) AS max_duration,
SUM(
(
duration - (
SELECT
avg_duration
FROM
hip_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
hip_avg
)
)
) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM(
(
duration - (
SELECT
avg_duration
FROM
hip_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
hip_avg
)
)
) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`regions`
WHERE
category LIKE 'HIP_%'
),
hsa_api_times AS (
WITH
hsa_avg AS (
SELECT
AVG(duration) AS avg_duration
FROM
`regions`
WHERE
category LIKE 'HSA_%'
)
SELECT
'HSA_API' AS domain,
COUNT(*) AS calls,
SUM(duration) AS total_duration,
CAST(SUM(duration * duration) AS REAL) AS sqr_duration,
(
SELECT
avg_duration
FROM
hsa_avg
) AS avg_duration,
MIN(duration) AS min_duration,
MAX(duration) AS max_duration,
SUM(
(
duration - (
SELECT
avg_duration
FROM
hsa_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
hsa_avg
)
)
) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM(
(
duration - (
SELECT
avg_duration
FROM
hsa_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
hsa_avg
)
)
) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`regions`
WHERE
category LIKE 'HSA_%'
),
marker_times AS (
WITH
marker_avg AS (
SELECT
AVG(duration) AS avg_duration
FROM
`markers`
)
SELECT
'MARKER_API' AS domain,
COUNT(*) AS calls,
SUM(duration) AS total_duration,
CAST(SUM(duration * duration) AS REAL) AS sqr_duration,
(
SELECT
avg_duration
FROM
marker_avg
) AS avg_duration,
MIN(duration) AS min_duration,
MAX(duration) AS max_duration,
SUM(
(
duration - (
SELECT
avg_duration
FROM
marker_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
marker_avg
)
)
) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM(
(
duration - (
SELECT
avg_duration
FROM
marker_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
marker_avg
)
)
) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`markers`
),
rccl_times AS (
WITH
rccl_avg AS (
SELECT
AVG(duration) AS avg_duration
FROM
`rccl`
)
SELECT
'RCCL_API' AS domain,
COUNT(*) AS calls,
SUM(duration) AS total_duration,
CAST(SUM(duration * duration) AS REAL) AS sqr_duration,
(
SELECT
avg_duration
FROM
rccl_avg
) AS avg_duration,
MIN(duration) AS min_duration,
MAX(duration) AS max_duration,
SUM(
(
duration - (
SELECT
avg_duration
FROM
rccl_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
rccl_avg
)
)
) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM(
(
duration - (
SELECT
avg_duration
FROM
rccl_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
rccl_avg
)
)
) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`rccl`
),
rocdecode_times AS (
WITH
rocdecode_avg AS (
SELECT
AVG(duration) AS avg_duration
FROM
`rocdecode`
)
SELECT
'ROCDECODE_API' AS domain,
COUNT(*) AS calls,
SUM(duration) AS total_duration,
CAST(SUM(duration * duration) AS REAL) AS sqr_duration,
(
SELECT
avg_duration
FROM
rocdecode_avg
) AS avg_duration,
MIN(duration) AS min_duration,
MAX(duration) AS max_duration,
SUM(
(
duration - (
SELECT
avg_duration
FROM
rocdecode_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
rocdecode_avg
)
)
) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM(
(
duration - (
SELECT
avg_duration
FROM
rocdecode_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
rocdecode_avg
)
)
) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`rocdecode`
),
rocjpeg_times AS (
WITH
rocjpeg_avg AS (
SELECT
AVG(duration) AS avg_duration
FROM
`rocjpeg`
)
SELECT
'ROCJPEG_API' AS domain,
COUNT(*) AS calls,
SUM(duration) AS total_duration,
CAST(SUM(duration * duration) AS REAL) AS sqr_duration,
(
SELECT
avg_duration
FROM
rocjpeg_avg
) AS avg_duration,
MIN(duration) AS min_duration,
MAX(duration) AS max_duration,
SUM(
(
duration - (
SELECT
avg_duration
FROM
rocjpeg_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
rocjpeg_avg
)
)
) / (COUNT(*) - 1) AS variance_duration,
SQRT(
SUM(
(
duration - (
SELECT
avg_duration
FROM
rocjpeg_avg
)
) * (
duration - (
SELECT
avg_duration
FROM
rocjpeg_avg
)
)
) / (COUNT(*) - 1)
) AS std_dev_duration
FROM
`rocjpeg`
),
all_domains AS (
SELECT
*
FROM
kernel_times
UNION ALL
SELECT
*
FROM
mcopy_times
UNION ALL
SELECT
*
FROM
malloc_times
UNION ALL
SELECT
*
FROM
scratch_times
UNION ALL
SELECT
*
FROM
hip_api_times
UNION ALL
SELECT
*
FROM
hsa_api_times
UNION ALL
SELECT
*
FROM
marker_times
UNION ALL
SELECT
*
FROM
rccl_times
UNION ALL
SELECT
*
FROM
rocdecode_times
UNION ALL
SELECT
*
FROM
rocjpeg_times
),
total_duration AS (
SELECT
SUM(total_duration) AS grand_total_duration
FROM
all_domains
)
SELECT
AD.domain AS name,
AD.calls,
AD.total_duration AS "DURATION (nsec)",
AD.sqr_duration AS "SQR (nsec)",
AD.avg_duration AS "AVERAGE (nsec)",
(CAST(AD.total_duration AS REAL) / TD.grand_total_duration) * 100 AS "PERCENT (INC)",
AD.min_duration AS "MIN (nsec)",
AD.max_duration AS "MAX (nsec)",
AD.variance_duration AS "VARIANCE",
AD.std_dev_duration AS "STD_DEV"
FROM
all_domains AD
CROSS JOIN total_duration TD
ORDER BY
AD.total_duration DESC;