Skip to content
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

Merged
merged 2 commits into from
Dec 17, 2022

Conversation

janetsc
Copy link
Collaborator

@janetsc janetsc commented Dec 13, 2022

Ensure that only one thread can add a semaphore if it doesn't already exist.

cc: @JosephTheOctonaut

@tvm-bot
Copy link
Collaborator

tvm-bot commented Dec 13, 2022

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

@janetsc janetsc marked this pull request as ready for review December 13, 2022 22:16
Copy link
Contributor

@csullivan csullivan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks!

@csullivan csullivan merged commit c932777 into apache:main Dec 17, 2022
@janetsc janetsc deleted the check_semaphore branch January 2, 2023 22:06
@@ -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
Copy link
Contributor

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:

  1. Change signature from void CheckSemaphor(unsigned syncID), the function could instead be qurt_sem_t* GetSemaphore(unsigned syncID). This way, we don't need the call to semaphores_[syncID] inside HexagonThreadManager::Signal and HexagonThreadManager::Wait.
  2. 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).

Copy link
Collaborator Author

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.

fzi-peccia pushed a commit to fzi-peccia/tvm that referenced this pull request Mar 27, 2023
…afe (apache#13609)

Protect CheckSemaphore with mutex. Ensure that only one thread can add a semaphore if it doesn't already exist.
mikeseven pushed a commit to mikeseven/tvm that referenced this pull request Sep 27, 2023
…afe (apache#13609)

Protect CheckSemaphore with mutex. Ensure that only one thread can add a semaphore if it doesn't already exist.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants