4204042ac6
* Refactor API reference docs * refactor API ref docs * corrections * consistent naming * updates * Update CHANGELOG.md * improving SEO * improving SEO * Update using-rocprofv3.rst * Update counter_collection_services.md * Update using-rocprofv3.rst * Fixing doc build errors * changelogs and some formatting issues --------- Co-authored-by: Gopesh Bhardwaj <gopesh.bhardwaj@amd.com>
94 wiersze
2.6 KiB
Markdown
94 wiersze
2.6 KiB
Markdown
---
|
|
myst:
|
|
html_meta:
|
|
"description": "ROCprofiler-SDK is a tooling infrastructure for profiling general-purpose GPU compute applications running on the ROCm software."
|
|
"keywords": "ROCprofiler-SDK API reference, ROCprofiler-SDK intercept table, Intercept table API"
|
|
---
|
|
|
|
# ROCprofiler-SDK runtime intercept tables
|
|
|
|
While tools commonly leverage the callback or buffer tracing services for tracing the HIP, HSA, and ROCTx
|
|
APIs, ROCprofiler-SDK also provides access to the raw API dispatch tables.
|
|
|
|
## Forward declaration of public C API function
|
|
|
|
All the aforementioned APIs are designed similar to the following sample:
|
|
|
|
```cpp
|
|
extern "C"
|
|
{
|
|
// forward declaration of public C API function
|
|
int
|
|
foo(int) __attribute__((visibility("default")));
|
|
}
|
|
```
|
|
|
|
## Internal implementation of API function
|
|
|
|
```cpp
|
|
namespace impl
|
|
{
|
|
int
|
|
foo(int val)
|
|
{
|
|
// real implementation
|
|
return (2 * val);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Dispatch table implementation
|
|
|
|
```cpp
|
|
namespace impl
|
|
{
|
|
struct dispatch_table
|
|
{
|
|
int (*foo_fn)(int) = nullptr;
|
|
};
|
|
|
|
// Invoked once: populates the dispatch_table with function pointers to implementation
|
|
dispatch_table*&
|
|
construct_dispatch_table()
|
|
{
|
|
static dispatch_table* tbl = new dispatch_table{};
|
|
tbl->foo_fn = impl::foo;
|
|
|
|
// In between, ROCprofiler-SDK gets passed the pointer
|
|
// to the dispatch table and has the opportunity to wrap the function
|
|
// pointers for interception
|
|
|
|
return tbl;
|
|
}
|
|
|
|
// Constructs dispatch table and stores it in static variable
|
|
dispatch_table*
|
|
get_dispatch_table()
|
|
{
|
|
static dispatch_table*& tbl = construct_dispatch_table();
|
|
return tbl;
|
|
}
|
|
} // namespace impl
|
|
```
|
|
|
|
## Implementation of public C API function
|
|
|
|
```cpp
|
|
extern "C"
|
|
{
|
|
// implementation of public C API function
|
|
int
|
|
foo(int val)
|
|
{
|
|
return impl::get_dispatch_table()->foo_fn(val);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Dispatch table chaining
|
|
|
|
ROCprofiler-SDK can save the original values of the function pointers such as `foo_fn` in `impl::construct_dispatch_table()` and install its own function pointers in its place. This results in the public C API function `foo` calling into the ROCprofiler-SDK function pointer, which in turn, calls the original function pointer to `impl::foo`. This phenomenon is named chaining. Once ROCprofiler-SDK
|
|
makes necessary modifications to the dispatch table, tools requesting access to the raw dispatch table via `rocprofiler_at_intercept_table_registration`, are provided the pointer to the dispatch table.
|
|
|
|
For an example of dispatch table chaining, see [samples/intercept_table](https://github.com/ROCm/rocprofiler-sdk-internal/tree/amd-staging/samples/intercept_table).
|