[Openmp-commits] [PATCH] D156996: [OpenMP][AMDGPU] Add Envar for controlling HSA busy queue tracking

Michael Halkenhäuser via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Thu Aug 3 05:59:20 PDT 2023


mhalk created this revision.
Herald added subscribers: kerbowa, guansong, tpr, dstuttard, yaxunl, jvesely, kzhuravl.
Herald added a project: All.
mhalk requested review of this revision.
Herald added subscribers: openmp-commits, jplehr, sstefan1, wdng.
Herald added a reviewer: jdoerfert.
Herald added a project: OpenMP.

If the Envar is set to true (default), busy HSA queues will be
actively avoided when assigning a queue to a Stream.

Otherwise, we will initialize a new HSA queue for each requested
Stream, then default to round robin once the set maximum has been
reached.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D156996

Files:
  openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp


Index: openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp
===================================================================
--- openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp
+++ openmp/libomptarget/plugins-nextgen/amdgpu/src/rtl.cpp
@@ -1461,12 +1461,15 @@
   using ResourcePoolTy = GenericDeviceResourceManagerTy<ResourceRef>;
 
   AMDGPUStreamManagerTy(GenericDeviceTy &Device, hsa_agent_t HSAAgent)
-      : GenericDeviceResourceManagerTy(Device), NextQueue(0), Agent(HSAAgent) {}
+      : GenericDeviceResourceManagerTy(Device),
+        OMPX_QueueTracking("LIBOMPTARGET_AMDGPU_HSA_QUEUE_BUSY_TRACKING", true),
+        NextQueue(0), Agent(HSAAgent) {}
 
   Error init(uint32_t InitialSize, int NumHSAQueues, int HSAQueueSize) {
     Queues = std::vector<AMDGPUQueueTy>(NumHSAQueues);
     QueueSize = HSAQueueSize;
     MaxNumQueues = NumHSAQueues;
+    OMPX_QueueTracking = OMPX_QueueTracking.get();
     // Initialize one queue eagerly
     if (auto Err = Queues.front().init(Agent, QueueSize))
       return Err;
@@ -1508,14 +1511,15 @@
     uint32_t StartIndex = NextQueue % MaxNumQueues;
     AMDGPUQueueTy *Q = nullptr;
 
-    for (int i = 0; i < MaxNumQueues; ++i) {
-      Q = &Queues[StartIndex++];
-      if (StartIndex == MaxNumQueues)
-        StartIndex = 0;
+    if (OMPX_QueueTracking || NextQueue < MaxNumQueues)
+      for (int i = 0; i < MaxNumQueues; ++i) {
+        Q = &Queues[StartIndex++];
+        if (StartIndex == MaxNumQueues)
+          StartIndex = 0;
+
+        if (OMPX_QueueTracking && Q->isBusy())
+          continue;
 
-      if (Q->isBusy())
-        continue;
-      else {
         if (auto Err = Q->init(Agent, QueueSize))
           return Err;
 
@@ -1523,7 +1527,6 @@
         Stream->Queue = Q;
         return Plugin::success();
       }
-    }
 
     // All queues busy: Round robin (StartIndex has the initial value again)
     Queues[StartIndex].addUser();
@@ -1532,6 +1535,9 @@
     return Plugin::success();
   }
 
+  /// Envar for controlling the tracking of busy HSA queues.
+  BoolEnvar OMPX_QueueTracking;
+
   /// The next queue index to use for round robin selection.
   uint32_t NextQueue;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D156996.546822.patch
Type: text/x-patch
Size: 2167 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20230803/c5e706bf/attachment-0001.bin>


More information about the Openmp-commits mailing list