Improve queueLock and lastCmdLock

Reduce the size of the queueLock and lastCmdLock critical sections
to improve lock contention performance. The smaller the critical
sections are the better.

lasCmdLock is still needed to guarantee that getLastEnqueueCommand_
can retain the command before it is swapped out and released.

Change-Id: Id35d4a77c035b2da0de4c15568b153d49e958bb7
이 커밋은 다음에 포함됨:
Laurent Morichetti
2020-08-24 17:52:34 -07:00
커밋한 사람 Saleel Kudchadker
부모 c95c613edc
커밋 080dcfe857
2개의 변경된 파일16개의 추가작업 그리고 8개의 파일을 삭제
+16 -5
파일 보기
@@ -185,17 +185,26 @@ void HostQueue::append(Command& command) {
}
command.retain();
command.setStatus(CL_QUEUED);
ScopedLock l(lastCmdLock_);
queue_.enqueue(&command);
if (!IS_HIP) {
return;
}
// Set last submitted command
if (lastEnqueueCommand_ != nullptr) {
lastEnqueueCommand_->release();
Command* prevLastEnqueueCommand;
command.retain();
{
// lastCmdLock_ ensures that lastEnqueueCommand() can retain the command before it is swapped
// out. We want to keep this critical section as short as possible, so the command should be
// released outside this section.
ScopedLock l(lastCmdLock_);
prevLastEnqueueCommand = lastEnqueueCommand_;
lastEnqueueCommand_ = &command;
}
if (prevLastEnqueueCommand != nullptr) {
prevLastEnqueueCommand->release();
}
lastEnqueueCommand_ = &command;
lastEnqueueCommand_->retain();
}
bool HostQueue::isEmpty() {
@@ -207,6 +216,8 @@ Command* HostQueue::getLastQueuedCommand(bool retain) {
// Get last submitted command
ScopedLock l(lastCmdLock_);
// Since the lastCmdLock_ is acquired, it is safe to read and retain the lastEnqueueCommand. It is
// guaranteed that the pointer will not change.
if (retain && lastEnqueueCommand_ != nullptr) {
lastEnqueueCommand_->retain();
}
-3
파일 보기
@@ -234,9 +234,6 @@ class HostQueue : public CommandQueue {
//! Get last enqueued command
Command* getLastQueuedCommand(bool retain);
//! Set last enqueued command
void setLastQueuedCommand(Command* lastCommand) {}
};