@@ -270,17 +270,15 @@ ur_result_t AsanInterceptor::preLaunchKernel(ur_kernel_handle_t Kernel,
270270 auto ContextInfo = getContextInfo (Context);
271271 auto DeviceInfo = getDeviceInfo (Device);
272272
273- ManagedQueue InternalQueue (Context, Device);
274- if (!InternalQueue) {
275- UR_LOG_L (getContext ()->logger , ERR, " Failed to create internal queue" );
276- return UR_RESULT_ERROR_INVALID_QUEUE;
277- }
273+ ur_queue_handle_t InternalQueue = ContextInfo->getInternalQueue (Device);
278274
279275 UR_CALL (prepareLaunch (ContextInfo, DeviceInfo, InternalQueue, Kernel,
280276 LaunchInfo));
281277
282278 UR_CALL (updateShadowMemory (ContextInfo, DeviceInfo, InternalQueue));
283279
280+ UR_CALL (getContext ()->urDdiTable .Queue .pfnFinish (InternalQueue));
281+
284282 return UR_RESULT_SUCCESS;
285283}
286284
@@ -467,6 +465,7 @@ ur_result_t AsanInterceptor::unregisterProgram(ur_program_handle_t Program) {
467465
468466ur_result_t AsanInterceptor::registerSpirKernels (ur_program_handle_t Program) {
469467 auto Context = GetContext (Program);
468+ auto CI = getContextInfo (Context);
470469 std::vector<ur_device_handle_t > Devices = GetDevices (Program);
471470
472471 for (auto Device : Devices) {
@@ -484,11 +483,11 @@ ur_result_t AsanInterceptor::registerSpirKernels(ur_program_handle_t Program) {
484483 assert ((MetadataSize % sizeof (SpirKernelInfo) == 0 ) &&
485484 " SpirKernelMetadata size is not correct" );
486485
487- ManagedQueue Queue (Context, Device);
486+ ur_queue_handle_t InternalQueue = CI-> getInternalQueue ( Device);
488487
489488 std::vector<SpirKernelInfo> SKInfo (NumOfSpirKernel);
490489 Result = getContext ()->urDdiTable .Enqueue .pfnUSMMemcpy (
491- Queue , true , &SKInfo[0 ], MetadataPtr,
490+ InternalQueue , true , &SKInfo[0 ], MetadataPtr,
492491 sizeof (SpirKernelInfo) * NumOfSpirKernel, 0 , nullptr , nullptr );
493492 if (Result != UR_RESULT_SUCCESS) {
494493 UR_LOG_L (getContext ()->logger , ERR, " Can't read the value of <{}>: {}" ,
@@ -504,7 +503,7 @@ ur_result_t AsanInterceptor::registerSpirKernels(ur_program_handle_t Program) {
504503 }
505504 std::vector<char > KernelNameV (SKI.Size );
506505 Result = getContext ()->urDdiTable .Enqueue .pfnUSMMemcpy (
507- Queue , true , KernelNameV.data (), (void *)SKI.KernelName ,
506+ InternalQueue , true , KernelNameV.data (), (void *)SKI.KernelName ,
508507 sizeof (char ) * SKI.Size , 0 , nullptr , nullptr );
509508 if (Result != UR_RESULT_SUCCESS) {
510509 UR_LOG_L (getContext ()->logger , ERR, " Can't read kernel name: {}" ,
@@ -537,7 +536,7 @@ AsanInterceptor::registerDeviceGlobals(ur_program_handle_t Program) {
537536 assert (ProgramInfo != nullptr && " unregistered program!" );
538537
539538 for (auto Device : Devices) {
540- ManagedQueue Queue (Context, Device);
539+ ur_queue_handle_t InternalQueue = ContextInfo-> getInternalQueue ( Device);
541540
542541 size_t MetadataSize;
543542 void *MetadataPtr;
@@ -554,7 +553,7 @@ AsanInterceptor::registerDeviceGlobals(ur_program_handle_t Program) {
554553 " DeviceGlobal metadata size is not correct" );
555554 std::vector<DeviceGlobalInfo> GVInfos (NumOfDeviceGlobal);
556555 Result = getContext ()->urDdiTable .Enqueue .pfnUSMMemcpy (
557- Queue , true , &GVInfos[0 ], MetadataPtr,
556+ InternalQueue , true , &GVInfos[0 ], MetadataPtr,
558557 sizeof (DeviceGlobalInfo) * NumOfDeviceGlobal, 0 , nullptr , nullptr );
559558 if (Result != UR_RESULT_SUCCESS) {
560559 UR_LOG_L (getContext ()->logger , ERR, " Device Global[{}] Read Failed: {}" ,
@@ -932,6 +931,8 @@ bool ProgramInfo::isKernelInstrumented(ur_kernel_handle_t Kernel) const {
932931ContextInfo::~ContextInfo () {
933932 Stats.Print (Handle);
934933
934+ InternalQueueMap.clear ();
935+
935936 [[maybe_unused]] ur_result_t URes;
936937 if (USMPool) {
937938 URes = getContext ()->urDdiTable .USM .pfnPoolRelease (USMPool);
@@ -971,6 +972,13 @@ ur_usm_pool_handle_t ContextInfo::getUSMPool() {
971972 return USMPool;
972973}
973974
975+ ur_queue_handle_t ContextInfo::getInternalQueue (ur_device_handle_t Device) {
976+ std::scoped_lock<ur_shared_mutex> Guard (InternalQueueMapMutex);
977+ if (!InternalQueueMap[Device])
978+ InternalQueueMap[Device].emplace (Handle, Device);
979+ return *InternalQueueMap[Device];
980+ }
981+
974982AsanRuntimeDataWrapper::~AsanRuntimeDataWrapper () {
975983 [[maybe_unused]] ur_result_t Result;
976984 if (Host.LocalArgs ) {
0 commit comments