Skip to content

Commit edd3ebd

Browse files
committed
mpl/ze: use level zero tracing API to implement zeMemFree callback
1 parent fe82810 commit edd3ebd

File tree

2 files changed

+89
-5
lines changed

2 files changed

+89
-5
lines changed

src/mpi/init/init_gpu.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ int MPII_init_gpu(void)
2222
if (MPIR_CVAR_ENABLE_GPU) {
2323
int debug_summary = 0;
2424
if (MPIR_CVAR_DEBUG_SUMMARY) {
25-
debug_summary = (MPIR_Process.rank == 0);
25+
debug_summary = (MPIR_Process.rank == 0) ? MPIR_CVAR_DEBUG_SUMMARY : 0;
2626
}
2727

2828
bool specialized_cache =

src/mpl/src/gpu/mpl_gpu_ze.c

+88-4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@
1414

1515
MPL_SUPPRESS_OSX_HAS_NO_SYMBOLS_WARNING;
1616

17+
/* 1: loader 0: driver */
18+
#define USELOADERTRACING 1
19+
20+
#if USELOADERTRACING == 1
21+
#include "level_zero/layers/zel_tracing_api.h"
22+
#include "level_zero/layers/zel_tracing_register_cb.h"
23+
#else
24+
#include <level_zero/zet_api.h>
25+
#endif
26+
1727
#ifdef MPL_HAVE_ZE
1828
#include <dirent.h>
1929
#if defined(MPL_HAVE_DRM_I915_DRM_H)
@@ -211,6 +221,14 @@ static pFnzexMemGetIpcHandles zexMemGetIpcHandles = NULL;
211221
static pFnzexMemOpenIpcHandles zexMemOpenIpcHandles = NULL;
212222
/* *INDENT-ON* */
213223

224+
/* tracing */
225+
#if USELOADERTRACING == 1
226+
static zel_tracer_handle_t freeTracer;
227+
#else
228+
static zet_tracer_exp_handle_t freeTracer;
229+
#endif
230+
static int callbacksEnabled = 0;
231+
214232
/* Backend-specific functions */
215233
/* *INDENT-OFF* */
216234
typedef ze_result_t (*pFnzexDriverImportExternalPointer)(ze_driver_handle_t, void *, size_t);
@@ -235,6 +253,8 @@ static void MPL_event_pool_destroy(void);
235253
#ifdef ZE_PCI_PROPERTIES_EXT_NAME
236254
static int search_physical_devices(ze_pci_address_ext_t pci);
237255
#endif
256+
static void onEnterMemFree(ze_mem_free_params_t * tracerParams, ze_result_t result,
257+
void *traceUserData, void **tracerInstanceUserData);
238258

239259
/* For zeMemFree callbacks */
240260
static gpu_free_hook_s *free_hook_chain = NULL;
@@ -648,7 +668,8 @@ int MPL_gpu_init(int debug_summary)
648668
ipc_max_entries[i] = max_cache_entries;
649669
}
650670

651-
MPL_gpu_free_hook_register(MPL_ze_ipc_remove_cache_handle);
671+
if (!callbacksEnabled)
672+
MPL_gpu_free_hook_register(MPL_ze_ipc_remove_cache_handle);
652673
} else {
653674
MPL_gpu_info.specialized_cache = false;
654675
}
@@ -661,9 +682,11 @@ int MPL_gpu_init(int debug_summary)
661682

662683
mypid = getpid();
663684

664-
MPL_initlock_lock(&free_hook_mutex);
665-
gpu_mem_hook_init();
666-
MPL_initlock_unlock(&free_hook_mutex);
685+
if (!callbacksEnabled) {
686+
MPL_initlock_lock(&free_hook_mutex);
687+
gpu_mem_hook_init();
688+
MPL_initlock_unlock(&free_hook_mutex);
689+
}
667690
gpu_initialized = 1;
668691

669692
if (MPL_gpu_info.debug_summary) {
@@ -1217,6 +1240,45 @@ static int gpu_ze_init_driver(void)
12171240
(void **) &zexDriverGetHostPointerBaseAddress);
12181241
ZE_ERR_CHECK(ret);
12191242

1243+
ret =
1244+
zeDriverGetExtensionFunctionAddress(ze_driver_handle, "zexMemGetIpcHandles",
1245+
(void **) &zexMemGetIpcHandles);
1246+
if (ZE_RESULT_SUCCESS != ret)
1247+
zexMemGetIpcHandles = NULL;
1248+
1249+
ret =
1250+
zeDriverGetExtensionFunctionAddress(ze_driver_handle, "zexMemOpenIpcHandles",
1251+
(void **) &zexMemOpenIpcHandles);
1252+
if (ZE_RESULT_SUCCESS != ret)
1253+
zexMemOpenIpcHandles = NULL;
1254+
1255+
/* tracing */
1256+
if (likely(MPL_gpu_info.specialized_cache)) {
1257+
#if USELOADERTRACING == 1
1258+
zel_tracer_desc_t tracerDesc = { ZEL_STRUCTURE_TYPE_TRACER_DESC, NULL, NULL };
1259+
ret = zelTracerCreate(&tracerDesc, &freeTracer);
1260+
if (ret == ZE_RESULT_SUCCESS) {
1261+
callbacksEnabled = 1;
1262+
zelTracerMemFreeRegisterCallback(freeTracer, ZEL_REGISTER_PROLOGUE, onEnterMemFree);
1263+
zelTracerSetEnabled(freeTracer, true);
1264+
if (MPL_gpu_info.debug_summary)
1265+
printf("ZE loader tracing is enabled.\n");
1266+
}
1267+
#else
1268+
zet_tracer_exp_desc_t tracerDesc = { ZET_STRUCTURE_TYPE_TRACER_EXP_DESC, NULL, NULL };
1269+
ret = zetTracerExpCreate(ze_context, &tracerDesc, &freeTracer);
1270+
if (ret == ZE_RESULT_SUCCESS) {
1271+
callbacksEnabled = 1;
1272+
ze_callbacks_t prologCbs = { };
1273+
prologCbs.Mem.pfnFreeCb = onEnterMemFree;
1274+
zetTracerExpSetPrologues(freeTracer, &prologCbs);
1275+
zetTracerExpSetEnabled(freeTracer, true);
1276+
if (MPL_gpu_info.debug_summary)
1277+
printf("ZE driver tracing is enabled. \n");
1278+
}
1279+
#endif
1280+
}
1281+
12201282
fn_exit:
12211283
MPL_free(all_drivers);
12221284
return ret_error;
@@ -1386,6 +1448,17 @@ int MPL_gpu_finalize(void)
13861448
MPL_free(ipc_lru_mapped_order_head);
13871449
MPL_free(ipc_lru_mapped_order_tail);
13881450
MPL_free(ipc_curr_mapped_entries);
1451+
1452+
/* tracing */
1453+
if (callbacksEnabled) {
1454+
#if USELOADERTRACING == 1
1455+
zelTracerSetEnabled(freeTracer, false);
1456+
zelTracerDestroy(freeTracer);
1457+
#else
1458+
zetTracerExpSetEnabled(freeTracer, false);
1459+
zetTracerExpDestroy(freeTracer);
1460+
#endif
1461+
}
13891462
}
13901463

13911464
MPL_free(ipc_max_entries);
@@ -2754,6 +2827,17 @@ ze_result_t ZE_APICALL zeMemFree(ze_context_handle_t hContext, void *dptr)
27542827
return (result);
27552828
}
27562829

2830+
/* tracing */
2831+
static void onEnterMemFree(ze_mem_free_params_t * tracerParams, ze_result_t result,
2832+
void *traceUserData, void **tracerInstanceUserData)
2833+
{
2834+
if (MPL_gpu_info.debug_summary == 2) {
2835+
printf("GPU memory being freed: %lx\n", (unsigned long int) *tracerParams->pptr);
2836+
}
2837+
MPL_ze_ipc_remove_cache_handle(*tracerParams->pptr);
2838+
*tracerInstanceUserData = NULL;
2839+
}
2840+
27572841
/* ZE-Specific Functions */
27582842

27592843
#ifdef ZE_PCI_PROPERTIES_EXT_NAME

0 commit comments

Comments
 (0)