rocprofiler-sdk/cxx/serialization/save.hpp Source File

rocprofiler-sdk/cxx/serialization/save.hpp Source File#

ROCprofiler-SDK developer API: rocprofiler-sdk/cxx/serialization/save.hpp Source File
ROCprofiler-SDK developer API 1.0.0
ROCm Profiling API and tools
save.hpp
1// MIT License
2//
3// Copyright (c) 2023-2025 Advanced Micro Devices, Inc. All rights reserved.
4//
5// Permission is hereby granted, free of charge, to any person obtaining a copy
6// of this software and associated documentation files (the "Software"), to deal
7// in the Software without restriction, including without limitation the rights
8// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9// copies of the Software, and to permit persons to whom the Software is
10// furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included in all
13// copies or substantial portions of the Software.
14//
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21// SOFTWARE.
22//
23
24#pragma once
25
26#include <rocprofiler-sdk/agent.h>
27#include <rocprofiler-sdk/buffer.h>
28#include <rocprofiler-sdk/buffer_tracing.h>
29#include <rocprofiler-sdk/callback_tracing.h>
30#include <rocprofiler-sdk/context.h>
31#include <rocprofiler-sdk/counter_config.h>
32#include <rocprofiler-sdk/counters.h>
33#include <rocprofiler-sdk/device_counting_service.h>
34#include <rocprofiler-sdk/dispatch_counting_service.h>
35#include <rocprofiler-sdk/external_correlation.h>
36#include <rocprofiler-sdk/fwd.h>
37#include <rocprofiler-sdk/hip.h>
38#include <rocprofiler-sdk/hsa.h>
39#include <rocprofiler-sdk/intercept_table.h>
40#include <rocprofiler-sdk/internal_threading.h>
41#include <rocprofiler-sdk/marker.h>
42#include <rocprofiler-sdk/pc_sampling.h>
43#include <rocprofiler-sdk/cxx/container/c_array.hpp>
44#include <rocprofiler-sdk/cxx/name_info.hpp>
45#include <rocprofiler-sdk/cxx/utility.hpp>
46
47#include <cereal/archives/binary.hpp>
48#include <cereal/archives/json.hpp>
49#include <cereal/archives/portable_binary.hpp>
50#include <cereal/cereal.hpp>
51#include <cereal/types/array.hpp>
52#include <cereal/types/atomic.hpp>
53#include <cereal/types/bitset.hpp>
54#include <cereal/types/chrono.hpp>
55#include <cereal/types/common.hpp>
56#include <cereal/types/complex.hpp>
57#include <cereal/types/deque.hpp>
58#include <cereal/types/functional.hpp>
59#include <cereal/types/list.hpp>
60#include <cereal/types/map.hpp>
61#include <cereal/types/optional.hpp>
62#include <cereal/types/queue.hpp>
63#include <cereal/types/set.hpp>
64#include <cereal/types/stack.hpp>
65#include <cereal/types/string.hpp>
66#include <cereal/types/unordered_map.hpp>
67#include <cereal/types/unordered_set.hpp>
68#include <cereal/types/utility.hpp>
69#include <cereal/types/variant.hpp>
70#include <cereal/types/vector.hpp>
71
72#include <string>
73#include <string_view>
74#include <utility>
75#include <vector>
76
77#define ROCP_SDK_SAVE_DATA_FIELD(FIELD) ar(make_nvp(#FIELD, data.FIELD))
78#define ROCP_SDK_SAVE_DATA_VALUE(NAME, VALUE) ar(make_nvp(NAME, data.VALUE))
79#define ROCP_SDK_SAVE_VALUE(NAME, VALUE) ar(make_nvp(NAME, VALUE))
80#define ROCP_SDK_SAVE_DATA_CSTR(FIELD) \
81 ar(make_nvp(#FIELD, std::string{data.FIELD ? data.FIELD : ""}))
82#define ROCP_SDK_SAVE_DATA_BITFIELD(NAME, VALUE) \
83 { \
84 auto _val = data.VALUE; \
85 ar(make_nvp(NAME, _val)); \
86 }
87
88#if !defined(ROCPROFILER_SDK_CEREAL_NAMESPACE_BEGIN)
89# define ROCPROFILER_SDK_CEREAL_NAMESPACE_BEGIN \
90 namespace cereal \
91 {
92#endif
93
94#if !defined(ROCPROFILER_SDK_CEREAL_NAMESPACE_END)
95# define ROCPROFILER_SDK_CEREAL_NAMESPACE_END } // namespace cereal
96#endif
97
98namespace rocprofiler
99{
100namespace sdk
101{
102namespace serialization
103{
104struct buffer_tracing_args
105{
106 std::string type = {};
107 std::string name = {};
108 std::string value = {};
109};
110
111template <typename Tp>
112auto
113get_buffer_tracing_args(Tp& data)
114{
115 auto populate_args_array = [](rocprofiler_buffer_tracing_kind_t /*kind*/,
117 uint32_t arg_number,
118 const void* const /*arg_value_addr*/,
119 int32_t /*arg_indirection_count*/,
120 const char* arg_type,
121 const char* arg_name,
122 const char* arg_value_str,
123 void* cb_data) -> int {
124 if(!cb_data) return 1;
125
126 auto* vec = static_cast<std::vector<buffer_tracing_args>*>(cb_data);
127 auto sz = std::max<size_t>(arg_number + 1, vec->size());
128 vec->resize(sz, buffer_tracing_args{});
129 vec->at(arg_number) = buffer_tracing_args{arg_type, arg_name, arg_value_str};
130
131 return 0;
132 };
133
134 auto ret = std::vector<buffer_tracing_args>{};
135 auto record = rocprofiler_record_header_t{};
136 record.hash =
137 rocprofiler_record_header_compute_hash(ROCPROFILER_BUFFER_CATEGORY_TRACING, data.kind);
138 record.payload = &data;
139
140 rocprofiler_iterate_buffer_tracing_record_args(record, populate_args_array, &ret);
141
142 return ret;
143}
144} // namespace serialization
145} // namespace sdk
146} // namespace rocprofiler
147
148ROCPROFILER_SDK_CEREAL_NAMESPACE_BEGIN
149
150namespace sdk = ::rocprofiler::sdk;
151
152template <typename ArchiveT>
153void
154save(ArchiveT& ar, const sdk::serialization::buffer_tracing_args& data)
155{
156 ROCP_SDK_SAVE_DATA_FIELD(type);
157 ROCP_SDK_SAVE_DATA_FIELD(name);
158 ROCP_SDK_SAVE_DATA_FIELD(value);
159}
160
161template <typename ArchiveT>
162void
163save(ArchiveT& ar, rocprofiler_context_id_t data)
164{
165 ROCP_SDK_SAVE_DATA_FIELD(handle);
166}
167
168template <typename ArchiveT>
169void
170save(ArchiveT& ar, rocprofiler_agent_id_t data)
171{
172 ROCP_SDK_SAVE_DATA_FIELD(handle);
173}
174
175template <typename ArchiveT>
176void
177save(ArchiveT& ar, hsa_agent_t data)
178{
179 ROCP_SDK_SAVE_DATA_FIELD(handle);
180}
181
182template <typename ArchiveT>
183void
184save(ArchiveT& ar, rocprofiler_queue_id_t data)
185{
186 ROCP_SDK_SAVE_DATA_FIELD(handle);
187}
188
189template <typename ArchiveT>
190void
191save(ArchiveT& ar, rocprofiler_stream_id_t data)
192{
193 ROCP_SDK_SAVE_DATA_FIELD(handle);
194}
195
196template <typename ArchiveT>
197void
198save(ArchiveT& ar, rocprofiler_counter_id_t data)
199{
200 ROCP_SDK_SAVE_DATA_FIELD(handle);
201}
202
203template <typename ArchiveT>
204void
205save(ArchiveT& ar, rocprofiler_correlation_id_t data)
206{
207 ROCP_SDK_SAVE_DATA_FIELD(internal);
208 ROCP_SDK_SAVE_DATA_VALUE("external", external.value);
209 ROCP_SDK_SAVE_DATA_VALUE("ancestor", ancestor);
210}
211
212template <typename ArchiveT>
213void
214save(ArchiveT& ar, rocprofiler_async_correlation_id_t data)
215{
216 ROCP_SDK_SAVE_DATA_FIELD(internal);
217 ROCP_SDK_SAVE_DATA_VALUE("external", external.value);
218}
219
220template <typename ArchiveT>
221void
222save(ArchiveT& ar, rocprofiler_dim3_t data)
223{
224 ROCP_SDK_SAVE_DATA_FIELD(x);
225 ROCP_SDK_SAVE_DATA_FIELD(y);
226 ROCP_SDK_SAVE_DATA_FIELD(z);
227}
228
229template <typename ArchiveT>
230void
231save(ArchiveT& ar, rocprofiler_address_t data)
232{
233 ROCP_SDK_SAVE_DATA_FIELD(handle);
234}
235
236template <typename ArchiveT>
237void
239{
240 ROCP_SDK_SAVE_DATA_FIELD(size);
241 ROCP_SDK_SAVE_DATA_FIELD(code_object_id);
242 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
243 ROCP_SDK_SAVE_DATA_CSTR(uri);
244 ROCP_SDK_SAVE_DATA_FIELD(load_base);
245 ROCP_SDK_SAVE_DATA_FIELD(load_size);
246 ROCP_SDK_SAVE_DATA_FIELD(load_delta);
247 ROCP_SDK_SAVE_DATA_FIELD(storage_type);
248 if(data.storage_type == ROCPROFILER_CODE_OBJECT_STORAGE_TYPE_FILE)
249 {
250 ROCP_SDK_SAVE_DATA_FIELD(storage_file);
251 }
252 else if(data.storage_type == ROCPROFILER_CODE_OBJECT_STORAGE_TYPE_MEMORY)
253 {
254 ROCP_SDK_SAVE_DATA_FIELD(memory_base);
255 ROCP_SDK_SAVE_DATA_FIELD(memory_size);
256 }
257}
258
259template <typename ArchiveT>
260void
262{
263 ROCP_SDK_SAVE_DATA_FIELD(size);
264 ROCP_SDK_SAVE_DATA_FIELD(kernel_id);
265 ROCP_SDK_SAVE_DATA_FIELD(code_object_id);
266 ROCP_SDK_SAVE_DATA_CSTR(kernel_name);
267 ROCP_SDK_SAVE_DATA_FIELD(kernel_object);
268 ROCP_SDK_SAVE_DATA_FIELD(kernarg_segment_size);
269 ROCP_SDK_SAVE_DATA_FIELD(kernarg_segment_alignment);
270 ROCP_SDK_SAVE_DATA_FIELD(group_segment_size);
271 ROCP_SDK_SAVE_DATA_FIELD(private_segment_size);
272 ROCP_SDK_SAVE_DATA_FIELD(sgpr_count);
273 ROCP_SDK_SAVE_DATA_FIELD(arch_vgpr_count);
274 ROCP_SDK_SAVE_DATA_FIELD(accum_vgpr_count);
275 ROCP_SDK_SAVE_DATA_FIELD(kernel_code_entry_byte_offset);
276 ROCP_SDK_SAVE_DATA_FIELD(kernel_address);
277}
278
279template <typename ArchiveT>
280void
281save(ArchiveT& ar, rocprofiler_callback_tracing_code_object_host_kernel_symbol_register_data_t data)
282{
283 ROCP_SDK_SAVE_DATA_FIELD(size);
284 ROCP_SDK_SAVE_DATA_FIELD(host_function_id);
285 ROCP_SDK_SAVE_DATA_FIELD(kernel_id);
286 ROCP_SDK_SAVE_DATA_FIELD(code_object_id);
287 ROCP_SDK_SAVE_DATA_FIELD(host_function);
288 ROCP_SDK_SAVE_DATA_FIELD(modules);
289 ROCP_SDK_SAVE_DATA_CSTR(device_function);
290 ROCP_SDK_SAVE_DATA_FIELD(thread_limit);
291 ROCP_SDK_SAVE_DATA_FIELD(thread_ids);
292 ROCP_SDK_SAVE_DATA_FIELD(block_ids);
293 ROCP_SDK_SAVE_DATA_FIELD(block_dims);
294 ROCP_SDK_SAVE_DATA_FIELD(grid_dims);
295 ROCP_SDK_SAVE_DATA_FIELD(workgroup_size);
296}
297
298template <typename ArchiveT>
299void
300save(ArchiveT& ar, rocprofiler_hsa_api_retval_t data)
301{
302 ROCP_SDK_SAVE_DATA_FIELD(uint64_t_retval);
303}
304
305template <typename ArchiveT>
306void
307save(ArchiveT& ar, const hsa_queue_t& data)
308{
309 ar(make_nvp("queue_id", data.id));
310}
311
312template <typename ArchiveT>
313void
314save(ArchiveT& ar, hsa_amd_event_scratch_alloc_start_t data)
315{
316 ar(make_nvp("queue_id", *data.queue));
317 ROCP_SDK_SAVE_DATA_FIELD(dispatch_id);
318}
319
320template <typename ArchiveT>
321void
322save(ArchiveT& ar, hsa_amd_event_scratch_alloc_end_t data)
323{
324 ar(make_nvp("queue_id", *data.queue));
325 ROCP_SDK_SAVE_DATA_FIELD(dispatch_id);
326 ROCP_SDK_SAVE_DATA_FIELD(size);
327 ROCP_SDK_SAVE_DATA_FIELD(num_slots);
328 ROCP_SDK_SAVE_DATA_FIELD(flags);
329}
330
331template <typename ArchiveT>
332void
333save(ArchiveT& ar, hsa_amd_event_scratch_free_start_t data)
334{
335 ar(make_nvp("queue_id", *data.queue));
336}
337
338template <typename ArchiveT>
339void
340save(ArchiveT& ar, hsa_amd_event_scratch_free_end_t data)
341{
342 ar(make_nvp("queue_id", *data.queue));
343 ROCP_SDK_SAVE_DATA_FIELD(flags);
344}
345
346template <typename ArchiveT>
347void
348save(ArchiveT& ar, hsa_amd_event_scratch_async_reclaim_start_t data)
349{
350 ar(make_nvp("queue_id", *data.queue));
351}
352
353template <typename ArchiveT>
354void
355save(ArchiveT& ar, hsa_amd_event_scratch_async_reclaim_end_t data)
356{
357 ar(make_nvp("queue_id", *data.queue));
358 ROCP_SDK_SAVE_DATA_FIELD(flags);
359}
360
361template <typename ArchiveT>
362void
363save(ArchiveT& ar, rocprofiler_marker_api_retval_t data)
364{
365 ROCP_SDK_SAVE_DATA_FIELD(int64_t_retval);
366}
367
368template <typename ArchiveT>
369void
370save(ArchiveT& ar, rocprofiler_callback_tracing_hsa_api_data_t data)
371{
372 ROCP_SDK_SAVE_DATA_FIELD(size);
373 // ROCP_SDK_SAVE_DATA_FIELD(args);
374 ROCP_SDK_SAVE_DATA_FIELD(retval);
375}
376
377template <typename ArchiveT>
378void
380{
381 ROCP_SDK_SAVE_DATA_FIELD(size);
382 // ROCP_SDK_SAVE_DATA_FIELD(args);
383 ROCP_SDK_SAVE_DATA_FIELD(retval);
384}
385
386template <typename ArchiveT>
387void
388save(ArchiveT& ar, rocprofiler_hip_api_retval_t data)
389{
390 ROCP_SDK_SAVE_DATA_FIELD(uint64_t_retval);
391}
392
393template <typename ArchiveT>
394void
395save(ArchiveT& ar, rocprofiler_callback_tracing_hip_api_data_t data)
396{
397 ROCP_SDK_SAVE_DATA_FIELD(size);
398 // ROCP_SDK_SAVE_DATA_FIELD(args);
399 ROCP_SDK_SAVE_DATA_FIELD(retval);
400}
401
402template <typename ArchiveT>
403void
405{
406 ROCP_SDK_SAVE_DATA_FIELD(size);
407 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
408 ROCP_SDK_SAVE_DATA_FIELD(queue_id);
409 ROCP_SDK_SAVE_DATA_FIELD(flags);
410 ROCP_SDK_SAVE_DATA_FIELD(args_kind);
411}
412
413template <typename ArchiveT>
414void
415save(ArchiveT& ar, rocprofiler_kernel_dispatch_info_t data)
416{
417 ROCP_SDK_SAVE_DATA_FIELD(size);
418 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
419 ROCP_SDK_SAVE_DATA_FIELD(queue_id);
420 ROCP_SDK_SAVE_DATA_FIELD(kernel_id);
421 ROCP_SDK_SAVE_DATA_FIELD(dispatch_id);
422 ROCP_SDK_SAVE_DATA_FIELD(private_segment_size);
423 ROCP_SDK_SAVE_DATA_FIELD(group_segment_size);
424 ROCP_SDK_SAVE_DATA_FIELD(workgroup_size);
425 ROCP_SDK_SAVE_DATA_FIELD(grid_size);
426}
427
428template <typename ArchiveT>
429void
431{
432 ROCP_SDK_SAVE_DATA_FIELD(size);
433 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
434 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
435 ROCP_SDK_SAVE_DATA_FIELD(dispatch_info);
436}
437
438template <typename ArchiveT>
439void
441{
442 ROCP_SDK_SAVE_DATA_FIELD(size);
443 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
444 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
445 ROCP_SDK_SAVE_DATA_FIELD(dst_agent_id);
446 ROCP_SDK_SAVE_DATA_FIELD(src_agent_id);
447 ROCP_SDK_SAVE_DATA_FIELD(bytes);
448}
449
450template <typename ArchiveT>
451void
453{
454 ROCP_SDK_SAVE_DATA_FIELD(size);
455 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
456 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
457 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
458 ROCP_SDK_SAVE_VALUE("address", rocprofiler::sdk::utility::as_hex(data.address.handle, 16));
459 ROCP_SDK_SAVE_DATA_FIELD(allocation_size);
460}
461
462template <typename ArchiveT>
463void
464save(ArchiveT& ar, rocprofiler_rccl_api_retval_t data)
465{
466 ROCP_SDK_SAVE_DATA_FIELD(ncclResult_t_retval);
467}
468
469template <typename ArchiveT>
470void
472{
473 ROCP_SDK_SAVE_DATA_FIELD(size);
474 // ROCP_SDK_SAVE_DATA_FIELD(args);
475 ROCP_SDK_SAVE_DATA_FIELD(retval);
476}
477
478template <typename ArchiveT>
479void
480save(ArchiveT& ar, rocprofiler_rocdecode_api_retval_t data)
481{
482 ROCP_SDK_SAVE_DATA_FIELD(uint64_t_retval);
483}
484
485template <typename ArchiveT>
486void
488{
489 ROCP_SDK_SAVE_DATA_FIELD(size);
490 ROCP_SDK_SAVE_DATA_FIELD(retval);
491}
492
493template <typename ArchiveT>
494void
495save(ArchiveT& ar, rocprofiler_rocjpeg_api_retval_t data)
496{
497 ROCP_SDK_SAVE_DATA_FIELD(rocJpegStatus_retval);
498}
499
500template <typename ArchiveT>
501void
503{
504 ROCP_SDK_SAVE_DATA_FIELD(size);
505 ROCP_SDK_SAVE_DATA_FIELD(retval);
506}
507
508template <typename ArchiveT>
509void
510save(ArchiveT& ar, rocprofiler_callback_tracing_ompt_data_t data)
511{
512 ROCP_SDK_SAVE_DATA_FIELD(size);
513 // ROCP_SDK_SAVE_DATA_FIELD(args);
514}
515
516template <typename ArchiveT>
517void
519{
520 ROCP_SDK_SAVE_DATA_FIELD(size);
521 ROCP_SDK_SAVE_DATA_FIELD(correlation_id);
522 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
523 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
524 ROCP_SDK_SAVE_DATA_FIELD(dispatch_info);
525}
526
527template <typename ArchiveT>
528void
530{
531 ROCP_SDK_SAVE_DATA_FIELD(size);
532 ROCP_SDK_SAVE_DATA_FIELD(num_records);
533 ROCP_SDK_SAVE_DATA_FIELD(correlation_id);
534 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
535 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
536 ROCP_SDK_SAVE_DATA_FIELD(dispatch_info);
537}
538
539template <typename ArchiveT>
540void
541save(ArchiveT& ar, rocprofiler_callback_tracing_record_t data)
542{
543 ROCP_SDK_SAVE_DATA_FIELD(context_id);
544 ROCP_SDK_SAVE_DATA_FIELD(thread_id);
545 ROCP_SDK_SAVE_DATA_FIELD(kind);
546 ROCP_SDK_SAVE_DATA_FIELD(operation);
547 ROCP_SDK_SAVE_DATA_FIELD(correlation_id);
548 ROCP_SDK_SAVE_DATA_FIELD(phase);
549}
550
551template <typename ArchiveT, typename Tp>
552void
553save_buffer_tracing_api_record(ArchiveT& ar, Tp data)
554{
555 ROCP_SDK_SAVE_DATA_FIELD(size);
556 ROCP_SDK_SAVE_DATA_FIELD(kind);
557 ROCP_SDK_SAVE_DATA_FIELD(operation);
558 ROCP_SDK_SAVE_DATA_FIELD(correlation_id);
559 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
560 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
561 ROCP_SDK_SAVE_DATA_FIELD(thread_id);
562}
563
564template <typename ArchiveT>
565void
566save(ArchiveT& ar, rocprofiler_buffer_tracing_hsa_api_record_t data)
567{
568 save_buffer_tracing_api_record(ar, data);
569}
570
571template <typename ArchiveT>
572void
573save(ArchiveT& ar, rocprofiler_counter_record_t data)
574{
575 ROCP_SDK_SAVE_DATA_FIELD(id);
576 ROCP_SDK_SAVE_DATA_FIELD(counter_value);
577 ROCP_SDK_SAVE_DATA_FIELD(dispatch_id);
578}
579
580template <typename ArchiveT>
581void
582save(ArchiveT& ar, rocprofiler_buffer_tracing_hip_api_record_t data)
583{
584 save_buffer_tracing_api_record(ar, data);
585}
586
587template <typename ArchiveT>
588void
590{
591 save_buffer_tracing_api_record(ar, data);
592 auto args = sdk::serialization::get_buffer_tracing_args(data);
593 ROCP_SDK_SAVE_VALUE("args", args);
594 ROCP_SDK_SAVE_DATA_FIELD(retval);
595}
596
597template <typename ArchiveT>
598void
600{
601 save_buffer_tracing_api_record(ar, data);
602}
603
604template <typename ArchiveT>
605void
607{
608 save_buffer_tracing_api_record(ar, data);
609}
610
611template <typename ArchiveT>
612void
614{
615 save_buffer_tracing_api_record(ar, data);
616}
617
618template <typename ArchiveT>
619void
621{
622 save_buffer_tracing_api_record(ar, data);
623 auto args = sdk::serialization::get_buffer_tracing_args(data);
624 ROCP_SDK_SAVE_VALUE("args", args);
625 ROCP_SDK_SAVE_DATA_FIELD(retval);
626}
627
628template <typename ArchiveT>
629void
631{
632 save_buffer_tracing_api_record(ar, data);
633}
634
635template <typename ArchiveT>
636void
637save(ArchiveT& ar, rocprofiler_buffer_tracing_ompt_target_t data)
638{
639 ROCP_SDK_SAVE_DATA_VALUE("kind", kind);
640 ROCP_SDK_SAVE_DATA_VALUE("device", device_num);
641 ROCP_SDK_SAVE_DATA_VALUE("task_id", task_id);
642 ROCP_SDK_SAVE_DATA_VALUE("target_id", target_id);
643}
644
645template <typename ArchiveT>
646void
647save(ArchiveT& ar, rocprofiler_buffer_tracing_ompt_target_data_op_t data)
648{
649 ROCP_SDK_SAVE_DATA_VALUE("host_op_id", host_op_id);
650 ROCP_SDK_SAVE_DATA_VALUE("optype", optype);
651 ROCP_SDK_SAVE_DATA_VALUE("src_device_num", src_device_num);
652 ROCP_SDK_SAVE_DATA_VALUE("dst_device_num", dst_device_num);
653 ROCP_SDK_SAVE_DATA_VALUE("bytes", bytes);
654}
655
656template <typename ArchiveT>
657void
658save(ArchiveT& ar, rocprofiler_buffer_tracing_ompt_target_kernel_t data)
659{
660 ROCP_SDK_SAVE_DATA_VALUE("host_op_id", host_op_id);
661 ROCP_SDK_SAVE_DATA_VALUE("device_num", device_num);
662 ROCP_SDK_SAVE_DATA_VALUE("requested_num_teams", requested_num_teams);
663}
664
665template <typename ArchiveT>
666void
667save(ArchiveT& ar, rocprofiler_buffer_tracing_ompt_record_t data)
668{
669 save_buffer_tracing_api_record(ar, data);
670
671 if(data.operation == ROCPROFILER_OMPT_ID_target_emi)
672 {
673 ROCP_SDK_SAVE_DATA_FIELD(target);
674 }
675 else if(data.operation == ROCPROFILER_OMPT_ID_target_data_op_emi)
676 {
677 ROCP_SDK_SAVE_DATA_FIELD(target_data_op);
678 }
679 else if(data.operation == ROCPROFILER_OMPT_ID_target_submit_emi)
680 {
681 ROCP_SDK_SAVE_DATA_FIELD(target_kernel);
682 }
683}
684
685template <typename ArchiveT>
686void
688{
689 ROCP_SDK_SAVE_DATA_FIELD(size);
690 ROCP_SDK_SAVE_DATA_FIELD(kind);
691 ROCP_SDK_SAVE_DATA_FIELD(operation);
692 ROCP_SDK_SAVE_DATA_FIELD(thread_id);
693 ROCP_SDK_SAVE_DATA_FIELD(correlation_id);
694 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
695 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
696 ROCP_SDK_SAVE_DATA_FIELD(dispatch_info);
697}
698
699template <typename ArchiveT>
700void
702{
703 ROCP_SDK_SAVE_DATA_FIELD(size);
704 ROCP_SDK_SAVE_DATA_FIELD(kind);
705 ROCP_SDK_SAVE_DATA_FIELD(operation);
706 ROCP_SDK_SAVE_DATA_FIELD(thread_id);
707 ROCP_SDK_SAVE_DATA_FIELD(correlation_id);
708 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
709 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
710 ROCP_SDK_SAVE_DATA_FIELD(dst_agent_id);
711 ROCP_SDK_SAVE_DATA_FIELD(src_agent_id);
712 ROCP_SDK_SAVE_DATA_FIELD(bytes);
713}
714
715template <typename ArchiveT>
716void
718{
719 ROCP_SDK_SAVE_DATA_FIELD(size);
720 ROCP_SDK_SAVE_DATA_FIELD(kind);
721 ROCP_SDK_SAVE_DATA_FIELD(operation);
722 ROCP_SDK_SAVE_DATA_FIELD(thread_id);
723 ROCP_SDK_SAVE_DATA_FIELD(correlation_id);
724 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
725 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
726 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
727 ROCP_SDK_SAVE_VALUE("address", rocprofiler::sdk::utility::as_hex(data.address.handle, 16));
728 ROCP_SDK_SAVE_DATA_FIELD(allocation_size);
729}
730
731template <typename ArchiveT>
732void
734{
735 ROCP_SDK_SAVE_DATA_FIELD(size);
736 ROCP_SDK_SAVE_DATA_FIELD(operation);
737 ROCP_SDK_SAVE_DATA_FIELD(timestamp);
738 ROCP_SDK_SAVE_DATA_FIELD(pid);
739 ROCP_SDK_SAVE_DATA_FIELD(start_address);
740 ROCP_SDK_SAVE_DATA_FIELD(end_address);
741 ROCP_SDK_SAVE_DATA_FIELD(src_agent);
742 ROCP_SDK_SAVE_DATA_FIELD(dst_agent);
743 ROCP_SDK_SAVE_DATA_FIELD(prefetch_agent);
744 ROCP_SDK_SAVE_DATA_FIELD(preferred_agent);
745 ROCP_SDK_SAVE_DATA_FIELD(error_code);
746}
747
748template <typename ArchiveT>
749void
751{
752 ROCP_SDK_SAVE_DATA_FIELD(size);
753 ROCP_SDK_SAVE_DATA_FIELD(operation);
754 ROCP_SDK_SAVE_DATA_FIELD(timestamp);
755 ROCP_SDK_SAVE_DATA_FIELD(pid);
756 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
757 ROCP_SDK_SAVE_DATA_FIELD(address);
758}
759
760template <typename ArchiveT>
761void
763{
764 ROCP_SDK_SAVE_DATA_FIELD(size);
765 ROCP_SDK_SAVE_DATA_FIELD(operation);
766 ROCP_SDK_SAVE_DATA_FIELD(timestamp);
767 ROCP_SDK_SAVE_DATA_FIELD(pid);
768 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
769}
770
771template <typename ArchiveT>
772void
774{
775 ROCP_SDK_SAVE_DATA_FIELD(size);
776 ROCP_SDK_SAVE_DATA_FIELD(operation);
777 ROCP_SDK_SAVE_DATA_FIELD(timestamp);
778 ROCP_SDK_SAVE_DATA_FIELD(pid);
779 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
780 ROCP_SDK_SAVE_DATA_FIELD(start_address);
781 ROCP_SDK_SAVE_DATA_FIELD(end_address);
782}
783
784template <typename ArchiveT>
785void
787{
788 ROCP_SDK_SAVE_DATA_FIELD(size);
789 ROCP_SDK_SAVE_DATA_FIELD(operation);
790 ROCP_SDK_SAVE_DATA_FIELD(timestamp);
791 ROCP_SDK_SAVE_DATA_FIELD(pid);
792 ROCP_SDK_SAVE_DATA_FIELD(count);
793}
794
795template <typename ArchiveT>
796void
798{
799 ROCP_SDK_SAVE_DATA_FIELD(size);
800 ROCP_SDK_SAVE_DATA_FIELD(operation);
801 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
802 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
803 ROCP_SDK_SAVE_DATA_FIELD(pid);
804 ROCP_SDK_SAVE_DATA_FIELD(start_address);
805 ROCP_SDK_SAVE_DATA_FIELD(end_address);
806 ROCP_SDK_SAVE_DATA_FIELD(src_agent);
807 ROCP_SDK_SAVE_DATA_FIELD(dst_agent);
808 ROCP_SDK_SAVE_DATA_FIELD(prefetch_agent);
809 ROCP_SDK_SAVE_DATA_FIELD(preferred_agent);
810 ROCP_SDK_SAVE_DATA_FIELD(error_code);
811}
812
813template <typename ArchiveT>
814void
816{
817 ROCP_SDK_SAVE_DATA_FIELD(size);
818 ROCP_SDK_SAVE_DATA_FIELD(operation);
819 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
820 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
821 ROCP_SDK_SAVE_DATA_FIELD(pid);
822 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
823 ROCP_SDK_SAVE_DATA_FIELD(address);
824}
825
826template <typename ArchiveT>
827void
829{
830 ROCP_SDK_SAVE_DATA_FIELD(size);
831 ROCP_SDK_SAVE_DATA_FIELD(operation);
832 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
833 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
834 ROCP_SDK_SAVE_DATA_FIELD(pid);
835 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
836}
837
838template <typename ArchiveT>
839void
841{
842 ROCP_SDK_SAVE_DATA_FIELD(size);
843 ROCP_SDK_SAVE_DATA_FIELD(kind);
844 ROCP_SDK_SAVE_DATA_FIELD(operation);
845 ROCP_SDK_SAVE_DATA_FIELD(agent_id);
846 ROCP_SDK_SAVE_DATA_FIELD(queue_id);
847 ROCP_SDK_SAVE_DATA_FIELD(thread_id);
848 ROCP_SDK_SAVE_DATA_FIELD(start_timestamp);
849 ROCP_SDK_SAVE_DATA_FIELD(end_timestamp);
850 ROCP_SDK_SAVE_DATA_FIELD(correlation_id);
851 ROCP_SDK_SAVE_DATA_FIELD(flags);
852 ROCP_SDK_SAVE_DATA_FIELD(allocation_size);
853}
854
855template <typename ArchiveT>
856void
858{
859 ROCP_SDK_SAVE_DATA_FIELD(size);
860 ROCP_SDK_SAVE_DATA_FIELD(kind);
861 ROCP_SDK_SAVE_DATA_FIELD(timestamp);
862 ROCP_SDK_SAVE_DATA_FIELD(internal_correlation_id);
863}
864
865template <typename ArchiveT>
866void
867save(ArchiveT& ar, HsaCacheType data)
868{
869 ROCP_SDK_SAVE_DATA_BITFIELD("Data", ui32.Data);
870 ROCP_SDK_SAVE_DATA_BITFIELD("Instruction", ui32.Instruction);
871 ROCP_SDK_SAVE_DATA_BITFIELD("CPU", ui32.CPU);
872 ROCP_SDK_SAVE_DATA_BITFIELD("HSACU", ui32.HSACU);
873}
874
875template <typename ArchiveT>
876void
877save(ArchiveT& ar, HSA_LINKPROPERTY data)
878{
879 ROCP_SDK_SAVE_DATA_BITFIELD("Override", ui32.Override);
880 ROCP_SDK_SAVE_DATA_BITFIELD("NonCoherent", ui32.NonCoherent);
881 ROCP_SDK_SAVE_DATA_BITFIELD("NoAtomics32bit", ui32.NoAtomics32bit);
882 ROCP_SDK_SAVE_DATA_BITFIELD("NoAtomics64bit", ui32.NoAtomics64bit);
883 ROCP_SDK_SAVE_DATA_BITFIELD("NoPeerToPeerDMA", ui32.NoPeerToPeerDMA);
884}
885
886template <typename ArchiveT>
887void
888save(ArchiveT& ar, HSA_CAPABILITY data)
889{
890 ROCP_SDK_SAVE_DATA_BITFIELD("HotPluggable", ui32.HotPluggable);
891 ROCP_SDK_SAVE_DATA_BITFIELD("HSAMMUPresent", ui32.HSAMMUPresent);
892 ROCP_SDK_SAVE_DATA_BITFIELD("SharedWithGraphics", ui32.SharedWithGraphics);
893 ROCP_SDK_SAVE_DATA_BITFIELD("QueueSizePowerOfTwo", ui32.QueueSizePowerOfTwo);
894 ROCP_SDK_SAVE_DATA_BITFIELD("QueueSize32bit", ui32.QueueSize32bit);
895 ROCP_SDK_SAVE_DATA_BITFIELD("QueueIdleEvent", ui32.QueueIdleEvent);
896 ROCP_SDK_SAVE_DATA_BITFIELD("VALimit", ui32.VALimit);
897 ROCP_SDK_SAVE_DATA_BITFIELD("WatchPointsSupported", ui32.WatchPointsSupported);
898 ROCP_SDK_SAVE_DATA_BITFIELD("WatchPointsTotalBits", ui32.WatchPointsTotalBits);
899 ROCP_SDK_SAVE_DATA_BITFIELD("DoorbellType", ui32.DoorbellType);
900 ROCP_SDK_SAVE_DATA_BITFIELD("AQLQueueDoubleMap", ui32.AQLQueueDoubleMap);
901 ROCP_SDK_SAVE_DATA_BITFIELD("DebugTrapSupported", ui32.DebugTrapSupported);
902 ROCP_SDK_SAVE_DATA_BITFIELD("WaveLaunchTrapOverrideSupported",
903 ui32.WaveLaunchTrapOverrideSupported);
904 ROCP_SDK_SAVE_DATA_BITFIELD("WaveLaunchModeSupported", ui32.WaveLaunchModeSupported);
905 ROCP_SDK_SAVE_DATA_BITFIELD("PreciseMemoryOperationsSupported",
906 ui32.PreciseMemoryOperationsSupported);
907 ROCP_SDK_SAVE_DATA_BITFIELD("DEPRECATED_SRAM_EDCSupport", ui32.DEPRECATED_SRAM_EDCSupport);
908 ROCP_SDK_SAVE_DATA_BITFIELD("Mem_EDCSupport", ui32.Mem_EDCSupport);
909 ROCP_SDK_SAVE_DATA_BITFIELD("RASEventNotify", ui32.RASEventNotify);
910 ROCP_SDK_SAVE_DATA_BITFIELD("ASICRevision", ui32.ASICRevision);
911 ROCP_SDK_SAVE_DATA_BITFIELD("SRAM_EDCSupport", ui32.SRAM_EDCSupport);
912 ROCP_SDK_SAVE_DATA_BITFIELD("SVMAPISupported", ui32.SVMAPISupported);
913 ROCP_SDK_SAVE_DATA_BITFIELD("CoherentHostAccess", ui32.CoherentHostAccess);
914 ROCP_SDK_SAVE_DATA_BITFIELD("DebugSupportedFirmware", ui32.DebugSupportedFirmware);
915}
916
917template <typename ArchiveT>
918void
919save(ArchiveT& ar, HSA_MEMORYPROPERTY data)
920{
921 ROCP_SDK_SAVE_DATA_BITFIELD("HotPluggable", ui32.HotPluggable);
922 ROCP_SDK_SAVE_DATA_BITFIELD("NonVolatile", ui32.NonVolatile);
923}
924
925template <typename ArchiveT>
926void
927save(ArchiveT& ar, HSA_ENGINE_VERSION data)
928{
929 ROCP_SDK_SAVE_DATA_BITFIELD("uCodeSDMA", uCodeSDMA);
930 ROCP_SDK_SAVE_DATA_BITFIELD("uCodeRes", uCodeRes);
931}
932
933template <typename ArchiveT>
934void
935save(ArchiveT& ar, HSA_ENGINE_ID data)
936{
937 ROCP_SDK_SAVE_DATA_BITFIELD("uCode", ui32.uCode);
938 ROCP_SDK_SAVE_DATA_BITFIELD("Major", ui32.Major);
939 ROCP_SDK_SAVE_DATA_BITFIELD("Minor", ui32.Minor);
940 ROCP_SDK_SAVE_DATA_BITFIELD("Stepping", ui32.Stepping);
941}
942
943template <typename ArchiveT>
944void
945save(ArchiveT& ar, rocprofiler_agent_cache_t data)
946{
947 ROCP_SDK_SAVE_DATA_FIELD(processor_id_low);
948 ROCP_SDK_SAVE_DATA_FIELD(size);
949 ROCP_SDK_SAVE_DATA_FIELD(level);
950 ROCP_SDK_SAVE_DATA_FIELD(cache_line_size);
951 ROCP_SDK_SAVE_DATA_FIELD(cache_lines_per_tag);
952 ROCP_SDK_SAVE_DATA_FIELD(association);
953 ROCP_SDK_SAVE_DATA_FIELD(latency);
954 ROCP_SDK_SAVE_DATA_FIELD(type);
955}
956template <typename ArchiveT>
957void
958save(ArchiveT& ar, rocprofiler_pc_t data)
959{
960 ROCP_SDK_SAVE_DATA_FIELD(code_object_id);
961 ROCP_SDK_SAVE_DATA_FIELD(code_object_offset);
962}
963
964template <typename ArchiveT>
965void
966save(ArchiveT& ar, rocprofiler_pc_sampling_hw_id_v0_t data)
967{
968 ROCP_SDK_SAVE_DATA_BITFIELD("chiplet", chiplet);
969 ROCP_SDK_SAVE_DATA_BITFIELD("wave_id", wave_id);
970 ROCP_SDK_SAVE_DATA_BITFIELD("simd_id", simd_id);
971 ROCP_SDK_SAVE_DATA_BITFIELD("pipe_id", pipe_id);
972 ROCP_SDK_SAVE_DATA_BITFIELD("cu_or_wgp_id", cu_or_wgp_id);
973 ROCP_SDK_SAVE_DATA_BITFIELD("shader_array_id", shader_array_id);
974 ROCP_SDK_SAVE_DATA_BITFIELD("shader_engine_id", shader_engine_id);
975 ROCP_SDK_SAVE_DATA_BITFIELD("workgroup_id ", workgroup_id);
976 ROCP_SDK_SAVE_DATA_BITFIELD("vm_id", vm_id);
977 ROCP_SDK_SAVE_DATA_BITFIELD("queue_id", queue_id);
978 ROCP_SDK_SAVE_DATA_BITFIELD("microengine_id", microengine_id);
979}
980
981template <typename ArchiveT>
982void
984{
985 ROCP_SDK_SAVE_DATA_FIELD(hw_id);
986 ROCP_SDK_SAVE_DATA_FIELD(pc);
987 ROCP_SDK_SAVE_DATA_FIELD(exec_mask);
988 ROCP_SDK_SAVE_DATA_FIELD(timestamp);
989 ROCP_SDK_SAVE_DATA_FIELD(dispatch_id);
990 ROCP_SDK_SAVE_DATA_VALUE("corr_id", correlation_id);
991 ROCP_SDK_SAVE_DATA_VALUE("wrkgrp_id", workgroup_id);
992 ROCP_SDK_SAVE_DATA_BITFIELD("wave_in_grp", wave_in_group);
993}
994
995template <typename ArchiveT>
996void
998{
999 ROCP_SDK_SAVE_DATA_BITFIELD("has_mem_cnt", has_memory_counter);
1000}
1001
1002template <typename ArchiveT>
1003void
1004save_pc_sampling_inst_type(ArchiveT& ar, rocprofiler_pc_sampling_instruction_type_t inst_type)
1005{
1006 ar(make_nvp("inst_type",
1007 std::string(rocprofiler_get_pc_sampling_instruction_type_name(inst_type))));
1008}
1009
1010template <typename ArchiveT>
1011void
1012save_pc_sampling_stall_reason(ArchiveT& ar,
1014{
1015 ar(make_nvp(
1016 "stall_reason",
1018}
1019
1020template <typename ArchiveT>
1021void
1022save(ArchiveT& ar, rocprofiler_pc_sampling_snapshot_v0_t data)
1023{
1024 save_pc_sampling_stall_reason(
1025 ar,
1027 data.reason_not_issued));
1028
1029 ROCP_SDK_SAVE_DATA_BITFIELD("dual_issue_valu", dual_issue_valu);
1030
1031 // Arb state (pipe issued)
1032 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_issue_valu", arb_state_issue_valu);
1033 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_issue_matrix", arb_state_issue_matrix);
1034 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_issue_lds", arb_state_issue_lds);
1035 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_issue_lds_direct", arb_state_issue_lds_direct);
1036 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_issue_scalar", arb_state_issue_scalar);
1037 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_issue_vmem_tex", arb_state_issue_vmem_tex);
1038 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_issue_flat", arb_state_issue_flat);
1039 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_issue_exp", arb_state_issue_exp);
1040 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_issue_misc", arb_state_issue_misc);
1041 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_issue_brmsg", arb_state_issue_brmsg);
1042 // Arb state (pipe stalled)
1043 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_stall_valu", arb_state_stall_valu);
1044 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_stall_matrix", arb_state_stall_matrix);
1045 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_stall_lds", arb_state_stall_lds);
1046 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_stall_lds_direct", arb_state_stall_lds_direct);
1047 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_stall_scalar", arb_state_stall_scalar);
1048 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_stall_vmem_tex", arb_state_stall_vmem_tex);
1049 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_stall_flat", arb_state_stall_flat);
1050 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_stall_exp", arb_state_stall_exp);
1051 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_stall_misc", arb_state_stall_misc);
1052 ROCP_SDK_SAVE_DATA_BITFIELD("arb_state_stall_brmsg", arb_state_stall_brmsg);
1053}
1054
1055template <typename ArchiveT>
1056void
1057save(ArchiveT& ar, rocprofiler_pc_sampling_memory_counters_t data)
1058{
1059 ROCP_SDK_SAVE_DATA_BITFIELD("load_cnt", load_cnt);
1060 ROCP_SDK_SAVE_DATA_BITFIELD("store_cnt", store_cnt);
1061 ROCP_SDK_SAVE_DATA_BITFIELD("bvh_cnt", bvh_cnt);
1062 ROCP_SDK_SAVE_DATA_BITFIELD("sample_cnt", sample_cnt);
1063 ROCP_SDK_SAVE_DATA_BITFIELD("ds_cnt", ds_cnt);
1064 ROCP_SDK_SAVE_DATA_BITFIELD("km_cnt", km_cnt);
1065}
1066
1067template <typename ArchiveT>
1068void
1070{
1071 // flags specific for stochastic sampling
1072 ROCP_SDK_SAVE_DATA_FIELD(flags);
1073
1074 // Common for host-trap and stochastic
1075 ROCP_SDK_SAVE_DATA_FIELD(hw_id);
1076 ROCP_SDK_SAVE_DATA_FIELD(pc);
1077 ROCP_SDK_SAVE_DATA_FIELD(exec_mask);
1078 ROCP_SDK_SAVE_DATA_FIELD(timestamp);
1079 ROCP_SDK_SAVE_DATA_FIELD(dispatch_id);
1080 ROCP_SDK_SAVE_DATA_VALUE("corr_id", correlation_id);
1081 ROCP_SDK_SAVE_DATA_VALUE("wrkgrp_id", workgroup_id);
1082 ROCP_SDK_SAVE_DATA_BITFIELD("wave_in_grp", wave_in_group);
1083
1084 // fields specific for stochastic
1085 ROCP_SDK_SAVE_DATA_BITFIELD("wave_issued", wave_issued);
1086 save_pc_sampling_inst_type(
1088 ROCP_SDK_SAVE_DATA_BITFIELD("wave_cnt", wave_count);
1089 ROCP_SDK_SAVE_DATA_FIELD(snapshot);
1090
1091 // serializing memory counters only if they exist
1092 if(data.flags.has_memory_counter)
1093 {
1094 ROCP_SDK_SAVE_DATA_FIELD(memory_counters);
1095 }
1096}
1097
1098template <typename ArchiveT>
1099void
1100save(ArchiveT& ar, rocprofiler_agent_io_link_t data)
1101{
1102 ROCP_SDK_SAVE_DATA_FIELD(type);
1103 ROCP_SDK_SAVE_DATA_FIELD(version_major);
1104 ROCP_SDK_SAVE_DATA_FIELD(version_minor);
1105 ROCP_SDK_SAVE_DATA_FIELD(node_from);
1106 ROCP_SDK_SAVE_DATA_FIELD(node_to);
1107 ROCP_SDK_SAVE_DATA_FIELD(weight);
1108 ROCP_SDK_SAVE_DATA_FIELD(min_latency);
1109 ROCP_SDK_SAVE_DATA_FIELD(max_latency);
1110 ROCP_SDK_SAVE_DATA_FIELD(min_bandwidth);
1111 ROCP_SDK_SAVE_DATA_FIELD(max_bandwidth);
1112 ROCP_SDK_SAVE_DATA_FIELD(recommended_transfer_size);
1113 ROCP_SDK_SAVE_DATA_FIELD(flags);
1114}
1115
1116template <typename ArchiveT>
1117void
1118save(ArchiveT& ar, rocprofiler_agent_mem_bank_t data)
1119{
1120 ROCP_SDK_SAVE_DATA_FIELD(heap_type);
1121 ROCP_SDK_SAVE_DATA_FIELD(flags);
1122 ROCP_SDK_SAVE_DATA_FIELD(width);
1123 ROCP_SDK_SAVE_DATA_FIELD(mem_clk_max);
1124 ROCP_SDK_SAVE_DATA_FIELD(size_in_bytes);
1125}
1126
1127template <typename ArchiveT>
1128void
1129save(ArchiveT& ar, rocprofiler_pc_sampling_configuration_t data)
1130{
1131 ROCP_SDK_SAVE_DATA_FIELD(method);
1132 ROCP_SDK_SAVE_DATA_FIELD(unit);
1133 ROCP_SDK_SAVE_DATA_FIELD(min_interval);
1134 ROCP_SDK_SAVE_DATA_FIELD(max_interval);
1135 ROCP_SDK_SAVE_DATA_FIELD(flags);
1136}
1137
1138template <typename ArchiveT>
1139void
1140save(ArchiveT& ar, rocprofiler_agent_runtime_visiblity_t data)
1141{
1142 ROCP_SDK_SAVE_DATA_BITFIELD("hsa", hsa);
1143 ROCP_SDK_SAVE_DATA_BITFIELD("hip", hip);
1144 ROCP_SDK_SAVE_DATA_BITFIELD("rccl", rccl);
1145 ROCP_SDK_SAVE_DATA_BITFIELD("rocdecode", rocdecode);
1146}
1147
1148template <typename ArchiveT>
1149void
1150save(ArchiveT& ar, rocprofiler_uuid_t data)
1151{
1152 ROCP_SDK_SAVE_DATA_FIELD(bytes);
1153}
1154
1155template <typename ArchiveT>
1156void
1157save(ArchiveT& ar, const rocprofiler_agent_v0_t& data)
1158{
1159 ROCP_SDK_SAVE_DATA_FIELD(size);
1160 ROCP_SDK_SAVE_DATA_FIELD(id);
1161 ROCP_SDK_SAVE_DATA_FIELD(type);
1162 ROCP_SDK_SAVE_DATA_FIELD(cpu_cores_count);
1163 ROCP_SDK_SAVE_DATA_FIELD(simd_count);
1164 ROCP_SDK_SAVE_DATA_FIELD(mem_banks_count);
1165 ROCP_SDK_SAVE_DATA_FIELD(caches_count);
1166 ROCP_SDK_SAVE_DATA_FIELD(io_links_count);
1167 ROCP_SDK_SAVE_DATA_FIELD(cpu_core_id_base);
1168 ROCP_SDK_SAVE_DATA_FIELD(simd_id_base);
1169 ROCP_SDK_SAVE_DATA_FIELD(max_waves_per_simd);
1170 ROCP_SDK_SAVE_DATA_FIELD(lds_size_in_kb);
1171 ROCP_SDK_SAVE_DATA_FIELD(gds_size_in_kb);
1172 ROCP_SDK_SAVE_DATA_FIELD(num_gws);
1173 ROCP_SDK_SAVE_DATA_FIELD(wave_front_size);
1174 ROCP_SDK_SAVE_DATA_FIELD(num_xcc);
1175 ROCP_SDK_SAVE_DATA_FIELD(cu_count);
1176 ROCP_SDK_SAVE_DATA_FIELD(array_count);
1177 ROCP_SDK_SAVE_DATA_FIELD(num_shader_banks);
1178 ROCP_SDK_SAVE_DATA_FIELD(simd_arrays_per_engine);
1179 ROCP_SDK_SAVE_DATA_FIELD(cu_per_simd_array);
1180 ROCP_SDK_SAVE_DATA_FIELD(simd_per_cu);
1181 ROCP_SDK_SAVE_DATA_FIELD(max_slots_scratch_cu);
1182 ROCP_SDK_SAVE_DATA_FIELD(gfx_target_version);
1183 ROCP_SDK_SAVE_DATA_FIELD(vendor_id);
1184 ROCP_SDK_SAVE_DATA_FIELD(device_id);
1185 ROCP_SDK_SAVE_DATA_FIELD(location_id);
1186 ROCP_SDK_SAVE_DATA_FIELD(domain);
1187 ROCP_SDK_SAVE_DATA_FIELD(drm_render_minor);
1188 ROCP_SDK_SAVE_DATA_FIELD(num_sdma_engines);
1189 ROCP_SDK_SAVE_DATA_FIELD(num_sdma_xgmi_engines);
1190 ROCP_SDK_SAVE_DATA_FIELD(num_sdma_queues_per_engine);
1191 ROCP_SDK_SAVE_DATA_FIELD(num_cp_queues);
1192 ROCP_SDK_SAVE_DATA_FIELD(max_engine_clk_ccompute);
1193 ROCP_SDK_SAVE_DATA_FIELD(max_engine_clk_fcompute);
1194 ROCP_SDK_SAVE_DATA_FIELD(sdma_fw_version);
1195 ROCP_SDK_SAVE_DATA_FIELD(fw_version);
1196 ROCP_SDK_SAVE_DATA_FIELD(capability);
1197 ROCP_SDK_SAVE_DATA_FIELD(cu_per_engine);
1198 ROCP_SDK_SAVE_DATA_FIELD(max_waves_per_cu);
1199 ROCP_SDK_SAVE_DATA_FIELD(family_id);
1200 ROCP_SDK_SAVE_DATA_FIELD(workgroup_max_size);
1201 ROCP_SDK_SAVE_DATA_FIELD(grid_max_size);
1202 ROCP_SDK_SAVE_DATA_FIELD(local_mem_size);
1203 ROCP_SDK_SAVE_DATA_FIELD(hive_id);
1204 ROCP_SDK_SAVE_DATA_FIELD(gpu_id);
1205 ROCP_SDK_SAVE_DATA_FIELD(workgroup_max_dim);
1206 ROCP_SDK_SAVE_DATA_FIELD(grid_max_dim);
1207 ROCP_SDK_SAVE_DATA_CSTR(name);
1208 ROCP_SDK_SAVE_DATA_CSTR(vendor_name);
1209 ROCP_SDK_SAVE_DATA_CSTR(product_name);
1210 ROCP_SDK_SAVE_DATA_CSTR(model_name);
1211 ROCP_SDK_SAVE_DATA_FIELD(node_id);
1212 ROCP_SDK_SAVE_DATA_FIELD(logical_node_id);
1213 ROCP_SDK_SAVE_DATA_FIELD(logical_node_type_id);
1214 ROCP_SDK_SAVE_DATA_FIELD(runtime_visibility);
1215 ROCP_SDK_SAVE_DATA_FIELD(uuid);
1216
1217 auto generate = [&](auto name, const auto* value, uint64_t size) {
1218 using value_type = std::remove_const_t<std::remove_pointer_t<decltype(value)>>;
1219 auto vec = std::vector<value_type>{};
1220 vec.reserve(size);
1221 for(uint64_t i = 0; i < size; ++i)
1222 vec.emplace_back(value[i]);
1223 ar(make_nvp(name, vec));
1224 };
1225
1226 generate("mem_banks", data.mem_banks, data.mem_banks_count);
1227 generate("caches", data.caches, data.caches_count);
1228 generate("io_links", data.io_links, data.io_links_count);
1229}
1230
1231template <typename ArchiveT>
1232void
1233save(ArchiveT& ar, rocprofiler_counter_info_v0_t data)
1234{
1235 ROCP_SDK_SAVE_DATA_FIELD(id);
1236 ROCP_SDK_SAVE_DATA_BITFIELD("is_constant", is_constant);
1237 ROCP_SDK_SAVE_DATA_BITFIELD("is_derived", is_derived);
1238 ROCP_SDK_SAVE_DATA_CSTR(name);
1239 ROCP_SDK_SAVE_DATA_CSTR(description);
1240 ROCP_SDK_SAVE_DATA_CSTR(block);
1241 ROCP_SDK_SAVE_DATA_CSTR(expression);
1242}
1243
1244template <typename ArchiveT>
1245void
1246save(ArchiveT& ar, rocprofiler_counter_info_v1_t data)
1247{
1248 ROCP_SDK_SAVE_DATA_FIELD(id);
1249 ROCP_SDK_SAVE_DATA_BITFIELD("is_constant", is_constant);
1250 ROCP_SDK_SAVE_DATA_BITFIELD("is_derived", is_derived);
1251 ROCP_SDK_SAVE_DATA_CSTR(name);
1252 ROCP_SDK_SAVE_DATA_CSTR(description);
1253 ROCP_SDK_SAVE_DATA_CSTR(block);
1254 ROCP_SDK_SAVE_DATA_CSTR(expression);
1255
1256 ROCP_SDK_SAVE_VALUE(
1257 "dimensions",
1258 rocprofiler::sdk::container::make_c_array(data.dimensions, data.dimensions_count));
1259
1260 ROCP_SDK_SAVE_VALUE("instances",
1261 rocprofiler::sdk::container::make_c_array(data.dimensions_instances,
1263}
1264
1265template <typename ArchiveT>
1266void
1267save(ArchiveT& ar, rocprofiler_counter_dimension_info_t data)
1268{
1269 ROCP_SDK_SAVE_DATA_CSTR(dimension_name);
1270 ROCP_SDK_SAVE_DATA_FIELD(index);
1271}
1272
1273template <typename ArchiveT>
1274void
1276{
1277 ROCP_SDK_SAVE_DATA_FIELD(instance_id);
1278 ROCP_SDK_SAVE_DATA_FIELD(counter_id);
1279
1280 ROCP_SDK_SAVE_VALUE(
1281 "dimensions",
1282 rocprofiler::sdk::container::make_c_array(data.dimensions, data.dimensions_count));
1283}
1284
1285template <typename ArchiveT>
1286void
1287save(ArchiveT& ar, rocprofiler_counter_record_dimension_info_t data)
1288{
1289 ROCP_SDK_SAVE_DATA_FIELD(id);
1290 ROCP_SDK_SAVE_DATA_FIELD(instance_size);
1291 ROCP_SDK_SAVE_DATA_CSTR(name);
1292}
1293
1294template <typename ArchiveT>
1295void
1297{
1298 ROCP_SDK_SAVE_DATA_FIELD(size);
1299 ROCP_SDK_SAVE_DATA_FIELD(version);
1300 ROCP_SDK_SAVE_DATA_FIELD(instance);
1301}
1302
1303template <typename ArchiveT>
1304void
1306{
1307 ROCP_SDK_SAVE_DATA_FIELD(size);
1308 ROCP_SDK_SAVE_DATA_FIELD(kind);
1309 ROCP_SDK_SAVE_DATA_FIELD(operation);
1310 ROCP_SDK_SAVE_DATA_FIELD(correlation_id);
1311 ROCP_SDK_SAVE_DATA_FIELD(timestamp);
1312 ROCP_SDK_SAVE_DATA_FIELD(thread_id);
1313 ROCP_SDK_SAVE_DATA_FIELD(version);
1314 ROCP_SDK_SAVE_DATA_FIELD(instance);
1315}
1316
1317template <typename ArchiveT, typename EnumT, typename ValueT>
1318void
1319save(ArchiveT& ar, const rocprofiler::sdk::utility::name_info<EnumT, ValueT>& data)
1320{
1321 ar.makeArray();
1322 for(const auto& itr : data)
1323 ar(cereal::make_nvp("entry", itr));
1324}
1325
1326template <typename ArchiveT, typename EnumT, typename ValueT>
1327void
1328save(ArchiveT& ar, const rocprofiler::sdk::utility::name_info_impl<EnumT, ValueT>& data)
1329{
1330 auto _name = std::string{data.name};
1331 auto _ops = std::vector<std::string>{};
1332 _ops.reserve(data.operations.size());
1333
1334 ar(cereal::make_nvp("kind", _name));
1335 for(auto itr : data.operations)
1336 _ops.emplace_back(itr);
1337 ar(cereal::make_nvp("operations", _ops));
1338}
1339
1340template <typename ArchiveT, typename Tp>
1341void
1342save(ArchiveT& ar, const rocprofiler::sdk::container::c_array<Tp>& data)
1343{
1344 ar(make_size_tag(data.size()));
1345 for(auto itr : data)
1346 ar(itr);
1347}
1348
1349template <typename ArchiveT, typename Tp>
1350void
1351save(ArchiveT& ar, const rocprofiler::sdk::container::c_array<Tp*>& data)
1352{
1353 size_type _sz = 0;
1354 for(auto* itr : data)
1355 if(itr) ++_sz;
1356
1357 ar(make_size_tag(_sz));
1358 for(auto* itr : data)
1359 ar(*itr);
1360}
1361
1362ROCPROFILER_SDK_CEREAL_NAMESPACE_END
1363
1364#undef ROCP_SDK_SAVE_DATA_FIELD
1365#undef ROCP_SDK_SAVE_DATA_VALUE
1366#undef ROCP_SDK_SAVE_DATA_CSTR
1367#undef ROCP_SDK_SAVE_DATA_BITFIELD
const rocprofiler_agent_io_link_t * io_links
array of IO link info
Definition agent.h:203
uint32_t mem_banks_count
Definition agent.h:141
uint32_t caches_count
Definition agent.h:143
const rocprofiler_agent_mem_bank_t * mem_banks
array of memory bank info
Definition agent.h:201
uint32_t io_links_count
Definition agent.h:144
const rocprofiler_agent_cache_t * caches
array of cache info
Definition agent.h:202
Cache information for an agent.
Definition agent.h:56
Memory bank information for an agent.
Definition agent.h:91
Provides an estimate about the runtime visibility of an agent based on the environment variables (ROC...
Definition agent.h:106
Stores the properties of an agent (CPU, GPU, etc.)
Definition agent.h:131
uint64_t handle
compatability
Definition fwd.h:566
int32_t rocprofiler_tracing_operation_t
Tracing Operation ID. Depending on the kind, operations can be determined. If the value is equal to z...
Definition fwd.h:516
rocprofiler_buffer_tracing_kind_t
Service Buffer Tracing Kind.
Definition fwd.h:187
Agent Identifier.
Definition fwd.h:677
ROCProfiler Correlation ID record for async activity.
Definition fwd.h:643
Context ID.
Definition fwd.h:600
ROCProfiler Record Correlation ID.
Definition fwd.h:624
Counter ID.
Definition fwd.h:685
(experimental) Details for the dimension, including its size, for a counter record.
Definition fwd.h:818
(experimental) ROCProfiler Profile Counting Counter Record per instance.
Definition fwd.h:835
Multi-dimensional struct of data used to describe GPU workgroup and grid sizes.
Definition fwd.h:702
ROCProfiler kernel dispatch information.
Definition fwd.h:793
Generic record with type identifier(s) and a pointer to data. This data type is used with buffered da...
Definition fwd.h:753
Stores UUID for devices.
Definition fwd.h:576
Stores memory address for profiling.
Definition fwd.h:565
rocprofiler_tracing_operation_t operation
Specification of the rocprofiler_ompt_operation_t.
rocprofiler_address_t address
starting address for memory allocation
ROCProfiler Buffer Correlation ID Retirement Tracer Record.
ROCProfiler Buffer HIP API Tracer Record.
ROCProfiler Buffer HIP API Tracer Record.
ROCProfiler Buffer HSA API Tracer Record.
ROCProfiler Buffer Kernel Dispatch Tracer Record.
ROCProfiler Buffer Dropped events event record, for when KFD reports that it has dropped some events.
ROCProfiler Buffer Page Fault event record from KFD.
ROCProfiler Buffer Page Migration event record from KFD.
ROCProfiler Buffer Queue event record from KFD.
ROCProfiler Buffer Unmap of memory from GPU event record from KFD.
ROCProfiler Buffer Page Fault (paired) record from KFD.
ROCProfiler Buffer Page Migration (paired) record from KFD.
ROCProfiler Buffer Queue suspend (paired) record from KFD.
ROCProfiler Buffer Marker Tracer Record.
ROCProfiler Buffer Memory Allocation Tracer Record.
ROCProfiler Buffer Memory Copy Tracer Record.
ROCProfiler Buffer OMPT Tracer Record.
Additional trace data for OpenMP target routines.
ROCProfiler Buffer RCCL API Record.
An extended ROCProfiler rocDecode API Tracer Record which includes function arguments....
ROCProfiler Buffer rocDecode API Record.
ROCProfiler Buffer rocJPEG API Record.
ROCProfiler Buffer Runtime Initialization Tracer Record.
ROCProfiler Buffer Scratch Memory Tracer Record.
rocprofiler_code_object_storage_type_t storage_type
storage type of the code object reader used to load the loaded code object
rocprofiler_address_t address
starting address for memory allocation
ROCProfiler Code Object Kernel Symbol Tracer Callback Record.
ROCProfiler Code Object Load Tracer Callback Record.
ROCProfiler HIP runtime and compiler API Tracer Callback Data.
ROCProfiler HSA API Callback Data.
ROCProfiler Kernel Dispatch Callback Tracer Record.
ROCProfiler Marker Tracer Callback Data.
ROCProfiler Memory Allocation Tracer Record.
ROCProfiler Memory Copy Callback Tracer Record.
ROCProfiler OMPT Callback Data.
ROCProfiler RCCL API Callback Data.
ROCProfiler rocDecode API Callback Data.
ROCProfiler rocJPEG API Callback Data.
ROCProfiler Scratch Memory Callback Data.
const rocprofiler_counter_dimension_info_t ** dimensions
Array of pointers to dimension info structures, each representing one dimension and the position of t...
Definition counters.h:88
uint64_t dimensions_count
Number of dimensions associated with this instance.
Definition counters.h:87
uint64_t dimensions_instances_count
Number of unique instances for this counter, across all dimension combinations.
Definition counters.h:128
uint64_t dimensions_count
Number of dimensions for the counter.
Definition counters.h:126
const rocprofiler_counter_record_dimension_instance_info_t ** dimensions_instances
Array of pointers to instance info structs, each describing a unique instance and its specific dimens...
Definition counters.h:129
const rocprofiler_counter_record_dimension_info_t ** dimensions
Dimension information of the counter.
Definition counters.h:127
(experimental) Represents metadata about a single dimension of a counter instance.
Definition counters.h:60
(experimental) Counter info struct version 0
Definition counters.h:43
(experimental) Counter info struct version 1. Combines information from rocprofiler_counter_info_v0_t...
Definition counters.h:116
(experimental) Describes a specific counter instance and its position across multiple dimensions.
Definition counters.h:83
rocprofiler_pc_sampling_record_stochastic_header_t flags
Defines what fields are meaningful for the sample.
uint32_t reason_not_issued
The reason for not issuing an instruction. The field takes one of the value defined in rocprofiler_pc...
uint8_t has_memory_counter
pc sample provides memory counters information via rocprofiler_pc_sampling_memory_counters_t
uint8_t inst_type
instruction type, takes a value defined in rocprofiler_pc_sampling_instruction_type_t
rocprofiler_pc_sampling_instruction_not_issued_reason_t
(experimental) Enumeration describing reason for not issuing an instruction.
const char * rocprofiler_get_pc_sampling_instruction_type_name(rocprofiler_pc_sampling_instruction_type_t instruction_type)
(experimental) Return the string encoding of rocprofiler_pc_sampling_instruction_type_t value
rocprofiler_pc_sampling_instruction_type_t
(experimental) Enumeration describing type of sampled issued instruction.
const char * rocprofiler_get_pc_sampling_instruction_not_issued_reason_name(rocprofiler_pc_sampling_instruction_not_issued_reason_t not_issued_reason)
(experimental) Return the string encoding of rocprofiler_pc_sampling_instruction_not_issued_reason_t ...
(experimental) PC sampling configuration supported by a GPU agent.
(experimental) Information about the GPU part where wave was executing at the moment of sampling.
(experimental) Counters of issued but not yet completed instructions.
(experimental) ROCProfiler Host-Trap PC Sampling Record.
(experimental) The header of the rocprofiler_pc_sampling_record_stochastic_v0_t, indicating what fiel...
(experimental) ROCProfiler Stochastic PC Sampling Record.
(experimental) Data provided by stochastic sampling hardware.
(experimental) Sampled program counter.
(experimental) Kernel dispatch data for profile counting callbacks.
(experimental) ROCProfiler Profile Counting Counter Record Header Information