20 #ifdef XPTI_ENABLE_INSTRUMENTATION
22 #include "xpti/xpti_trace_framework.h"
28 #ifdef XPTI_ENABLE_INSTRUMENTATION
29 extern xpti::trace_event_data_t *GPICallEvent;
30 extern xpti::trace_event_data_t *GPIArgCallEvent;
33 template <
PiApiKind Kind,
size_t Idx,
typename... Args>
38 #define _PI_API(api) \
39 template <> struct PiApiArgTuple<PiApiKind::api> { \
40 using type = typename function_traits<decltype(api)>::args_type; \
43 #include <sycl/detail/pi.def>
46 template <PiApiKind Kind,
size_t Idx,
typename T>
48 static void fill(
unsigned char *Dst, T &&Arg) {
51 auto RealArg = (std::tuple_element_t<Idx, ArgsTuple>)(Arg);
52 *(std::remove_cv_t<std::tuple_element_t<Idx, ArgsTuple>> *)Dst = RealArg;
56 template <
PiApiKind Kind,
size_t Idx,
typename T,
typename... Args>
58 static void fill(
unsigned char *Dst,
const T &&Arg, Args &&...Rest) {
61 auto RealArg = (std::tuple_element_t<Idx, ArgsTuple>)(Arg);
62 *(std::remove_cv_t<std::tuple_element_t<Idx, ArgsTuple>> *)Dst = RealArg;
64 Dst +
sizeof(decltype(RealArg)), std::forward<Args>(Rest)...);
68 template <
typename... Ts>
69 constexpr
size_t totalSize(
const std::tuple<Ts...> &) {
70 return (
sizeof(Ts) + ...);
73 template <
PiApiKind Kind,
typename... ArgsT>
77 constexpr
size_t TotalSize =
totalSize(ArgsTuple{});
79 std::array<unsigned char, TotalSize> ArgsData;
81 std::forward<ArgsT>(Args)...);
95 : MPlugin(Plugin), MBackend(UseBackend), MLibraryHandle(LibraryHandle),
96 TracingMutex(
std::make_shared<
std::mutex>()),
97 MPluginMutex(
std::make_shared<
std::mutex>()) {}
115 template <
typename Exception = sycl::runtime_error>
117 char *message =
nullptr;
118 if (
pi_result == PI_ERROR_PLUGIN_SPECIFIC_ERROR) {
119 pi_result = call_nocheck<PiApiKind::piPluginGetLastError>(&message);
134 if (
pi_result == PI_ERROR_PLUGIN_SPECIFIC_ERROR) {
135 char *message =
nullptr;
136 pi_result = call_nocheck<PiApiKind::piPluginGetLastError>(&message);
151 throw sycl::runtime_error(std::string(
context) +
152 " API failed with error: " +
169 template <
PiApiKind PiApiOffset,
typename... ArgsT>
171 RT::PiFuncInfo<PiApiOffset> PiCallInfo;
172 #ifdef XPTI_ENABLE_INSTRUMENTATION
176 const char *PIFnName = PiCallInfo.getFuncName();
178 uint64_t CorrelationIDWithArgs = 0;
179 unsigned char *ArgsDataPtr =
nullptr;
181 if (xptiTraceEnabled()) {
183 packCallArguments<PiApiOffset>(std::forward<ArgsT>(Args)...);
184 ArgsDataPtr = ArgsData.data();
186 static_cast<uint32_t
>(PiApiOffset), PIFnName, ArgsDataPtr, *MPlugin);
191 std::lock_guard<std::mutex> Guard(*TracingMutex);
192 const char *FnName = PiCallInfo.getFuncName();
193 std::cout <<
"---> " << FnName <<
"(" << std::endl;
195 R = PiCallInfo.getFuncPtr(*MPlugin)(Args...);
201 R = PiCallInfo.getFuncPtr(*MPlugin)(Args...);
203 #ifdef XPTI_ENABLE_INSTRUMENTATION
207 static_cast<uint32_t
>(PiApiOffset),
208 PIFnName, ArgsDataPtr, R, *MPlugin);
216 template <
PiApiKind PiApiOffset,
typename... ArgsT>
217 void call(ArgsT... Args)
const {
224 void call(ArgsT... Args)
const {
226 checkPiResult<errc>(Err);
238 auto It = std::find(PiPlatforms.begin(), PiPlatforms.end(), Platform);
239 if (It != PiPlatforms.end())
240 return It - PiPlatforms.begin();
242 PiPlatforms.push_back(Platform);
243 LastDeviceIds.push_back(0);
244 return PiPlatforms.size() - 1;
253 int PlatformId = getPlatformId(Platform);
256 return LastDeviceIds[PlatformId - 1];
262 int PlatformId = getPlatformId(Platform);
263 LastDeviceIds[PlatformId] = Id;
270 int PlatformId = getPlatformId(Platform);
271 if (PlatformId > 0 &&
272 LastDeviceIds[PlatformId] < LastDeviceIds[PlatformId - 1])
273 LastDeviceIds[PlatformId] = LastDeviceIds[PlatformId - 1];
277 auto It = std::find(PiPlatforms.begin(), PiPlatforms.end(), Platform);
278 return It != PiPlatforms.end();
284 std::shared_ptr<RT::PiPlugin> MPlugin;
286 void *MLibraryHandle;
287 std::shared_ptr<std::mutex> TracingMutex;
291 std::shared_ptr<std::mutex> MPluginMutex;
293 std::vector<RT::PiPlatform> PiPlatforms;
296 std::vector<int> LastDeviceIds;