diff --git a/rocclr/platform/command.cpp b/rocclr/platform/command.cpp index 8005ea5352..e8b5970fec 100644 --- a/rocclr/platform/command.cpp +++ b/rocclr/platform/command.cpp @@ -336,6 +336,7 @@ void Command::releaseResources() { } } +static constexpr uint32_t kMarkerTsCount = 64; // ================================================================================================ void Command::enqueue() { assert(queue_ != NULL && "Cannot be enqueued"); @@ -368,7 +369,15 @@ void Command::enqueue() { EnableProfiling(); } - if (isMarker && (!profilingInfo().marker_ts_)) { + bool submitBatch = !profilingInfo().marker_ts_; + // Flush the batch if ther marker_ts have been continuously submitted until a threashold + // is reached. This helps recycling the commands and frees memory. + if (queue_->GetMarkerTsCount() > kMarkerTsCount) { + submitBatch = true; + queue_->ResetMarkerTsCount(); + } + + if (isMarker && submitBatch) { // Update batch head for the current marker. Hence the status of all commands can be // updated upon the marker completion SetBatchHead(queue_->GetSubmittionBatch()); diff --git a/rocclr/platform/commandqueue.cpp b/rocclr/platform/commandqueue.cpp index 339239b831..7a8fee1f6f 100644 --- a/rocclr/platform/commandqueue.cpp +++ b/rocclr/platform/commandqueue.cpp @@ -40,7 +40,8 @@ HostQueue::HostQueue(Context& context, Device& device, cl_command_queue_properti lastEnqueueCommand_(nullptr), head_(nullptr), tail_(nullptr), - isActive_(false) { + isActive_(false), + markerTsCount_(0) { if (AMD_DIRECT_DISPATCH) { // Initialize the queue thread_.Init(this); diff --git a/rocclr/platform/commandqueue.hpp b/rocclr/platform/commandqueue.hpp index 999b569cd6..863f8ecac3 100644 --- a/rocclr/platform/commandqueue.hpp +++ b/rocclr/platform/commandqueue.hpp @@ -264,6 +264,9 @@ class HostQueue : public CommandQueue { // an invalid access command->retain(); + if (command->profilingInfo().marker_ts_) { + markerTsCount_++; + } // Release the last command in the batch if (lastEnqueueCommand_ != nullptr) { lastEnqueueCommand_->release(); @@ -284,12 +287,20 @@ class HostQueue : public CommandQueue { //! Get queue status bool GetQueueStatus() { return isActive_; } + //! Get markerTsCount + uint32_t GetMarkerTsCount() const { return markerTsCount_; } + + //! Reset counter + void ResetMarkerTsCount() { markerTsCount_ = 0; } + private: Command* head_; //!< Head of the batch list Command* tail_; //!< Tail of the batch list //! True if this command queue is active bool isActive_; + + uint32_t markerTsCount_; //!< Count of TS markers };