-
Notifications
You must be signed in to change notification settings - Fork 3.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Hexagon][runtime] Make HexagonThreadManager::CheckSemaphore thread safe #13609
Conversation
Thanks for contributing to TVM! Please refer to the contributing guidelines https://tvm.apache.org/docs/contribute/ for useful information and tips. Please request code reviews from Reviewers by @-ing them in a comment.
Generated by tvm-bot |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks!
@@ -265,9 +265,15 @@ void HexagonThreadManager::WaitOnThreads() { | |||
} | |||
|
|||
void HexagonThreadManager::CheckSemaphore(unsigned syncID) { | |||
// We want the success case to be fast, so do not lock the mutex |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think there's still a case where this could result in a race condition, though it's much less likely than before. The race condition would occur between one thread that is reading semaphores_[0]
inside HexagonThreadManager::Signal
, while another thread is writing to semaphores_[1]
inside HexagonThreadManager::CheckSemaphore
. The const methods of std::unordered_map
are safe to run at the same time as other const methods, but aren't safe to run at the same time as non-const methods.
I don't think we need to change anything now, but if we have mystery multi-threading bugs in the future, it may be worth revisiting. The changes that we could make would be as follows:
- Change signature from
void CheckSemaphor(unsigned syncID)
, the function could instead bequrt_sem_t* GetSemaphore(unsigned syncID)
. This way, we don't need the call tosemaphores_[syncID]
insideHexagonThreadManager::Signal
andHexagonThreadManager::Wait
. - Thread-local cache of the map from syncID to
qurt_sem_t*
. The thread-local cache can be checked without a mutex, preserving the lockfree fast path. If the thread-local cache doesn't have the desired semaphore, then a mutex can protect the global semaphore map, to either read from it (if already created on another thread) or write to it (if not already found).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's a good point - thank you! I'll file a task for this.
…afe (apache#13609) Protect CheckSemaphore with mutex. Ensure that only one thread can add a semaphore if it doesn't already exist.
…afe (apache#13609) Protect CheckSemaphore with mutex. Ensure that only one thread can add a semaphore if it doesn't already exist.
Ensure that only one thread can add a semaphore if it doesn't already exist.
cc: @JosephTheOctonaut