Files
rocm-systems/source/share/rocprofiler-sdk-rocpd/marker_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

219 rader
4.9 KiB
SQL

--
-- Views related to markers
--
--
--
CREATE VIEW
`range_markers` AS
SELECT
E.id,
E.guid,
ST.string AS category,
JSON_EXTRACT(E.extdata, '$.message') AS name,
R.start,
R.end,
(R.end - R.start) AS duration,
E.stack_id,
E.parent_stack_id,
E.correlation_id,
E.call_stack,
E.line_info,
R.pid,
R.tid,
R.nid,
ST2.string AS operation
FROM
`rocpd_event` E
INNER JOIN `rocpd_string` ST ON ST.id = E.category_id
AND ST.guid = E.guid
INNER JOIN `rocpd_region` R ON R.event_id = E.id
AND R.guid = E.guid
INNER JOIN `rocpd_string` ST2 ON ST2.id = R.name_id
AND ST2.guid = R.guid
WHERE
ST.string LIKE '%MARKER%'
AND JSON_VALID(E.extdata);
--
--
CREATE VIEW
`single_markers` AS
SELECT
E.id,
E.guid,
ST.string AS category,
JSON_EXTRACT(E.extdata, '$.message') AS name,
S.timestamp AS timestamp,
E.stack_id,
E.parent_stack_id,
E.correlation_id,
E.call_stack,
E.line_info,
T.pid AS pid,
T.tid AS tid,
T.nid
FROM
`rocpd_event` E
INNER JOIN `rocpd_string` ST ON ST.id = E.category_id
AND ST.guid = E.guid
INNER JOIN `rocpd_sample` S ON S.event_id = E.id
AND S.guid = E.guid
INNER JOIN `rocpd_track` T ON T.id = S.track_id
AND S.guid = T.guid
WHERE
ST.string LIKE '%MARKER%';
--
--
CREATE VIEW
`markers` AS
SELECT
*
FROM
`range_markers`
UNION
SELECT
SM.id,
SM.guid,
SM.category,
SM.name,
SM.timestamp AS start,
SM.timestamp AS end,
0 AS duration,
SM.stack_id,
SM.parent_stack_id,
SM.correlation_id,
SM.call_stack,
SM.line_info,
SM.pid,
SM.tid,
SM.nid,
'roctxMarkA' AS operation
FROM
`single_markers` SM;
--
--
CREATE VIEW
`range_marker_summary` AS
WITH
avg_data AS (
SELECT
name,
AVG(duration) AS avg_duration
FROM
`range_markers`
GROUP BY
name
),
aggregated_data AS (
SELECT
RM.name,
COUNT(*) AS calls,
SUM(RM.duration) AS total_duration,
A.avg_duration AS average_duration,
MIN(RM.duration) AS min_duration,
MAX(RM.duration) AS max_duration,
SQRT(AVG((RM.duration - A.avg_duration) * (RM.duration - A.avg_duration))) AS std_dev_duration
FROM
`range_markers` RM
JOIN avg_data A ON RM.name = A.name
GROUP BY
RM.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.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.std_dev_duration AS `STD_DEV`
FROM
aggregated_data AD
CROSS JOIN total_duration TD;
--
--
CREATE VIEW
`single_marker_summary` AS
SELECT
SM.name,
COUNT(*) AS calls
FROM
`single_markers` SM
GROUP BY
SM.name;
--
-- Markers summary
CREATE VIEW
`marker_summary` AS
WITH
all_markers AS (
SELECT
name,
duration
FROM
`range_markers`
UNION ALL
SELECT
name,
0 AS duration
FROM
`single_markers`
),
avg_data AS (
SELECT
name,
AVG(duration) AS avg_duration
FROM
all_markers
GROUP BY
name
),
aggregated_data AS (
SELECT
M.name,
COUNT(*) AS calls,
SUM(M.duration) AS total_duration,
CAST(SUM(M.duration * M.duration) AS REAL) AS sqr_duration,
A.avg_duration AS average_duration,
MIN(M.duration) AS min_duration,
MAX(M.duration) AS max_duration,
AVG((M.duration - A.avg_duration) * (M.duration - A.avg_duration)) AS variance_duration,
SQRT(AVG((M.duration - A.avg_duration) * (M.duration - A.avg_duration))) AS std_dev_duration
FROM
all_markers M
JOIN avg_data A ON M.name = A.name
GROUP BY
M.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) / NULLIF(TD.grand_total_duration, 0)) * 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;